DrugDesign Data Analysis
Module of the DrugDesign project responsible for loading and pre-processing data from ChEMBL and PubChem
All Classes Namespaces Files Functions Variables Pages
download Namespace Reference

Functions

 DownloadChEMBLCellLines ()
 
 DownloadChEMBLCompounds ()
 
 DownloadChEMBLTargets ()
 
 DownloadPubChemCompoundsToxicity ()
 
 DownloadTargetChEMBLActivities (pd.DataFrame targets_data)
 
 GetCellLineChEMBLActivitiesFromCSV (pd.DataFrame cell_lines_data)
 

Detailed Description

ChEMBL_download_activities/download.py Этот модуль содержит функции для скачивания и обработки данных об активностях, связанных с мишенями и клеточными линиями из базы данных ChEMBL, а также для сохранения молекулярных файлов (molfiles) в формате SDF.
ChEMBL_download_cell_lines/download.py Этот модуль отвечает за скачивание данных о клеточных линиях из базы данных ChEMBL и сохранение их в файлы.
ChEMBL_download_compounds/download.py Этот модуль отвечает за скачивание данных о соединениях из базы данных ChEMBL и их объединение.
ChEMBL_download_targets/download.py Этот модуль отвечает за скачивание информации о мишенях из базы данных ChEMBL, используя конфигурацию из `config.json`.
PubChem_download_toxicity/download.py Этот модуль отвечает за скачивание данных о токсичности соединений из базы данных PubChem и их обработку.

Function Documentation

◆ DownloadChEMBLCellLines()

download.DownloadChEMBLCellLines ( )
Скачивает информацию о клеточных линиях из базы данных ChEMBL на основе конфигурации (`config.json`).
18def DownloadChEMBLCellLines():
19 """
20 Скачивает информацию о клеточных линиях из базы данных ChEMBL на основе
21 конфигурации (`config.json`).
22 """
23
24 # конфигурация для скачивания клеточных линий.
25 cell_lines_config: Config = config["ChEMBL_download_cell_lines"]
26 # конфигурация для скачивания активностей.
27 activities_config: Config = config["ChEMBL_download_activities"]
28
29 v_logger.UpdateFormat(cell_lines_config["logger_label"],
30 cell_lines_config["logger_color"])
31
32 v_logger.info(f"{"" * 10} ChEMBL downloading for DrugDesign.")
33
34 # создаем директорию для сохранения результатов, если она не существует.
35 os.makedirs(cell_lines_config["results_folder_name"], exist_ok=True)
36
37 # если нужно скачивать активности, создаем и для них директорию.
38 if cell_lines_config["download_activities"]:
39 os.makedirs(activities_config["results_folder_name"], exist_ok=True)
40
41 # если установлен флаг тестирования, ограничиваем список id.
42 if config["testing_flag"]:
43 cell_lines_config["id_list"] = ["CHEMBL4295386", "CHEMBL3307781"]
44
45 # если не нужно пропускать скачанные или файл не существует.
46 if not config["skip_downloaded"] or not IsFileInFolder(
47 f"{cell_lines_config["results_file_name"]}.csv",
48 f"{cell_lines_config["results_folder_name"]}"):
49
50 # если нужно скачивать все, очищаем список id (скачаются все).
51 if cell_lines_config["download_all"]:
52 cell_lines_config["id_list"] = []
53
54 DownloadCellLinesFromIdList()
55
56 # если файл уже скачан, пропускаем.
57 else:
58 v_logger.info(
59 f"{cell_lines_config["results_file_name"]} is already "
60 f"downloaded, skip.",
61 LogMode.VERBOSELY)
62
63 v_logger.success(f"{"" * 10} ChEMBL downloading for DrugDesign!")
64 v_logger.info()

◆ DownloadChEMBLCompounds()

