Алгоритмический анализ химических структур с помощью RDKit

RDKit — это инструментарий химико-информатики с открытым исходным кодом, написанный на C++, который также можно использовать в Java, Python и KNIME. Он предоставляет широкий набор функций хемоинформатики, таких как чтение и запись молекул, работа с атомами, связями и кольцами, создание 2D или 3D координат, поиск подструктур, применение химических преобразований и вычисление отпечатков пальцев и дескрипторов. RDKit также предлагает высокопроизводительный картридж базы данных для PostgreSQL. RDKit понимает SMARTS, язык описания молекулярных паттернов, и SMIRKS, язык применения преобразований реакций, оба из которых используют в качестве основы SMILES, знаменитую линейную нотацию для ввода и представления молекул и реакций.

RDKit может применять преобразования реакции и в сочетании с рекурсивными возможностями Python может поддерживать нишевые варианты использования, такие как описанный в этой статье. В частности, мы будем рекурсивно применять химические реакции, чтобы проверить, является ли входная молекулярная структура пептидом, то есть линейной последовательностью аминокислот. Я обнаружил, что рекурсивное применение реакций — хороший способ алгоритмического анализа химических структур, например. путем итеративной фрагментации структуры, отщепления четко определенных фрагментов и категоризации оставшихся фрагментов, когда больше нельзя применять преобразования.

· Введение
· Строительные блоки: аминокислоты
· Выявление пептидных связей
· Разрыв пептидных связей
· Выводы

Введение

Изображение ниже представляет собой линейный олигопептид с четырьмя аминокислотами, а именно аргинином, аланином, треонином и метионином, и он был обнаружен в недавнем наборе данных, который я анализировал. Я работаю с промышленными химикатами и был удивлен, увидев такие структуры в нашей базе данных, так как мы не имеем никакого отношения к биомолекулам, а пептиды встречаются не так часто. Копнув дальше, я обнаружил, что мы ошибочно создали ряд таких структур, интерпретируя химические названия с химическими названиями для структурных алгоритмов. В дополнение к своему полному названию аминокислоты также могут быть представлены одним или тремя символами, которые иногда встречаются в тексте и ошибочно интерпретируются как химические структуры. Эта проблема с качеством данных может повлиять и на общедоступные наборы данных, и поэтому я подумал, что может быть полезно найти способ их обнаружения и устранения, если они произошли непреднамеренно.

Есть много способов сделать это, и я полагаю, что все линейные пептидные последовательности могут быть сопоставлены с помощью сложного запроса SMARTS. Разработка этого казалась мне пугающей, и поэтому я подумал, что может быть более жизнеспособным решить эту проблему, разбив ее на более мелкие. С точки зрения химии это означает, что мы должны разбить исходную молекулу на более мелкие фрагменты, гидролизуя пептидные связи одну за другой до тех пор, пока не останется связей, которые нужно разорвать. Если все полученные фрагменты представляют собой аминокислоты, то исходная структура должна быть пептидом. Это также позволяет определить точную последовательность аминокислот. Нам нужен способ рекурсивного применения химической реакции. Если вам интересно узнать, как это можно сделать с помощью RDKit, и открыть для себя некоторые функциональные возможности этой богатой библиотеки хемоинформатики, пожалуйста, продолжайте читать.

Код для этой статьи можно найти в моем блоге GitHub репозиторий. Мы будем использовать RDKit версии 2022.9.4 с Python 3.9.13. Репозиторий также включает все зависимости в предоставленном файле требований.

Строительные блоки: аминокислоты

Есть 20 распространенных аминокислот, из которых состоят белки. Есть также еще две дополнительные аминокислоты, которые у некоторых видов кодируются кодонами, которые обычно интерпретируются как стоп-кодоны. Все это альфа-аминокислоты, т.е. аминогруппа непосредственно связана с α-углеродом, т.е. атомом углерода рядом с карбоксильной группой. Для удобства я создал SMILES для этих 22 аминокислот, которые можно найти в репозитории.

Первый шаг — прочитать 22 аминокислоты и одновременно импортировать все необходимые модули RDKit.

Смайлы конвертируются в нативные RDKit Mol объекты в предпоследней строке. Последняя строка может показаться немного загадочной, но все, что она делает, это включает название аминокислоты в молекулу, что можно проверить с помощью

print(Chem.MolToMolBlock(amino_acids['mol'].iloc[0]))

который печатает

Аминокислоты можно визуализировать в специально созданной сетке с помощью matplotlib, как показано ниже.

Последняя строка сохраняет изображение ниже как файл PNG, который вы можете найти в репозитории вместе со всеми другими изображениями в этой статье.

RDKit можно легко использовать в ноутбуках Jupyter, где модуль Draw позволяет легко визуализировать молекулярные структуры в сетке с помощью функции Draw.MolsToGridImage(). Тем не менее, я считаю, что использование matplotlib обеспечивает большую гибкость, особенно если следовать этим превосходным предложениям о том, как настроить компоненты графика. Все аминокислоты имеют следующий энантиомерный остов.

