Пусть дан произвольный файл в формате SDF (или Molfile, что то же самое) из базы данных PubChem, содержащий структуру молекулы. Пример: молекула аспирина.
Программа должна распарсить файл (только атомы с координатами и связи с кратностями, игнорируя заряды и прочую дополнительную информацию), построить в памяти граф молекулы (вершины = атомы, рёбра = связи) и определить рёбра, которые одновременно:
- одинарные (т. е. соответствуют одинарным, а не двойным и не тройным связям)
- не принадлежат циклам
- не являются "висячими", т. е. продолжаются с обоих концов
Далее, программа должна повернуть молекулу в трёхмерном пространстве вокруг каждого из найденных рёбер на случайный угол так, чтобы вращалась не вся молекула, а лишь "половина", лежащая по одну сторону от ребра. Координаты атомов при этом, конечно, изменятся, изменится форма молекулы.
Далее, программа должна забыть случайные углы, проанализировать получившиеся координаты атомов и найти такие углы вращения вокруг найденных связей, чтобы атомы встали на исходные места. Один из способов это сделать: сгенерировать множество случайных наборов углов и из каждого из них градиентным или покоординатным спуском приблизить атомы к исходным положениям.
- numpy
- pandas
- matplotlib
- rdkit
- Jupyter Notebook