Создание молекулярного редактора / визуализатора: объектно-ориентированное программирование, структуры данных и молекулы

12

Я новичок в программировании и пытаюсь решить свою первую большую проблему и написать свою первую большую программу. Я искал примеры кода с открытым исходным кодом для изучения, но до сих пор нашел код только на тех языках, которые я не до конца понимаю, или это делает связанные, но слишком далекие вещи для меня, чтобы по-настоящему учиться. У меня проблемы с принятием некоторых концептуальных шагов здесь.

Я хочу создать простое программное обеспечение для создания, изменения и представления небольших органических молекул. Это в основном учебное упражнение. Пользователь может дать строку SMILES или выбрать из базового набора начальных молекул, а затем может построить эту молекулу либо графически, либо с помощью синтаксиса ввода текста. Тем не менее, я даже не в этой точке сложности еще. Я даже не могу полностью понять, как сделать классы / объекты для хранения молекул. Итак, мой вопрос вкратце: как я могу использовать классы / объекты для построения молекул, сохраняя при этом все уровни информации, и какие структуры данных я должен использовать в качестве атрибутов для каких объектов? И могут ли объекты быть атрибутами других объектов?

Вот мой ход мыслей: я думал, что у меня будет класс «Молекула», затем класс / подкласс «Атом» и подкласс «Бонд», а также, возможно, подкласс «Функциональная группа». Кажется, это хорошее место для начала, но, возможно, я неправильно понимаю ООП, и это плохо. Но тогда моя проблема действительно становится запутанной (для меня). Несмотря на то, что у меня есть все эти концепции / идеи / классы, я не полностью понимаю, какие структуры данных необходимы для представления молекулы. Было бы неплохо иметь список атомов. Может ли этот список быть списком объектов Atom? Мне также нужно было бы иметь способ хранить подключения. 2D-матрица кажется хорошей идеей, с порядком связи в виде целых чисел в позициях матрицы.

В этот момент я начинаю перегружаться задачей. Все, что я делаю до сих пор, имеет смысл? Добавление аспекта отображения / рисования поверх этого может означать, что мне нужно переписать / переделать многие из этих вещей, но я просто пытаюсь добраться до точки, где я могу по крайней мере сохранить молекулы с соответствующими данными, а затем получить доступ эти данные для проверки / изменения. Я думал об этом в Python, поэтому код / ​​классы могли бы выглядеть примерно так: http://pastebin.com/uUi1BMzr

Возможно, это действительно вопросы программирования для StackOverflow, но я подумал, что это достаточно конкретно, чтобы перейти сюда. Любая помощь будет принята с благодарностью, даже если вы просто укажете, где я допустил грубые ошибки. Заранее спасибо.

Nate
источник
1
Кроме того, для тех, кто пытается сделать что-то подобное, я только что нашел хороший пакет Python с открытым исходным кодом, который помог мне с несколькими концепциями под названием MMTK, для набора инструментов молекулярной механики.
Nate
1
Вы смотрели на OpenBabel? Это должно иметь все, что вам нужно под рукой.
Смертельное дыхание

Ответы:

5

Написание программного обеспечения - это итеративный процесс - напишите код -> посмотрите, как далеко вы можете продвинуться, затем спланируйте следующие шаги -> напишите код -> повторите. На этом этапе изучения искусства я бы посоветовал вам в скором времени просто попробовать воды. Нет необходимости планировать всю систему заранее. Да, Python будет хорошим первым языком. Для визуализации попробуйте MatPlotLib, а также NumPy и SciPy. Программное обеспечение промышленного масштаба всегда опирается на библиотеки предварительной сборки, вместо того, чтобы писать все самостоятельно, но простые решения можно и нужно писать самостоятельно, особенно при обучении программированию. Ваша OO раскладка пока выглядит нормально. Когда / если ваши объектные отношения должны измениться позже, процесс повторного факторинга самого кода является достойным опытом для освоения. Добро пожаловать на борт !

Скотт Стенсленд
источник
Спасибо за вклад. Я просто буду продолжать это делать. Я также узнаю немного о передаче и изменениях атрибутов / переменных объекта. Очень интересно взять что-то из реального мира и попытаться представить это в компьютерном коде.
Nate
9

У вашей цели много проблем. Я разобью их на части.

SMILES не является тривиальным языком для анализа, и правила восприятия ароматичности не очень хорошо определены. Детальное определение грамматики из проекта OpenSMILES должно помочь некоторым.