download.DownloadChEMBLCompounds ( )
Скачивает информацию о соединениях из базы данных ChEMBL на основе конфигурации (`config.json`).
20def DownloadChEMBLCompounds():
21 """
22 Скачивает информацию о соединениях из базы данных ChEMBL на основе
23 конфигурации (`config.json`).
24 """
25
26 # получаем конфигурацию для скачивания соединений.
27 compounds_config: Config = config["ChEMBL_download_compounds"]
28
29 # проверяем, что если нужно удалять файлы после объединения, то и
30 # объединение должно быть включено.
31 if compounds_config["delete_after_combining"] and \
32 not compounds_config["need_combining"]:
33 raise ValueError(
34 "DownloadChEMBLCompounds: delete_after_combining=True but "
35 "need_combine=False")
36
37 v_logger.UpdateFormat(compounds_config["logger_label"],
38 compounds_config["logger_color"])
39
40 v_logger.info(f"{"" * 10} ChEMBL downloading for DrugDesign.")
41
42 # создаем директорию для результатов, если она не существует.
43 os.makedirs(compounds_config["results_folder_name"], exist_ok=True)
44
45 # если установлен флаг тестирования, ограничиваем диапазоны молекулярных масс.
46 if config["testing_flag"]:
47 compounds_config["mw_ranges"] = [[0, 50], [50, 75]]
48
49 # итерируемся по диапазонам молекулярных масс.
50 for mw_range in compounds_config["mw_ranges"]:
51 less_limit = mw_range[0]
52 greater_limit = mw_range[1]
53
54 # если не нужно пропускать скачанные или файл не существует.
55 if not config["skip_downloaded"] or not IsFileInFolder(
56 f"range_{less_limit}_{greater_limit}_mw_mols.csv",
57 f"{compounds_config["results_folder_name"]}"):
58 # скачиваем соединения для текущего диапазона.
59 DownloadCompoundsByMWRange(
60 less_limit,
61 greater_limit,
62 results_folder_name=compounds_config["results_folder_name"]
63 )
64
65 # если файл уже скачан, пропускаем.
66 else:
67 v_logger.info(
68 f"Molecules with mw in range [{less_limit}, "
69 f"{greater_limit}) is already downloaded, skip.",
70 LogMode.VERBOSELY)
71
72 v_logger.info("-", LogMode.VERBOSELY)
73
74 # если нужно объединять файлы.
75 if compounds_config["need_combining"]:
76 # объединяем CSV файлы в папке.
77 CombineCSVInFolder(compounds_config["results_folder_name"],
78 compounds_config["combined_file_name"])
79
80 # если нужно удалять файлы после объединения и объединение включено.
81 if compounds_config["delete_after_combining"] and \
82 compounds_config["need_combining"]:
83 v_logger.info(
84 f"Deleting files after combining in "
85 f"'{compounds_config["results_folder_name"]}'...")
86
87 # удаляем файлы, кроме объединенного.
88 DeleteFilesInFolder(compounds_config["results_folder_name"], [
89 f"{compounds_config["combined_file_name"]}.csv"])
90
91 v_logger.success(
92 f"Deleting files after combining in "
93 f"'{compounds_config["results_folder_name"]}'!")
94
95 v_logger.success(f"{"" * 10} ChEMBL downloading for DrugDesign!")
96 v_logger.info()

◆ DownloadChEMBLTargets()

download.DownloadChEMBLTargets ( )
Скачиваем информацию о мишенях из базы данных ChEMBL на основе конфигурации (`config.json`).
18def DownloadChEMBLTargets():
19 """
20 Скачиваем информацию о мишенях из базы данных ChEMBL на основе
21 конфигурации (`config.json`).
22 """
23
24 # получаем конфигурацию для скачивания мишеней.
25 targets_config: Config = config["ChEMBL_download_targets"]
26 # получаем конфигурацию для скачивания активностей.
27 activities_config: Config = config["ChEMBL_download_activities"]
28
29 v_logger.UpdateFormat(targets_config["logger_label"],
30 targets_config["logger_color"])
31
32 v_logger.info(f"{"" * 10} ChEMBL downloading for DrugDesign.")
33
34 # создаем директорию для результатов скачивания, если она не существует.
35 os.makedirs(targets_config["results_folder_name"], exist_ok=True)
36
37 # если нужно скачивать активности, создаем директорию для активностей.
38 if targets_config["download_activities"]:
39 os.makedirs(activities_config["results_folder_name"], exist_ok=True)
40
41 # если установлен флаг тестирования, используем ограниченный список id.
42 if config["testing_flag"]:
43 targets_config["id_list"] = ["CHEMBL1951", "CHEMBL2034"]
44
45 # если файлы не скачаны или их нет в папке.
46 if not config["skip_downloaded"] or not IsFileInFolder(
47 targets_config["results_file_name"],
48 targets_config["results_folder_name"]):
49 # если скачиваем все мишени, очищаем список id.
50 if targets_config["download_all"]:
51 targets_config["id_list"] = []
52
53 # скачиваем данные о мишенях.
54 DownloadTargetsFromIdList()
55
56 # если файлы уже скачаны, пропускаем.
57 else:
58 v_logger.info(
59 f"{targets_config["results_file_name"]} is already "
60 f"downloaded, skip",
61 LogMode.VERBOSELY)
62
63 v_logger.info(f"{"" * 10} ChEMBL downloading for DrugDesign!")
64 v_logger.info()

