Я новичок в программировании и пытаюсь решить свою первую большую проблему и написать свою первую большую программу. Я искал примеры кода с открытым исходным кодом для изучения, но до сих пор нашел код только на тех языках, которые я не до конца понимаю, или это делает связанные, но слишком далекие вещи для меня, чтобы по-настоящему учиться. У меня проблемы с принятием некоторых концептуальных шагов здесь.
Я хочу создать простое программное обеспечение для создания, изменения и представления небольших органических молекул. Это в основном учебное упражнение. Пользователь может дать строку SMILES или выбрать из базового набора начальных молекул, а затем может построить эту молекулу либо графически, либо с помощью синтаксиса ввода текста. Тем не менее, я даже не в этой точке сложности еще. Я даже не могу полностью понять, как сделать классы / объекты для хранения молекул. Итак, мой вопрос вкратце: как я могу использовать классы / объекты для построения молекул, сохраняя при этом все уровни информации, и какие структуры данных я должен использовать в качестве атрибутов для каких объектов? И могут ли объекты быть атрибутами других объектов?
Вот мой ход мыслей: я думал, что у меня будет класс «Молекула», затем класс / подкласс «Атом» и подкласс «Бонд», а также, возможно, подкласс «Функциональная группа». Кажется, это хорошее место для начала, но, возможно, я неправильно понимаю ООП, и это плохо. Но тогда моя проблема действительно становится запутанной (для меня). Несмотря на то, что у меня есть все эти концепции / идеи / классы, я не полностью понимаю, какие структуры данных необходимы для представления молекулы. Было бы неплохо иметь список атомов. Может ли этот список быть списком объектов Atom? Мне также нужно было бы иметь способ хранить подключения. 2D-матрица кажется хорошей идеей, с порядком связи в виде целых чисел в позициях матрицы.
В этот момент я начинаю перегружаться задачей. Все, что я делаю до сих пор, имеет смысл? Добавление аспекта отображения / рисования поверх этого может означать, что мне нужно переписать / переделать многие из этих вещей, но я просто пытаюсь добраться до точки, где я могу по крайней мере сохранить молекулы с соответствующими данными, а затем получить доступ эти данные для проверки / изменения. Я думал об этом в Python, поэтому код / классы могли бы выглядеть примерно так: http://pastebin.com/uUi1BMzr
Возможно, это действительно вопросы программирования для StackOverflow, но я подумал, что это достаточно конкретно, чтобы перейти сюда. Любая помощь будет принята с благодарностью, даже если вы просто укажете, где я допустил грубые ошибки. Заранее спасибо.
Ответы:
Написание программного обеспечения - это итеративный процесс - напишите код -> посмотрите, как далеко вы можете продвинуться, затем спланируйте следующие шаги -> напишите код -> повторите. На этом этапе изучения искусства я бы посоветовал вам в скором времени просто попробовать воды. Нет необходимости планировать всю систему заранее. Да, Python будет хорошим первым языком. Для визуализации попробуйте MatPlotLib, а также NumPy и SciPy. Программное обеспечение промышленного масштаба всегда опирается на библиотеки предварительной сборки, вместо того, чтобы писать все самостоятельно, но простые решения можно и нужно писать самостоятельно, особенно при обучении программированию. Ваша OO раскладка пока выглядит нормально. Когда / если ваши объектные отношения должны измениться позже, процесс повторного факторинга самого кода является достойным опытом для освоения. Добро пожаловать на борт !
источник
У вашей цели много проблем. Я разобью их на части.
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". Это слишком специализировано. Используйте что-то вроде «Подмножество» или «Фрагмент», который содержит список атомов и связей, которые вас интересуют. Таким образом, вы также можете обрабатывать такие вещи, как «выбранные атомы» и «кольцевая подструктура» и «каркас», обращаясь к конкретное подмножество.
Я посмотрел на твой пастин. Парсер не должен работать таким образом. Вы должны отделить анализ от вашей фактической структуры молекулы. Попробуйте что-то вроде этого:
и тогда синтаксический анализатор для простой линейной цепочки, такой как "CC O":
Конечно, полный синтаксический анализатор SMILES намного сложнее, и полная модель данных должна обрабатывать такие вещи, как подсчет водорода, которые часто бывают неявными.
Списки рассылки OpenBabel, RDKit и CDK также являются хорошим выбором, если вы решите использовать один из этих наборов инструментов. Также есть сайт вопросов и ответов «Голубой обелиск», который ведет Shapado.
источник
Другим подходом для начала может быть просмотр кода, который уже делает что-то, связанное с вашей проблемой. В этом случае ваше упражнение может даже оказаться в какой-то другой программе, и это было бы неплохо, не так ли?
Программы, которые могут вас заинтересовать
Пакет MD-моделирования и молекулярного моделирования MMTK (как уже было предложено Нейтом выше)
Пакет визуализации PyMol
источник
Изучение деталей молекулярной объектной системы - прекрасный способ для химиков изучать объектно-ориентированное программирование. Вы обнаружите, что внедрение такой системы улучшит вашу молекулярную интуицию. Вы должны серьезно подумать об атомах, молекулах и, возможно, коллекциях молекул с точки зрения атрибутов и методов.
Вот несколько хороших слайдов Python (немного старше), которые могут помочь: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf
Для проверки вашей работы: в дополнение к openbabel (у которого есть привязки python!) И MMTK, есть ELBOW в phenix.
Для полиглота у вас есть также PerlMol (Perlmol.org). PerlMol написан на объектно-ориентированном Perl и может быть загружен из CPAN.
источник