SMILES определяет топологию, но не предоставляет 2D или 3D информацию. Делать либо сложно. (То есть, если вы хотите, чтобы это выглядело красиво.)

Действительно, вам следует обратиться к инструментарию для хеминформатики RDKit (или OpenBabel, но я предпочитаю RDKit). Он имеет встроенный синтаксический анализатор SMILES, а также 2D-макет, и я считаю, что создание 3D-конформации. OpenBabel делает то же самое.

Затем для отображения вам необходимо выяснить систему графического интерфейса. На самом деле, здесь инструментарий CDK для хеминформатики, на Java, является самым передовым.

Но вы в основах того, как представлять молекулу. Существуют различия между моделями данных для малых и больших молекул (белков, ДНК), но поскольку вы заинтересованы в SMILES, это означает, что вы ориентированы на небольшие молекулы.

Вы можете посмотреть API-документы для RDKit, OpenBabel, CDK, OEChem и Indigo, а также многих других. Это даст вам представление о том, как люди разрабатывают свой класс API. Из них я больше всего предпочитаю OEChem, а затем RDKit. Несмотря на то, что OEChem является открытым исходным кодом, API доступен онлайн и доступен для чтения, наряду с примерами использования.

Короче говоря, есть класс Molecule со списком экземпляров Atom и Bond. «mol.AddAtom (номер элемента)» создает новый атом без связей, «mol.AddBond (atom1, atom2, bond_type)» устанавливает связь. Каждая связь должна знать атомы, с которыми она связана, и каждый атом должен иметь список связей. Это приводит к множеству циклов в структуре данных, но это необходимо для того, чтобы различные алгоритмы, такие как поиск связности, могли выполняться за линейное время.

Не используйте 2D-матрицу. Хотя это возможно для маленькой молекулы, она не так хорошо масштабируется, и в этом нет необходимости. Немногим алгоритмам нужна матрица связности, и она легко генерируется, если / когда это необходимо.

Не иметь "FunctionalGroup". Это слишком специализировано. Используйте что-то вроде «Подмножество» или «Фрагмент», который содержит список атомов и связей, которые вас интересуют. Таким образом, вы также можете обрабатывать такие вещи, как «выбранные атомы» и «кольцевая подструктура» и «каркас», обращаясь к конкретное подмножество.

Я посмотрел на твой пастин. Парсер не должен работать таким образом. Вы должны отделить анализ от вашей фактической структуры молекулы. Попробуйте что-то вроде этого:

class Molecule(object):
    def __init__(self):
        self.atoms = []
        self.bonds = []
        self._atom_id = 0
        self._bond_id = 0
    def _next_atom_id(self):
        atom_id = self._atom_id
        self.atom_id += 1
        return atom_id
    def AddAtom(self, eleno):
        self.atoms.append(Atom(self, self._next_atom_id(), eleno))
    def AddBond(self, atom1, atom2, bondtype):
        assert atom1.molecule is atom2.molecule
        self.bonds.append(Bond(self, self._next_bond_id(),
                               atom1, atom2, bondtype))

class Atom(object):
    def __init__(self, molecule, id, eleno):
        self.molecule = molecule
        self.id = id
        self.eleno = eleno
        self.charge = 0
        self.isotope = 0
   ..

и тогда синтаксический анализатор для простой линейной цепочки, такой как "CC O":

def parse_linear_chain(text):
   mol = Molecule()
   prev_atom = None
   for atom_symbol in text.split():
     eleno = lookup_symbol[atom_symbol]
     atom = mol.NewAtom(eleno)
     if pre_atom is not None:
       mol.AddBond(prev_atom, atom, 1)
     prev_atom = atom
   return mol

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

Списки рассылки OpenBabel, RDKit и CDK также являются хорошим выбором, если вы решите использовать один из этих наборов инструментов. Также есть сайт вопросов и ответов «Голубой обелиск», который ведет Shapado.

Эндрю Далке
источник
1

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

Программы, которые могут вас заинтересовать

  • Пакет MD-моделирования и молекулярного моделирования MMTK (как уже было предложено Нейтом выше)

  • Пакет визуализации PyMol

olenz
источник
1

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

Вот несколько хороших слайдов Python (немного старше), которые могут помочь: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Для проверки вашей работы: в дополнение к openbabel (у которого есть привязки python!) И MMTK, есть ELBOW в phenix.

Для полиглота у вас есть также PerlMol (Perlmol.org). PerlMol написан на объектно-ориентированном Perl и может быть загружен из CPAN.

Демьян
источник