◆ DownloadPubChemCompoundsToxicity()

download.DownloadPubChemCompoundsToxicity ( )
Скачиваем информацию о токсичности соединений из базы данных PubChem на основе конфигурации (`config.json`).
18def DownloadPubChemCompoundsToxicity():
19 """
20 Скачиваем информацию о токсичности соединений из базы данных PubChem на
21 основе конфигурации (`config.json`).
22 """
23
24 # конфигурация для скачивания данных о токсичности.
25 toxicity_config: Config = config["PubChem_download_toxicity"]
26
27 # путь к папке для результатов в единицах "kg".
28 results_folder_kg: str = f"{toxicity_config["results_folder_name"]}/kg"
29 # путь к папке для результатов в единицах "m3".
30 results_folder_m3: str = f"{toxicity_config["results_folder_name"]}/m3"
31
32 # если установлен флаг тестирования, ограничиваем диапазон страниц.
33 if config["testing_flag"]:
34 toxicity_config["start_page"] = 1
35 toxicity_config["end_page"] = 3
36
37 v_logger.UpdateFormat(toxicity_config["logger_label"],
38 toxicity_config["logger_color"])
39
40 v_logger.info(f"{"" * 10} PubChem downloading for DrugDesign.")
41
42 # если файлы не скачаны или их нет в папке.
43 if not config["skip_downloaded"] or\
44 not IsFileInFolder(
45 f"{toxicity_config["combined_file_name"]}_m3.csv",
46 toxicity_config["results_folder_name"]) or\
47 not IsFileInFolder(
48 f"{toxicity_config["combined_file_name"]}_kg.csv",
49 toxicity_config["results_folder_name"]):
50 # итерируемся по страницам (включая последнюю).
51 for page_num in range(toxicity_config["start_page"],
52 toxicity_config["end_page"] + 1):
53 v_logger.info(f"Downloading page_{page_num}...")
54
55 # формируем имя папки для текущей страницы.
56 page_folder_name = f"{toxicity_config["results_folder_name"]}/"\
57 "{unit_type}/page_{page_num}"
58
59 # если существуют папки для следующих страниц, значит, эти полностью загружены.
60 if config["skip_downloaded"] and\
61 (os.path.exists(page_folder_name.format(unit_type="kg",
62 page_num=page_num + 1)) or
63 os.path.exists(page_folder_name.format(unit_type="m3",
64 page_num=page_num + 1))):
65 v_logger.info(f"Folder for page_{page_num} is already exists, skip.")
66 continue
67
68 # создаем директории для единиц измерения "kg" и "m3".
69 os.makedirs(page_folder_name.format(unit_type="kg",
70 page_num=page_num), exist_ok=True)
71 os.makedirs(page_folder_name.format(unit_type="m3",
72 page_num=page_num), exist_ok=True)
73
74 # формируем ссылку для скачивания данных о соединениях.
75 compound_link: str =\
76 "https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/annotations/"\
77 "heading/JSON"\
78 "?heading=Acute+Effects"\
79 f"&page={page_num}"
80
81 # получаем данные с веб-страницы.
82 data = GetResponse(compound_link,
83 False,
84 toxicity_config["sleep_time"]).json()["Annotations"]
85
86 # получаем количество аннотаций на странице.
87 annotation_len = len(data["Annotation"])
88 v_logger.info(f"Amount: {annotation_len}", LogMode.VERBOSELY)
89
90 # определяем границы для объединения файлов по частям.
91 quarters: dict[int, int] = {annotation_len - 1: 100,
92 int(0.75 * annotation_len): 75,
93 int(0.50 * annotation_len): 50,
94 int(0.25 * annotation_len): 25}
95
96 # получаем общее количество страниц.
97 total_pages = int(data["TotalPages"])
98
99 # проверяем, что номер текущей страницы не превышает общее количество.
100 if page_num > total_pages:
101 v_logger.LogException(IndexError(
102 f"Invalid page index: '{page_num}'! Should be: 1 < 'page' < "
103 f"{total_pages}"))
104 continue
105
106 # итерируемся по данным о соединениях.
107 for i, compound_data in enumerate(data["Annotation"]):
108 # фиксируем время начала обработки.
109 start_time = time.time()
110
111 # скачиваем данные о токсичности соединения.
112 DownloadCompoundToxicity(compound_data,
113 f"{toxicity_config["results_folder_name"]}/"
114 "{unit_type}/"f"page_{page_num}")
115
116 # фиксируем время окончания обработки.
117 end_time = time.time()
118
119 # если включен флаг тестирования, выводим время обработки.
120 if config["testing_flag"]:
121 v_logger.info(
122 f"Prev compound: {i}, time: {(end_time - start_time):.3f}"
123 f" sec.",
124 LogMode.VERBOSELY)
125
126 # если достигнута граница для объединения файлов.
127 if i in quarters.keys() and toxicity_config["need_combining"]:
128 # получаем номер текущей границы.
129 quarter = quarters[i]
130
131 v_logger.info(f"Quarter: {quarter}%, combining files in "
132 f"page_{page_num} folder...")
133
134 # объединяем CSV-файлы для единиц измерения "kg".
135 CombineCSVInFolder(page_folder_name.format(unit_type="kg",
136 page_num=page_num),
137 f"{toxicity_config["results_file_name"]}_"
138 f"{quarters[i]}_page_{page_num}")
139
140 # объединяем CSV-файлы для единиц измерения "m3".
141 CombineCSVInFolder(page_folder_name.format(unit_type="m3",
142 page_num=page_num),
143 f"{toxicity_config["results_file_name"]}_"
144 f"{quarters[i]}_page_{page_num}")
145
146 v_logger.success(f"Quarter: {quarter}%, combining files in "
147 f"page_{page_num} folder!")
148
149 # перемещаем объединенные файлы.
150 v_logger.info(
151 f"Moving {toxicity_config["results_file_name"]}_"
152 f"{quarters[i]}_page_{page_num}.csv to "
153 f"{toxicity_config["results_folder_name"]}...",
154 LogMode.VERBOSELY)
155
156 # формируем имя файла для перемещения.
157 quarter_file_name = f"{toxicity_config["results_file_name"]}_"\
158 f"{quarters[i]}_page_{page_num}.csv"
159
160 # перемещаем файл для единиц измерения "kg".
161 MoveFileToFolder(quarter_file_name,
162 page_folder_name.format(unit_type="kg",
163 page_num=page_num),
164 results_folder_kg)
165
166 # перемещаем файл для единиц измерения "m3".
167 MoveFileToFolder(quarter_file_name,
168 page_folder_name.format(unit_type="m3",
169 page_num=page_num),
170 results_folder_m3)
171
172 v_logger.success(
173 f"Moving {quarter_file_name} to "
174 f"{toxicity_config["results_folder_name"]}!",
175 LogMode.VERBOSELY)
176
177 # удаляем предыдущий объединенный файл.
178 prev_quarter = quarter - 25
179
180 # если предыдущая часть не равна нулю.
181 if prev_quarter != 0:
182 # формируем имя предыдущего файла.
183 old_quarter_file_name: str =\
184 f"{toxicity_config["results_file_name"]}_"\
185 f"{prev_quarter}_page_{page_num}"
186
187 v_logger.info("Deleting old quarter file...",
188 LogMode.VERBOSELY)
189
190 # удаляем старый файл для единиц измерения "kg".
191 if os.path.exists(os.path.join(results_folder_kg,
192 f"{old_quarter_file_name}.csv")):
193 os.remove(os.path.join(
194 results_folder_kg,
195 f"{old_quarter_file_name}.csv"))
196
197 # удаляем старый файл для единиц измерения "m3".
198 if os.path.exists(os.path.join(results_folder_m3,
199 f"{old_quarter_file_name}.csv")):
200 os.remove(os.path.join(
201 results_folder_m3,
202 f"{old_quarter_file_name}.csv"))
203
204 v_logger.success("Deleting old quarter file!",
205 LogMode.VERBOSELY)
206
207 if toxicity_config["need_combining"]:
208 # объединяем все CSV-файлы в папке для единиц измерения "kg".
209 CombineCSVInFolder(results_folder_kg,
210 f"{toxicity_config["combined_file_name"]}_kg")
211
212 # перемещаем объединенный файл в основную папку.
213 MoveFileToFolder(f"{toxicity_config["combined_file_name"]}_kg.csv",
214 results_folder_kg,
215 toxicity_config["results_folder_name"])
216
217 # объединяем все CSV-файлы в папке для единиц измерения "m3".
218 CombineCSVInFolder(results_folder_m3,
219 f"{toxicity_config["combined_file_name"]}_m3")
220
221 # перемещаем объединенный файл в основную папку.
222 MoveFileToFolder(f"{toxicity_config["combined_file_name"]}_m3.csv",
223 results_folder_m3,
224 toxicity_config["results_folder_name"])
225
226 # если включено удаление файлов после объединения и объединение включено.
227 if toxicity_config["delete_after_combining"] and \
228 toxicity_config["need_combining"]:
229 v_logger.info(
230 f"Deleting files after combining in "
231 f"'{toxicity_config["results_folder_name"]}'...",
232 LogMode.VERBOSELY)
233
234 # определяем файлы, которые не нужно удалять.
235 except_items: list[str] = [
236 f"{toxicity_config["combined_file_name"]}_kg.csv",
237 f"{toxicity_config["combined_file_name"]}_m3.csv"]
238 # получаем имя папки с molfile.
239 molfiles_folder_name: str = toxicity_config["molfiles_folder_name"]
240
241 # проверяем, что molfiles_folder_name находится внутри results_folder_name.
242 if toxicity_config["results_folder_name"] in molfiles_folder_name:
243 except_items.append(molfiles_folder_name.replace(
244 toxicity_config["results_folder_name"], "").split("/")[1])
245
246 # удаляем все файлы, кроме указанных в списке except_items.
247 DeleteFilesInFolder(toxicity_config["results_folder_name"],
248 except_items,
249 delete_folders=True)
250
251 v_logger.success(
252 f"Deleting files after combining in "
253 f"'{toxicity_config["results_folder_name"]}'!",
254 LogMode.VERBOSELY)
255
256 # если файлы уже скачаны, пропускаем.
257 else:
258 v_logger.info(
259 f"{toxicity_config["results_file_name"]} is already "
260 f"downloaded, skip.",
261 LogMode.VERBOSELY)
262
263 if toxicity_config["filtering"]["need_filtering_by_characteristics"]:
264 v_logger.info("·", LogMode.VERBOSELY)
265
266 FilterDownloadedToxicityByCharacteristics("m3",
267 "organism",
268 "time_period",
269 "testtype")
270
271 v_logger.info()
272
273 FilterDownloadedToxicityByCharacteristics("kg",
274 "organism",
275 "route",
276 "testtype")
277
278 v_logger.success(f"{"" * 10} PubChem downloading for DrugDesign!")
279 v_logger.info()