Первая полезная функциональность RDKit, которую мы можем представить на этом этапе, — это так называемая декомпозиция R-группы. В приведенном ниже коде мы определяем ядро ​​аминокислотного остова с помощью смайлов [*:1][C@H](N[*:2])C(O)=O, которое имеет две явные метки группы R. Причиной использования двух меток группы R является наличие пирролидинового кольца в L-пролине. Явным образом указав параметры декомпозиции R-группы, мы ограничили ее совпадением только с явно указанными R-группами.

Остальная часть кода создает необходимые входные массивы с молекулами и легендами для создания изображения с использованием той же функции полезности, что и ранее. Если вы посмотрите внимательно, то заметите, что глицин не разложился на R-группы. Причина в том, что он не хиральный, в то время как основная структура, используемая для разложения, является хиральной. Разложение глицина было бы успешным, если бы мы удалили хиральный центр из ядра, но тогда распад R-группы был бы менее специфичным, что может быть нежелательно.

Разложение R-группы полезно в случае, если для дальнейшей обработки необходимы аминокислотные остовы. Мы не будем останавливаться на этом далее в этой статье.

Идентификация пептидных связей

Прежде чем мы попытаемся разорвать пептидные связи, мы можем проверить, можем ли мы их идентифицировать. Мы используем пример линейного трипептида, образованного треонином, метионином и аргинином. Пептидная связь определяется как структурный паттерн, который затем используется для поиска соответствующих атомов и связей в исходной молекуле.

который создает изображение ниже.

С помощью rdkit.Chem.Draw.rdMolDraw2D пептидные связи были хорошо ориентированы. Поиск подструктуры вернул набор кортежей с индексами атомов, которые были сглажены и использовались для поиска всех индексов связей между всеми парами атомов в сглаженном списке. Индексы атомов и связей в пептидной цепи были выделены светло-серым цветом до того, как молекулярная структура была сохранена в виде изображения PNG. Ключевое сообщение здесь заключается в том, что с помощью RDKit можно получить контроль вплоть до уровня атомов и связей, которые по существу формируют граф, поддающийся любому мыслимому алгоритму.

Разрыв пептидных связей

Разрыв пептидной связи требует определения реакции с помощью SMIRKS. Ранее определенный образец пептида, используемый в сопоставлении субструктуры, становится частью реагентов реакции SMIRKS. Продукты представляют собой не что иное, как гидролизованный продукт с двумя аминокислотами, разделенными точечной записью. Трипептид треонин, аргинин, метионин имеет две пептидные связи, и, следовательно, реакцию можно применять дважды, что приводит к двум результатам реакции, оба из которых включают аминокислоту и дипептид.

Приведенный выше код создает следующее PNG-изображение с двумя возможными реакциями в двух строках.

Если мы хотим полностью расщепить пептид на составляющие его аминокислоты, нам придется повторять реакцию до тех пор, пока не перестанут разрушаться пептидные связи. Нет необходимости перечислять все возможные реакции на каждой стадии. Мы можем просто применить реакцию один раз, взять два реагента и гидролизовать их по отдельности. RDKit позволяет контролировать количество продуктов, установив аргумент maxProducts равным единице. Что делает исходную структуру пептидом? Если после применения всех возможных реакций гидролиза пептидов мы получили только одну или несколько известных аминокислот, то исходной структурой является пептид. И наоборот, если в какой-то момент невозможно применить реакцию гидролиза пептида и структура не является одной из известных аминокислот, то исходная структура не является пептидом.

В приведенном выше коде используются две служебные функции: одна для проверки того, являются ли две структуры химически эквивалентными, поскольку они являются подструктурами друг друга, а другая — для проверки того, можно ли найти структуру в списке структур. В третьей и последней функции реализуется рекурсивный гидролиз пептидных связей.

Используя эту рекурсивную функцию, мы проверяем, является ли набор из девяти примеров молекул пептидами.

Алгоритм правильно классифицирует первые 8 структур как пептиды, а последние две — как непептиды. Примечательно, что мы использовали соглашение о том, что аминокислоты сами по себе являются пептидами, что, строго говоря, может быть неверным, но это было удобно для применения рекурсии.

Алгоритм можно улучшить, добавив результаты реагентов на график, используя, например, NetworkX и визуализируя ход реакции, рисуя структуру в каждом узле. Тогда листья будут аминокислотами, которые можно проанализировать для получения точной последовательности аминокислот в пептиде. Возможности безграничны; RDKit выполнил свою часть работы, и в остальном можно положиться на выразительность Python.

Выводы

RDKit — это богатая библиотека хемоинформатики. В настоящее время его можно легко развернуть с помощью pip, и он открывает возможность использования Python и его экосистемы анализа данных и науки о данных в химических приложениях. Документация RDKit, по общему признанию, не самая лучшая, но сейчас доступно множество руководств и блогов. Библиотека постоянно развивается, добавляются новые функции. Я надеюсь, что эта статья будет полезна для иллюстрации некоторых функций RDKit и демонстрации его потенциала.