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


12

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

Я хочу зробити просту програму для створення, зміни та пізніше представлення невеликих органічних молекул. Це в основному навчальна вправа. Користувач може надати рядок SMILES або вибрати основний набір молекул стартера, а потім може побудувати цю молекулу або графічно, або через синтаксис введення тексту. Однак я ще навіть не в цій точці складності. Я навіть не можу повністю зрозуміти, як зробити класи / об’єкти для зберігання молекул. Отже, моє запитання коротко: Як я можу використовувати класи / об’єкти для побудови молекул, зберігаючи всі рівні інформації, і які структури даних я повинен використовувати як атрибути, до яких об'єктів? І чи можуть об'єкти бути атрибутами до інших об’єктів?

Ось мій порядок думок поки що: я думав мати клас "Молекула", потім клас / підклас "Атом" і підклас "Бонд", а може бути і підклас "Функціональна група". Це здається гарним місцем для початку, але, можливо, я неправильно розумію ООП, і це погано. Але тоді моя проблема дійсно стає заплутаною (для мене). Хоча я маю всі ці поняття / ідеї / класи, я не повністю розумію, які структури даних потрібні для представлення молекули. Список атомів було б добре мати. Чи може цей список бути списком об’єктів Atom? Мені б також знадобився спосіб зберігати зв’язок. 2D матриця здається гарною ідеєю, з порядком зв’язків як цілими числами в матричних положеннях.

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

Можливо, це справді питання програмування для StackOverflow, але я подумав, що тут достатньо конкретних. Будь-яка допомога буде дуже вдячна, навіть якщо ви просто зазначите, де я зробив концептуальні промахи. Заздалегідь спасибі.


1
Крім того, для тих, хто намагається зробити щось подібне, я щойно знайшов гарний пакет з відкритим кодом python, який допоміг мені декілька концепцій під назвою MMTK для набору інструментів молекулярної механіки.
Нейт

1
Ви подивилися на OpenBabel? Це повинно мати під рукою все необхідне.
Смерть

Відповіді:


5

написання програмного забезпечення є ітераційним процесом - запишіть код -> подивіться, як далеко ви можете дістати, тоді плануйте наступні кроки -> код написання -> повторити. На цьому етапі навчання мистецтву я б запропонував вам скоріше заскочити, щоб випробувати води. Не потрібно планувати всю систему наперед. Так, python був би гарною першою мовою. Для візуалізації спробуйте MatPlotLib, також зручні NumPy та SciPy. Програмне забезпечення промислового масштабу завжди покладається на залучення до бібліотек попереднього збирання, замість того, щоб писати все самостійно, але прості рішення можна і потрібно писати самостійно, особливо під час навчання програмуванню. Ваш макет OO наразі здається нормальним. Коли / якщо ваші об'єктні відносини потрібно пізніше змінити, акт повторного факторингу самого коду є гідним досвідом. Ласкаво просимо на борт !


Дякуємо за вклад. Я просто збираюся це тримати. Я також трохи дізнаюся про передачу та мутацію атрибутів / змінних об'єктів. Дійсно захоплююче взяти щось із реального світу та спробувати представити це в комп'ютерному коді.
Нейт

9

Ваша мета має багато проблем. Я розбию їх на частини.

SMILES - це не тривіальна мова для розбору, а правила сприйняття ароматності недостатньо визначені. Деякі граматичні визначення проекту OpenSMILES повинні допомогти деяким.

SMILES визначає топологію, але не дає 2D або 3D інформації. Зробити або важко. (Тобто, якщо ви хочете, щоб це виглядало приємно.)

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

Тоді для відображення вам доведеться розібратися в системі GUI. Власне, тут інструментарій для хімічних інструментів 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 також є хорошими місцями, якщо ви вирішите використовувати один із цих наборів інструментів. Існує також веб-сайт Q&A "Блакитний обеліск", розміщений Шападо.


1

Іншим підходом до початку роботи може стати перегляд якогось коду, який вже щось стосується вашої проблеми. У такому випадку ваша вправа може навіть опинитися в якійсь іншій програмі, і це було б добре, чи не так?

Програми, які можуть вас зацікавити

  • Пакет моделювання МД та моделювання молекулярного моделювання MMTK (як уже запропонував Нейт)

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


1

Вивчення деталей молекулярної об'єктної системи - це чудовий спосіб навчитися хімікам об'єктно-орієнтованого програмування. Ви побачите, що впровадження такої системи вдосконалить ваші молекулярні інтуїції. Вам слід задуматися над атомами, молекулами та, можливо, колекціями молекул з точки зору ознак та методів.

Ось кілька приємних слайдів python (трохи старших), які можуть допомогти: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Для перевірки вашої роботи: окрім openbabel (який має зв'язки пітона!) Та MMTK, у фенікс є ELBOW.

Для поліглоту у вас є також PerlMol (Perlmol.org). PerlMol написаний в об'єктно-орієнтованій perl і може бути завантажений з CPAN.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.