◆ DownloadTargetChEMBLActivities()

download.DownloadTargetChEMBLActivities ( pd.DataFrame targets_data)
Скачивает информацию об активностях (IC50 и Ki), связанных с заданными мишенями, из базы данных ChEMBL и сохраняет их в CSV-файлы. Также, при необходимости, скачивает соответствующие molfiles в формате SDF. Args: targets_data (pd.DataFrame): DataFrame, содержащий информацию о мишенях, включая 'target_chembl_id'.
21def DownloadTargetChEMBLActivities(targets_data: pd.DataFrame):
22 """
23 Скачивает информацию об активностях (IC50 и Ki), связанных с заданными мишенями,
24 из базы данных ChEMBL и сохраняет их в CSV-файлы.
25
26 Также, при необходимости, скачивает соответствующие molfiles в формате SDF.
27
28 Args:
29 targets_data (pd.DataFrame): DataFrame, содержащий информацию о мишенях,
30 включая 'target_chembl_id'.
31 """
32
33 # конфигурация для скачивания активностей.
34 activities_config: Config = config["ChEMBL_download_activities"]
35 # конфигурация для скачивания соединений.
36 compounds_config: Config = config["ChEMBL_download_compounds"]
37
38 v_logger.UpdateFormat(activities_config["logger_label"],
39 activities_config["logger_color"])
40
41 v_logger.info("Start download activities connected with targets...")
42 v_logger.info("-", LogMode.VERBOSELY)
43
44 # итерируемся по идентификаторам мишеней.
45 for target_id in targets_data['target_chembl_id']:
46 file_name_ic50: str = f"{target_id}_IC50_activities"
47 file_name_ki: str = f"{target_id}_Ki_activities"
48
49 # нужно ли пропускать скачивание, если файлы уже существуют.
50 if config["skip_downloaded"] \
51 and IsFileInFolder(f"{file_name_ic50}.csv",
52 activities_config["results_folder_name"]) \
53 and IsFileInFolder(f"{file_name_ki}.csv",
54 activities_config["results_folder_name"]):
55
56 v_logger.info("Activities connected with target "
57 f"{target_id} is already downloaded, skip.",
58 LogMode.VERBOSELY)
59 v_logger.info("-", LogMode.VERBOSELY)
60
61 continue # переходим к следующей мишени.
62
63 v_logger.info(f"Downloading activities connected with {target_id}...",
64 LogMode.VERBOSELY)
65
66 # активности IC50 для мишени.
67 activities_ic50: QuerySet = QuerySetActivitiesByIC50(target_id)
68 # активности Ki для мишени.
69 activities_ki: QuerySet = QuerySetActivitiesByKi(target_id)
70
71 v_logger.info("Amount: IC50: "
72 f"{len(activities_ic50)};" # type: ignore
73 " Ki: "
74 f"{len(activities_ki)}.", LogMode.VERBOSELY) # type: ignore
75 v_logger.success(f"Downloading activities connected with {target_id}!",
76 LogMode.VERBOSELY)
77 v_logger.info("Collecting activities to pandas.DataFrame...",
78 LogMode.VERBOSELY)
79
80 # очищаем DataFrame с активностями IC50.
81 data_frame_ic50 = CleanedTargetActivitiesDF(
82 pd.DataFrame(activities_ic50), # type: ignore
83 target_id=target_id,
84 activities_type="IC50")
85
86 # очищаем DataFrame с активностями Ki.
87 data_frame_ki = CleanedTargetActivitiesDF(
88 pd.DataFrame(activities_ki), # type: ignore
89 target_id=target_id,
90 activities_type="Ki")
91
92 v_logger.success("Collecting activities to pandas.DataFrame!",
93 LogMode.VERBOSELY)
94 v_logger.info(
95 "Recording new values 'IC50', 'Ki' in targets DataFrame...",
96 LogMode.VERBOSELY)
97
98 # записываем количество активностей IC50 и Ki в DataFrame с данными о мишенях.
99 targets_data.loc[targets_data["target_chembl_id"] == target_id, "IC50_new"] =\
100 len(data_frame_ic50)
101
102 targets_data.loc[targets_data["target_chembl_id"] == target_id, "Ki_new"] =\
103 len(data_frame_ki)
104
105 v_logger.info("Amount: IC50: "
106 f"{len(data_frame_ic50)};"
107 " Ki: "
108 f"{len(data_frame_ki)}.", LogMode.VERBOSELY)
109 v_logger.success(
110 "Recording new values 'IC50', 'Ki' in targets DataFrame!",
111 LogMode.VERBOSELY)
112 v_logger.info(
113 "Collecting activities to .csv file in "
114 f"'{activities_config["results_folder_name"]}'...",
115 LogMode.VERBOSELY)
116
117 # полное имя файла для IC50.
118 full_file_name_ic50: str = f"{activities_config["results_folder_name"]}/"\
119 f"{file_name_ic50}.csv"
120 # полное имя файла для Ki.
121 full_file_name_ki: str = f"{activities_config["results_folder_name"]}/"\
122 f"{file_name_ki}.csv"
123
124 # сохраняем DataFrame с активностями IC50 в CSV.
125 data_frame_ic50.to_csv(full_file_name_ic50, sep=";", index=False)
126 # сохраняем DataFrame с активностями Ki в CSV.
127 data_frame_ki.to_csv(full_file_name_ki, sep=";", index=False)
128
129 v_logger.success(
130 "Collecting activities to .csv file in "
131 f"'{activities_config["results_folder_name"]}'!",
132 LogMode.VERBOSELY)
133
134 # включена опция скачивания molfiles.
135 if activities_config["download_compounds_sdf"]:
136 # обновляем формат логгера.
137 v_logger.UpdateFormat(compounds_config["logger_label"],
138 compounds_config["logger_color"])
139
140 v_logger.info(
141 f"Start download molfiles connected with {target_id} to .sdf...",
142 LogMode.VERBOSELY)
143
144 # создаем директорию для molfiles, если она не существует.
145 os.makedirs(compounds_config["molfiles_folder_name"], exist_ok=True)
146
147 v_logger.info("Saving connected with IC50 molfiles...",
148 LogMode.VERBOSELY)
149
150 # сохраняем molfiles, связанные с активностями IC50 в SDF.
151 SaveChEMBLMolfilesToSDFByIdList(
152 data_frame_ic50['molecule_chembl_id'].tolist(),
153 f"{compounds_config["molfiles_folder_name"]}/{file_name_ic50}_molfiles",
154 extra_data=data_frame_ic50)
155
156 v_logger.success("Saving connected with IC50 molfiles!",
157 LogMode.VERBOSELY)
158 v_logger.info("Saving connected with Ki molfiles...",
159 LogMode.VERBOSELY)
160
161 # сохраняем molfiles, связанные с активностями Ki в SDF.
162 SaveChEMBLMolfilesToSDFByIdList(
163 data_frame_ki['molecule_chembl_id'].tolist(),
164 f"{compounds_config["molfiles_folder_name"]}/{file_name_ki}_molfiles",
165 extra_data=data_frame_ki)
166
167 v_logger.success("Saving connected with Ki molfiles!", LogMode.VERBOSELY)
168 v_logger.success(
169 f"End download molfiles connected with {target_id} to .sdf!",
170 LogMode.VERBOSELY)
171
172 # восстанавливаем формат логгера.
173 v_logger.UpdateFormat(activities_config["logger_label"],
174 activities_config["logger_color"])
175
176 v_logger.info("-", LogMode.VERBOSELY)
177
178 v_logger.success("End download activities connected with targets!")
179
180
181@IgnoreWarnings
182@ReTry(attempts_amount=1)

