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

◆ DownloadChEMBLCompounds()

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

◆ DownloadChEMBLTargets()

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

◆ DownloadPubChemCompoundsToxicity()

download.DownloadPubChemCompoundsToxicity ( )
Скачиваем информацию о токсичности соединений из базы данных PubChem на основе конфигурации (`config.json`).
24def DownloadPubChemCompoundsToxicity():
25 """
26 Скачиваем информацию о токсичности соединений из базы данных PubChem на
27 основе конфигурации (`config.json`).
28 """
29
30 # путь к папке для результатов в единицах "kg".
31 results_folder_kg: str = f"{toxicity_config['results_folder_name']}/kg"
32 # путь к папке для результатов в единицах "m3".
33 results_folder_m3: str = f"{toxicity_config['results_folder_name']}/m3"
34
35 # если установлен флаг тестирования, ограничиваем диапазон страниц.
36 if config["testing_flag"]:
37 toxicity_config["start_page"] = 1
38 toxicity_config["end_page"] = 3
39
40 v_logger.UpdateFormat(toxicity_config["logger_label"], toxicity_config["logger_color"])
41
42 v_logger.info(f"{'• ' * 10} PubChem downloading for DrugDesign.")
43
44 # если файлы не скачаны или их нет в папке.
45 if (
46 not config["skip_downloaded"]
47 or not IsFileInFolder(
48 f"{toxicity_config['combined_file_name']}_m3.csv",
49 toxicity_config["results_folder_name"],
50 )
51 or not IsFileInFolder(
52 f"{toxicity_config['combined_file_name']}_kg.csv",
53 toxicity_config["results_folder_name"],
54 )
55 ):
56 # итерируемся по страницам (включая последнюю).
57 for page_num in range(toxicity_config["start_page"], toxicity_config["end_page"] + 1):
58 v_logger.info(f"Downloading page_{page_num}...")
59
60 # формируем имя папки для текущей страницы.
61 page_folder_name = (
62 f"{toxicity_config['results_folder_name']}/{{unit_type}}/page_{{page_num}}"
63 )
64
65 # если существуют папки для следующих страниц, значит, эти полностью загружены.
66 if config["skip_downloaded"] and (
67 os.path.exists(page_folder_name.format(unit_type="kg", page_num=page_num + 1))
68 or os.path.exists(page_folder_name.format(unit_type="m3", page_num=page_num + 1))
69 ):
70 v_logger.info(f"Folder for page_{page_num} is already exists, skip.")
71 continue
72
73 # если существуют на 100% завершенные файлы страниц.
74 if config["skip_downloaded"]:
75 full_quarter_file_name: str = (
76 f"{toxicity_config['results_file_name']}_100_page_{page_num}"
77 )
78
79 full_quarter_path = (
80 f"{toxicity_config['results_folder_name']}/"
81 "{unit_type}/"
82 f"{full_quarter_file_name}.csv"
83 )
84
85 if os.path.exists(full_quarter_path.format(unit_type="kg")) or os.path.exists(
86 full_quarter_path.format(unit_type="m3")
87 ):
88 v_logger.info(f"100 quarter file for page_{page_num} is already exists, skip.")
89 continue
90
91 # создаем директории для единиц измерения "kg" и "m3".
92 os.makedirs(
93 page_folder_name.format(unit_type="kg", page_num=page_num), exist_ok=True
94 )
95 os.makedirs(
96 page_folder_name.format(unit_type="m3", page_num=page_num), exist_ok=True
97 )
98
99 # формируем ссылку для скачивания данных о соединениях.
100 compound_link: str = (
101 "https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/annotations/"
102 "heading/JSON"
103 "?heading=Acute+Effects"
104 f"&page={page_num}"
105 )
106
107 # получаем данные с веб-страницы.
108 data = GetResponse(compound_link, False, toxicity_config["sleep_time"]).json()[
109 "Annotations"
110 ]
111
112 # получаем количество аннотаций на странице.
113 annotation_len = len(data["Annotation"])
114 v_logger.info(f"Amount: {annotation_len}", LogMode.VERBOSELY)
115
116 # определяем границы для объединения файлов по частям.
117 quarters: dict[int, int] = {
118 annotation_len - 1: 100,
119 int(0.75 * annotation_len): 75,
120 int(0.50 * annotation_len): 50,
121 int(0.25 * annotation_len): 25,
122 }
123
124 # получаем общее количество страниц.
125 total_pages = int(data["TotalPages"])
126
127 # проверяем, что номер текущей страницы не превышает общее количество.
128 if page_num > total_pages:
129 v_logger.LogException(
130 IndexError(
131 f"Invalid page index: '{page_num}'! Should be: 1 < 'page' < {total_pages}"
132 )
133 )
134 continue
135
136 # итерируемся по данным о соединениях.
137 for i, compound_data in enumerate(data["Annotation"]):
138 # фиксируем время начала обработки.
139 start_time = time.time()
140
141 # скачиваем данные о токсичности соединения.
142 DownloadCompoundToxicity(
143 compound_data,
144 f"{toxicity_config['results_folder_name']}/{{unit_type}}/page_{page_num}",
145 )
146
147 # фиксируем время окончания обработки.
148 end_time = time.time()
149
150 # если включен флаг тестирования, выводим время обработки.
151 if config["testing_flag"]:
152 v_logger.info(
153 f"Prev compound: {i}, time: {(end_time - start_time):.3f} sec.",
154 LogMode.VERBOSELY,
155 )
156
157 # если достигнута граница для объединения файлов.
158 if i in quarters.keys() and toxicity_config["need_combining"]:
159 # получаем номер текущей границы.
160 quarter = quarters[i]
161
162 v_logger.info(
163 f"Quarter: {quarter}%, combining files in page_{page_num} folder..."
164 )
165
166 # объединяем CSV-файлы для единиц измерения "kg".
167 CombineCSVInFolder(
168 page_folder_name.format(unit_type="kg", page_num=page_num),
169 f"{toxicity_config['results_file_name']}_{quarters[i]}_page_{page_num}",
170 )
171
172 # объединяем CSV-файлы для единиц измерения "m3".
173 CombineCSVInFolder(
174 page_folder_name.format(unit_type="m3", page_num=page_num),
175 f"{toxicity_config['results_file_name']}_{quarters[i]}_page_{page_num}",
176 )
177
178 v_logger.success(
179 f"Quarter: {quarter}%, combining files in page_{page_num} folder!"
180 )
181
182 # перемещаем объединенные файлы.
183 v_logger.info(
184 f"Moving {toxicity_config['results_file_name']}_"
185 f"{quarters[i]}_page_{page_num}.csv to "
186 f"{toxicity_config['results_folder_name']}...",
187 LogMode.VERBOSELY,
188 )
189
190 # формируем имя файла для перемещения.
191 quarter_file_name = (
192 f"{toxicity_config['results_file_name']}_{quarters[i]}_page_{page_num}.csv"
193 )
194
195 # перемещаем файл для единиц измерения "kg".
196 MoveFileToFolder(
197 quarter_file_name,
198 page_folder_name.format(unit_type="kg", page_num=page_num),
199 results_folder_kg,
200 )
201
202 # перемещаем файл для единиц измерения "m3".
203 MoveFileToFolder(
204 quarter_file_name,
205 page_folder_name.format(unit_type="m3", page_num=page_num),
206 results_folder_m3,
207 )
208
209 v_logger.success(
210 f"Moving {quarter_file_name} to {toxicity_config['results_folder_name']}!",
211 LogMode.VERBOSELY,
212 )
213
214 # удаляем предыдущий объединенный файл.
215 prev_quarter = quarter - 25
216
217 # если предыдущая часть не равна нулю.
218 if prev_quarter != 0:
219 # формируем имя предыдущего файла.
220 old_quarter_file_name: str = (
221 f"{toxicity_config['results_file_name']}_{prev_quarter}_page_{page_num}"
222 )
223
224 v_logger.info("Deleting old quarter file...", LogMode.VERBOSELY)
225
226 # удаляем старый файл для единиц измерения "kg".
227 if os.path.exists(
228 os.path.join(results_folder_kg, f"{old_quarter_file_name}.csv")
229 ):
230 os.remove(os.path.join(results_folder_kg, f"{old_quarter_file_name}.csv"))
231
232 # удаляем старый файл для единиц измерения "m3".
233 if os.path.exists(
234 os.path.join(results_folder_m3, f"{old_quarter_file_name}.csv")
235 ):
236 os.remove(os.path.join(results_folder_m3, f"{old_quarter_file_name}.csv"))
237
238 v_logger.success("Deleting old quarter file!", LogMode.VERBOSELY)
239
240 if toxicity_config["need_combining"]:
241 # объединяем все CSV-файлы в папке для единиц измерения "kg".
242 CombineCSVInFolder(results_folder_kg, f"{toxicity_config['combined_file_name']}_kg")
243
244 # перемещаем объединенный файл в основную папку.
245 MoveFileToFolder(
246 f"{toxicity_config['combined_file_name']}_kg.csv",
247 results_folder_kg,
248 toxicity_config["results_folder_name"],
249 )
250
251 # объединяем все CSV-файлы в папке для единиц измерения "m3".
252 CombineCSVInFolder(results_folder_m3, f"{toxicity_config['combined_file_name']}_m3")
253
254 # перемещаем объединенный файл в основную папку.
255 MoveFileToFolder(
256 f"{toxicity_config['combined_file_name']}_m3.csv",
257 results_folder_m3,
258 toxicity_config["results_folder_name"],
259 )
260
261 # если включено удаление файлов после объединения и объединение включено.
262 if toxicity_config["delete_after_combining"] and toxicity_config["need_combining"]:
263 v_logger.info(
264 f"Deleting files after combining in "
265 f"'{toxicity_config['results_folder_name']}'...",
266 LogMode.VERBOSELY,
267 )
268
269 # определяем файлы, которые не нужно удалять.
270 except_items: list[str] = [
271 f"{toxicity_config['combined_file_name']}_kg.csv",
272 f"{toxicity_config['combined_file_name']}_m3.csv",
273 ]
274 # получаем имя папки с molfile.
275 molfiles_folder_name: str = toxicity_config["molfiles_folder_name"]
276
277 # проверяем, что molfiles_folder_name находится внутри results_folder_name.
278 if toxicity_config["results_folder_name"] in molfiles_folder_name:
279 except_items.append(
280 molfiles_folder_name.replace(toxicity_config["results_folder_name"], "").split(
281 "/"
282 )[1]
283 )
284
285 # удаляем все файлы, кроме указанных в списке except_items.
286 DeleteFilesInFolder(
287 toxicity_config["results_folder_name"], except_items, delete_folders=True
288 )
289
290 v_logger.success(
291 f"Deleting files after combining in '{toxicity_config['results_folder_name']}'!",
292 LogMode.VERBOSELY,
293 )
294
295 # если файлы уже скачаны, пропускаем.
296 else:
297 v_logger.info(
298 f"{toxicity_config['results_file_name']} is already downloaded, skip.",
299 LogMode.VERBOSELY,
300 )
301
302 if filtering_config["need_filtering_by_characteristics"]:
303 v_logger.info("·", LogMode.VERBOSELY)
304
305 FilterDownloadedToxicityByCharacteristics(
306 "m3", "organism", "route", "time_period", "testtype"
307 )
308
309 v_logger.info()
310
311 FilterDownloadedToxicityByCharacteristics(
312 "kg", "organism", "route", "time_period", "testtype"
313 )
314
315 v_logger.success(f"{'• ' * 10} PubChem downloading for DrugDesign!")
316 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'.
19def DownloadTargetChEMBLActivities(targets_data: pd.DataFrame):
20 """
21 Скачивает информацию об активностях (IC50 и Ki), связанных с заданными мишенями,
22 из базы данных ChEMBL и сохраняет их в CSV-файлы.
23
24 Также, при необходимости, скачивает соответствующие molfiles в формате SDF.
25
26 Args:
27 targets_data (pd.DataFrame): DataFrame, содержащий информацию о мишенях,
28 включая 'target_chembl_id'.
29 """
30
31 # конфигурация для скачивания активностей.
32 activities_config: Config = config["ChEMBL_download_activities"]
33 # конфигурация для скачивания соединений.
34 compounds_config: Config = config["ChEMBL_download_compounds"]
35
36 v_logger.UpdateFormat(
37 activities_config["logger_label"], activities_config["logger_color"]
38 )
39
40 v_logger.info("Start download activities connected with targets...")
41 v_logger.info("-", LogMode.VERBOSELY)
42
43 # итерируемся по идентификаторам мишеней.
44 for target_id in targets_data["target_chembl_id"]:
45 file_name_ic50: str = f"{target_id}_IC50_activities"
46 file_name_ki: str = f"{target_id}_Ki_activities"
47
48 # нужно ли пропускать скачивание, если файлы уже существуют.
49 if (
50 config["skip_downloaded"]
51 and IsFileInFolder(
52 f"{file_name_ic50}.csv", activities_config["results_folder_name"]
53 )
54 and IsFileInFolder(f"{file_name_ki}.csv", activities_config["results_folder_name"])
55 ):
56 v_logger.info(
57 f"Activities connected with target {target_id} is already downloaded, skip.",
58 LogMode.VERBOSELY,
59 )
60 v_logger.info("-", LogMode.VERBOSELY)
61
62 continue # переходим к следующей мишени.
63
64 v_logger.info(
65 f"Downloading activities connected with {target_id}...", LogMode.VERBOSELY
66 )
67
68 # активности IC50 для мишени.
69 activities_ic50: QuerySet = QuerySetActivitiesByIC50(target_id)
70 # активности Ki для мишени.
71 activities_ki: QuerySet = QuerySetActivitiesByKi(target_id)
72
73 v_logger.info(
74 "Amount: IC50: "
75 f"{len(activities_ic50)};" # type: ignore
76 " Ki: "
77 f"{len(activities_ki)}.", # type: ignore
78 LogMode.VERBOSELY,
79 )
80 v_logger.success(
81 f"Downloading activities connected with {target_id}!", LogMode.VERBOSELY
82 )
83 v_logger.info("Collecting activities to pandas.DataFrame...", LogMode.VERBOSELY)
84
85 # очищаем DataFrame с активностями IC50.
86 data_frame_ic50 = CleanedTargetActivitiesDF(
87 pd.DataFrame(activities_ic50), # type: ignore
88 target_id=target_id,
89 activities_type="IC50",
90 )
91
92 # очищаем DataFrame с активностями Ki.
93 data_frame_ki = CleanedTargetActivitiesDF(
94 pd.DataFrame(activities_ki), # type: ignore
95 target_id=target_id,
96 activities_type="Ki",
97 )
98
99 v_logger.success("Collecting activities to pandas.DataFrame!", LogMode.VERBOSELY)
100 v_logger.info(
101 "Recording new values 'IC50', 'Ki' in targets DataFrame...", LogMode.VERBOSELY
102 )
103
104 # записываем количество активностей IC50 и Ki в DataFrame с данными о мишенях.
105 targets_data.loc[targets_data["target_chembl_id"] == target_id, "IC50_new"] = len(
106 data_frame_ic50
107 )
108
109 targets_data.loc[targets_data["target_chembl_id"] == target_id, "Ki_new"] = len(
110 data_frame_ki
111 )
112
113 v_logger.info(
114 f"Amount: IC50: {len(data_frame_ic50)}; Ki: {len(data_frame_ki)}.",
115 LogMode.VERBOSELY,
116 )
117 v_logger.success(
118 "Recording new values 'IC50', 'Ki' in targets DataFrame!", LogMode.VERBOSELY
119 )
120 v_logger.info(
121 "Collecting activities to .csv file in "
122 f"'{activities_config['results_folder_name']}'...",
123 LogMode.VERBOSELY,
124 )
125
126 # полное имя файла для IC50.
127 full_file_name_ic50: str = (
128 f"{activities_config['results_folder_name']}/{file_name_ic50}.csv"
129 )
130 # полное имя файла для Ki.
131 full_file_name_ki: str = (
132 f"{activities_config['results_folder_name']}/{file_name_ki}.csv"
133 )
134
135 # сохраняем DataFrame с активностями IC50 в CSV.
136 data_frame_ic50.to_csv(full_file_name_ic50, sep=";", index=False)
137 # сохраняем DataFrame с активностями Ki в CSV.
138 data_frame_ki.to_csv(full_file_name_ki, sep=";", index=False)
139
140 v_logger.success(
141 "Collecting activities to .csv file in "
142 f"'{activities_config['results_folder_name']}'!",
143 LogMode.VERBOSELY,
144 )
145
146 # включена опция скачивания molfiles.
147 if activities_config["download_compounds_sdf"]:
148 # обновляем формат логгера.
149 v_logger.UpdateFormat(
150 compounds_config["logger_label"], compounds_config["logger_color"]
151 )
152
153 v_logger.info(
154 f"Start download molfiles connected with {target_id} to .sdf...",
155 LogMode.VERBOSELY,
156 )
157
158 # создаем директорию для molfiles, если она не существует.
159 os.makedirs(compounds_config["molfiles_folder_name"], exist_ok=True)
160
161 v_logger.info("Saving connected with IC50 molfiles...", LogMode.VERBOSELY)
162
163 # сохраняем molfiles, связанные с активностями IC50 в SDF.
164 SaveChEMBLMolfilesToSDFByIdList(
165 data_frame_ic50["molecule_chembl_id"].tolist(),
166 f"{compounds_config['molfiles_folder_name']}/{file_name_ic50}_molfiles",
167 extra_data=data_frame_ic50,
168 )
169
170 v_logger.success("Saving connected with IC50 molfiles!", LogMode.VERBOSELY)
171 v_logger.info("Saving connected with Ki molfiles...", LogMode.VERBOSELY)
172
173 # сохраняем molfiles, связанные с активностями Ki в SDF.
174 SaveChEMBLMolfilesToSDFByIdList(
175 data_frame_ki["molecule_chembl_id"].tolist(),
176 f"{compounds_config['molfiles_folder_name']}/{file_name_ki}_molfiles",
177 extra_data=data_frame_ki,
178 )
179
180 v_logger.success("Saving connected with Ki molfiles!", LogMode.VERBOSELY)
181 v_logger.success(
182 f"End download molfiles connected with {target_id} to .sdf!", LogMode.VERBOSELY
183 )
184
185 # восстанавливаем формат логгера.
186 v_logger.UpdateFormat(
187 activities_config["logger_label"], activities_config["logger_color"]
188 )
189
190 v_logger.info("-", LogMode.VERBOSELY)
191
192 v_logger.success("End download activities connected with targets!")
193
194
195@IgnoreWarnings
196@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'.
197def GetCellLineChEMBLActivitiesFromCSV(cell_lines_data: pd.DataFrame):
198 """
199 "Скачивает" (получает) информацию об активностях (IC50 и GI50), связанных с
200 заданными клеточными линиями, из CSV-файлов, расположенных в директории,
201 указанной в конфигурации. Также, при необходимости, скачивает
202 соответствующие molfiles в формате SDF.
203
204 Важно:
205 В данном случае "скачивание" подразумевает чтение данных из локальных
206 CSV-файлов, а не загрузку из ChEMBL API.
207
208 Args:
209 cell_lines_data (pd.DataFrame): DataFrame, содержащий информацию
210 о клеточных линиях, включая 'cell_chembl_id'.
211 """
212
213 # конфигурация для активностей.
214 activities_config: Config = config["ChEMBL_download_activities"]
215 # конфигурация для клеточных линий.
216 cell_lines_config: Config = config["ChEMBL_download_cell_lines"]
217 # конфигурация для соединений.
218 compounds_config: Config = config["ChEMBL_download_compounds"]
219
220 # сохраняем текущий индекс формата логгера.
221 restore_index: int = (
222 v_logger.UpdateFormat(
223 activities_config["logger_label"], activities_config["logger_color"]
224 )
225 - 1
226 )
227
228 v_logger.info("Start getting activities connected with cell_lines...")
229 v_logger.info("-", LogMode.VERBOSELY)
230
231 # итерируемся по идентификаторам клеточных линий.
232 for cell_id in cell_lines_data["cell_chembl_id"]:
233 file_name_ic50: str = f"{cell_id}_IC50_activities"
234 file_name_gi50: str = f"{cell_id}_GI50_activities"
235
236 # нужно ли пропускать загрузку, если файлы уже существуют.
237 if (
238 config["skip_downloaded"]
239 and IsFileInFolder(
240 f"{file_name_ic50}.csv", activities_config["results_folder_name"]
241 )
242 and IsFileInFolder(
243 f"{file_name_gi50}.csv", activities_config["results_folder_name"]
244 )
245 ):
246 v_logger.info(
247 f"Activities connected with target {cell_id} is already gotten, skip",
248 LogMode.VERBOSELY,
249 )
250 v_logger.info("-", LogMode.VERBOSELY)
251
252 continue # переходим к следующей клеточной линии.
253
254 v_logger.info(f"Getting activities connected with {cell_id}...", LogMode.VERBOSELY)
255
256 # читаем данные об активностях IC50 и GI50 из CSV-файлов.
257 data_frame_ic50 = pd.read_csv(
258 f"{cell_lines_config['raw_csv_folder_name']}/{file_name_ic50}.csv",
259 sep=config["csv_separator"],
260 low_memory=False,
261 )
262
263 data_frame_gi50 = pd.read_csv(
264 f"{cell_lines_config['raw_csv_folder_name']}/{file_name_gi50}.csv",
265 sep=config["csv_separator"],
266 low_memory=False,
267 )
268
269 v_logger.info(
270 f"Amount: IC50: {len(data_frame_ic50)}; GI50: {len(data_frame_gi50)}.",
271 LogMode.VERBOSELY,
272 )
273
274 v_logger.success(f"Getting activities connected with {cell_id}!", LogMode.VERBOSELY)
275 v_logger.info("Cleaning activities...", LogMode.VERBOSELY)
276
277 # очищаем DataFrames с активностями IC50 и GI50.
278 data_frame_ic50 = CleanedCellLineActivitiesDF(
279 data_frame_ic50, cell_id=cell_id, activities_type="IC50"
280 )
281
282 data_frame_gi50 = CleanedCellLineActivitiesDF(
283 data_frame_gi50, cell_id=cell_id, activities_type="GI50"
284 )
285
286 v_logger.success("Collecting activities to pandas.DataFrame!", LogMode.VERBOSELY)
287 v_logger.info(
288 "Recording new values 'IC50', 'GI50' in targets DataFrame...", LogMode.VERBOSELY
289 )
290
291 # записываем количество активностей IC50 и GI50 в DataFrame.
292 cell_lines_data.loc[cell_lines_data["cell_chembl_id"] == cell_id, "IC50_new"] = len(
293 data_frame_ic50
294 )
295
296 cell_lines_data.loc[cell_lines_data["cell_chembl_id"] == cell_id, "GI50_new"] = len(
297 data_frame_gi50
298 )
299
300 v_logger.info(
301 f"Amount: IC50: {len(data_frame_ic50)}; GI50: {len(data_frame_gi50)}.",
302 LogMode.VERBOSELY,
303 )
304 v_logger.success(
305 "Recording new values 'IC50', 'GI50' in targets DataFrame!", LogMode.VERBOSELY
306 )
307 v_logger.info(
308 f"Collecting activities to .csv file in '"
309 f"{activities_config['results_folder_name']}'...",
310 LogMode.VERBOSELY,
311 )
312
313 # формируем полное имя файла для IC50.
314 full_file_name_ic50: str = (
315 f"{activities_config['results_folder_name']}/{file_name_ic50}.csv"
316 )
317 # формируем полное имя файла для GI50.
318 full_file_name_gi50: str = (
319 f"{activities_config['results_folder_name']}/{file_name_gi50}.csv"
320 )
321
322 # сохраняем DataFrame с активностями IC50 в CSV.
323 data_frame_ic50.to_csv(full_file_name_ic50, sep=";", index=False)
324 # сохраняем DataFrame с активностями GI50 в CSV.
325 data_frame_gi50.to_csv(full_file_name_gi50, sep=";", index=False)
326
327 v_logger.success(
328 f"Collecting activities to .csv file in "
329 f"'{activities_config['results_folder_name']}'!",
330 LogMode.VERBOSELY,
331 )
332
333 # включена опция скачивания molfiles.
334 if activities_config["download_compounds_sdf"]:
335 # обновляем формат логгера.
336 v_logger.UpdateFormat(
337 compounds_config["logger_label"], compounds_config["logger_color"]
338 )
339
340 v_logger.info(
341 f"Start download molfiles connected with {cell_id} to .sdf...", LogMode.VERBOSELY
342 )
343
344 # создаем директорию для molfiles, если она не существует.
345 os.makedirs(compounds_config["molfiles_folder_name"], exist_ok=True)
346
347 v_logger.info("Saving connected with IC50 molfiles...", LogMode.VERBOSELY)
348
349 # сохраняем molfiles, связанные с активностями IC50 в SDF.
350 SaveChEMBLMolfilesToSDFByIdList(
351 data_frame_ic50["molecule_chembl_id"].tolist(),
352 f"{compounds_config['molfiles_folder_name']}/{file_name_ic50}_molfiles",
353 extra_data=data_frame_ic50,
354 )
355
356 v_logger.success("Saving connected with IC50 molfiles!", LogMode.VERBOSELY)
357 v_logger.info("Saving connected with GI50 molfiles...", LogMode.VERBOSELY)
358
359 # сохраняем molfiles, связанные с активностями GI50 в SDF.
360 SaveChEMBLMolfilesToSDFByIdList(
361 data_frame_gi50["molecule_chembl_id"].tolist(),
362 f"{compounds_config['molfiles_folder_name']}/{file_name_gi50}_molfiles",
363 extra_data=data_frame_gi50,
364 )
365
366 v_logger.success("Saving connected with GI50 molfiles!", LogMode.VERBOSELY)
367 v_logger.success(
368 f"End download molfiles connected with {cell_id} to .sdf!", LogMode.VERBOSELY
369 )
370
371 # восстанавливаем формат логгера.
372 v_logger.UpdateFormat(
373 activities_config["logger_label"], activities_config["logger_color"]
374 )
375
376 v_logger.info("-", LogMode.VERBOSELY)
377
378 v_logger.success("End getting activities connected with cell_lines!")
379
380 # восстанавливаем исходный формат логгера.
381 v_logger.RestoreFormat(restore_index)