◆ GetCellLineChEMBLActivitiesFromCSV()

download.GetCellLineChEMBLActivitiesFromCSV ( pd.DataFrame cell_lines_data)
"Скачивает" (получает) информацию об активностях (IC50 и GI50), связанных с заданными клеточными линиями, из CSV-файлов, расположенных в директории, указанной в конфигурации. Также, при необходимости, скачивает соответствующие molfiles в формате SDF. Важно: В данном случае "скачивание" подразумевает чтение данных из локальных CSV-файлов, а не загрузку из ChEMBL API. Args: cell_lines_data (pd.DataFrame): DataFrame, содержащий информацию о клеточных линиях, включая 'cell_chembl_id'.
183def GetCellLineChEMBLActivitiesFromCSV(cell_lines_data: pd.DataFrame):
184 """
185 "Скачивает" (получает) информацию об активностях (IC50 и GI50), связанных с
186 заданными клеточными линиями, из CSV-файлов, расположенных в директории,
187 указанной в конфигурации. Также, при необходимости, скачивает
188 соответствующие molfiles в формате SDF.
189
190 Важно:
191 В данном случае "скачивание" подразумевает чтение данных из локальных
192 CSV-файлов, а не загрузку из ChEMBL API.
193
194 Args:
195 cell_lines_data (pd.DataFrame): DataFrame, содержащий информацию
196 о клеточных линиях, включая 'cell_chembl_id'.
197 """
198
199 # конфигурация для активностей.
200 activities_config: Config = config["ChEMBL_download_activities"]
201 # конфигурация для клеточных линий.
202 cell_lines_config: Config = config["ChEMBL_download_cell_lines"]
203 # конфигурация для соединений.
204 compounds_config: Config = config["ChEMBL_download_compounds"]
205
206 # сохраняем текущий индекс формата логгера.
207 restore_index: int = v_logger.UpdateFormat(activities_config["logger_label"],
208 activities_config["logger_color"]) - 1
209
210 v_logger.info("Start getting activities connected with cell_lines...")
211 v_logger.info("-", LogMode.VERBOSELY)
212
213 # итерируемся по идентификаторам клеточных линий.
214 for cell_id in cell_lines_data['cell_chembl_id']:
215 file_name_ic50: str = f"{cell_id}_IC50_activities"
216 file_name_gi50: str = f"{cell_id}_GI50_activities"
217
218 # нужно ли пропускать загрузку, если файлы уже существуют.
219 if config["skip_downloaded"] \
220 and IsFileInFolder(f"{file_name_ic50}.csv",
221 activities_config["results_folder_name"]) \
222 and IsFileInFolder(f"{file_name_gi50}.csv",
223 activities_config["results_folder_name"]):
224
225 v_logger.info("Activities connected with target "
226 f"{cell_id} is already gotten, skip", LogMode.VERBOSELY)
227 v_logger.info("-", LogMode.VERBOSELY)
228
229 continue # переходим к следующей клеточной линии.
230
231 v_logger.info(
232 f"Getting activities connected with {cell_id}...", LogMode.VERBOSELY)
233
234 # читаем данные об активностях IC50 и GI50 из CSV-файлов.
235 data_frame_ic50 = pd.read_csv(
236 f"{cell_lines_config["raw_csv_folder_name"]}/{file_name_ic50}.csv",
237 sep=config["csv_separator"], low_memory=False)
238
239 data_frame_gi50 = pd.read_csv(
240 f"{cell_lines_config["raw_csv_folder_name"]}/{file_name_gi50}.csv",
241 sep=config["csv_separator"], low_memory=False)
242
243 v_logger.info("Amount: "
244 f"IC50: {len(data_frame_ic50)}; "
245 f"GI50: {len(data_frame_gi50)}.", LogMode.VERBOSELY)
246
247 v_logger.success(f"Getting activities connected with {cell_id}!",
248 LogMode.VERBOSELY)
249 v_logger.info("Cleaning activities...", LogMode.VERBOSELY)
250
251 # очищаем DataFrames с активностями IC50 и GI50.
252 data_frame_ic50 = CleanedCellLineActivitiesDF(data_frame_ic50,
253 cell_id=cell_id,
254 activities_type="IC50")
255
256 data_frame_gi50 = CleanedCellLineActivitiesDF(data_frame_gi50,
257 cell_id=cell_id,
258 activities_type="GI50")
259
260 v_logger.success(
261 "Collecting activities to pandas.DataFrame!", LogMode.VERBOSELY)
262 v_logger.info(
263 "Recording new values 'IC50', 'GI50' in targets DataFrame...",
264 LogMode.VERBOSELY)
265
266 # записываем количество активностей IC50 и GI50 в DataFrame.
267 cell_lines_data.loc[
268 cell_lines_data["cell_chembl_id"] == cell_id, "IC50_new"] =\
269 len(data_frame_ic50)
270
271 cell_lines_data.loc[
272 cell_lines_data["cell_chembl_id"] == cell_id, "GI50_new"] =\
273 len(data_frame_gi50)
274
275 v_logger.info("Amount: "
276 f"IC50: {len(data_frame_ic50)}; "
277 f"GI50: {len(data_frame_gi50)}.", LogMode.VERBOSELY)
278 v_logger.success(
279 "Recording new values 'IC50', 'GI50' in targets DataFrame!",
280 LogMode.VERBOSELY)
281 v_logger.info(
282 f"Collecting activities to .csv file in '"
283 f"{activities_config["results_folder_name"]}'...", LogMode.VERBOSELY)
284
285 # формируем полное имя файла для IC50.
286 full_file_name_ic50: str = f"{activities_config["results_folder_name"]}/"\
287 f"{file_name_ic50}.csv"
288 # формируем полное имя файла для GI50.
289 full_file_name_gi50: str = f"{activities_config["results_folder_name"]}/"\
290 f"{file_name_gi50}.csv"
291
292 # сохраняем DataFrame с активностями IC50 в CSV.
293 data_frame_ic50.to_csv(full_file_name_ic50, sep=";", index=False)
294 # сохраняем DataFrame с активностями GI50 в CSV.
295 data_frame_gi50.to_csv(full_file_name_gi50, sep=";", index=False)
296
297 v_logger.success(
298 f"Collecting activities to .csv file in "
299 f"'{activities_config["results_folder_name"]}'!", LogMode.VERBOSELY)
300
301 # включена опция скачивания molfiles.
302 if activities_config["download_compounds_sdf"]:
303 # обновляем формат логгера.
304 v_logger.UpdateFormat(compounds_config["logger_label"],
305 compounds_config["logger_color"])
306
307 v_logger.info(
308 f"Start download molfiles connected with {cell_id} to .sdf...",
309 LogMode.VERBOSELY)
310
311 # создаем директорию для molfiles, если она не существует.
312 os.makedirs(compounds_config["molfiles_folder_name"], exist_ok=True)
313
314 v_logger.info("Saving connected with IC50 molfiles...",
315 LogMode.VERBOSELY)
316
317 # сохраняем molfiles, связанные с активностями IC50 в SDF.
318 SaveChEMBLMolfilesToSDFByIdList(
319 data_frame_ic50['molecule_chembl_id'].tolist(),
320 f"{compounds_config["molfiles_folder_name"]}/{file_name_ic50}_molfiles",
321 extra_data=data_frame_ic50)
322
323 v_logger.success("Saving connected with IC50 molfiles!",
324 LogMode.VERBOSELY)
325 v_logger.info("Saving connected with GI50 molfiles...",
326 LogMode.VERBOSELY)
327
328 # сохраняем molfiles, связанные с активностями GI50 в SDF.
329 SaveChEMBLMolfilesToSDFByIdList(
330 data_frame_gi50['molecule_chembl_id'].tolist(),
331 f"{compounds_config["molfiles_folder_name"]}/{file_name_gi50}_molfiles",
332 extra_data=data_frame_gi50)
333
334 v_logger.success(
335 "Saving connected with GI50 molfiles!", LogMode.VERBOSELY)
336 v_logger.success(
337 f"End download molfiles connected with {cell_id} to .sdf!",
338 LogMode.VERBOSELY)
339
340 # восстанавливаем формат логгера.
341 v_logger.UpdateFormat(activities_config["logger_label"],
342 activities_config["logger_color"])
343
344 v_logger.info("-", LogMode.VERBOSELY)
345
346 v_logger.success("End getting activities connected with cell_lines!")
347
348 # восстанавливаем исходный формат логгера.
349 v_logger.RestoreFormat(restore_index)