Tworzenie edytora / wizualizatora molekularnego: programowanie obiektowe, struktury danych i cząsteczki

12

Jestem nowy w programowaniu i próbuję rozwiązać swój pierwszy duży problem i napisać swój pierwszy duży program. Szukałem przykładów kodu open source do nauki, ale jak dotąd znalazłem tylko kod w językach, których nie do końca rozumiem lub które zawierają pokrewne, ale wciąż zbyt odległe rzeczy, aby naprawdę się uczyć. Mam problem z wykonaniem kilku kroków koncepcyjnych.

Chcę stworzyć prosty program do tworzenia, modyfikowania, a później reprezentowania małych cząsteczek organicznych. Jest to głównie ćwiczenie edukacyjne. Użytkownik poda ciąg SMILES lub wybierze podstawowy zestaw cząsteczek startowych, a następnie będzie mógł budować tę cząsteczkę graficznie lub za pomocą składni wprowadzania tekstu. Jednak nie jestem jeszcze w tym momencie złożoności. Nie potrafię nawet w pełni zrozumieć, jak tworzyć klasy / obiekty do przechowywania cząsteczek. Zatem moje zwięzłe pytanie: w jaki sposób wykorzystuję klasy / obiekty do budowy molekuł przy zachowaniu wszystkich poziomów informacji i jakich struktur danych powinienem użyć jako atrybutów, które obiekty? I czy obiekty mogą być atrybutami innych obiektów?

Oto mój dotychczasowy tok myślenia: zastanawiałem się nad klasą „Molekuła”, potem klasą / podklasą „Atom” i podklasą „Bond”, a może także podklasą „FunctionalGroup”. To wydaje się dobre miejsce na rozpoczęcie, ale może nie rozumiem OOP i to jest złe. Ale wtedy mój problem jest naprawdę zagmatwany (dla mnie). Mimo że mam wszystkie te koncepcje / pomysły / klasy, nie do końca rozumiem, jakie struktury danych są potrzebne do reprezentowania cząsteczki. Dobrze byłoby mieć listę atomów. Czy ta lista może być listą obiektów Atom? Potrzebowałbym również sposobu na przechowywanie połączeń. Matryca 2D wydaje się dobrym pomysłem, z kolejnością wiązań jako liczbami całkowitymi w pozycjach matrycy.

W tym momencie zaczynam się przytłaczać zadaniem. Czy wszystko, co do tej pory robię, ma sens? Dołączenie do tego aspektu wyświetlania / rysowania może oznaczać, że muszę przepisać / przerobić wiele z tych rzeczy, ale po prostu próbuję dojść do punktu, w którym mogę przynajmniej przechowywać cząsteczki z odpowiednimi danymi, a następnie uzyskać dostęp te dane do sprawdzenia / modyfikacji. Myślałem o zrobieniu tego w Pythonie, więc kod / klasy mogłyby wyglądać mniej więcej tak: http://pastebin.com/uUi1BMzr

Być może są to naprawdę pytania programowe dla StackOverflow, ale myślałem, że było wystarczająco szczegółowe, aby przejść tutaj. Każda pomoc byłaby bardzo mile widziana, nawet jeśli tylko wskazałeś, gdzie popełniłem błędy koncepcyjne. Z góry dziękuję.

Nate
źródło
1
Ponadto, dla każdego, kto próbuje zrobić coś podobnego, właśnie znalazłem ładny pakiet Pythona typu open source, który pomógł mi z kilkoma koncepcjami o nazwie MMTK, dla zestawu narzędzi mechaniki molekularnej.
Nate
1
Czy spojrzałeś na OpenBabel? To powinno mieć wszystko, czego potrzebujesz.
Deathbreath

Odpowiedzi:

5

pisanie oprogramowania jest procesem iteracyjnym - pisz kod -> sprawdź, jak daleko możesz się dostać, a następnie zaplanuj kolejne kroki -> napisz kod -> powtórz. Na tym etapie nauki sztuki sugeruję, abyś wskoczył wkrótce tylko po to, aby przetestować wody. Nie trzeba planować całego systemu z góry. Tak, python byłby dobrym pierwszym językiem. Do wizualizacji wypróbuj MatPlotLib, przydatne są także NumPy i SciPy. Oprogramowanie na skalę przemysłową zawsze polega na pobieraniu gotowych bibliotek, zamiast na pisaniu wszystkiego samemu, jednak proste rozwiązania można i należy pisać samemu, szczególnie podczas nauki programowania. Twój układ OO wydaje się na razie OK. Kiedy / jeśli relacje między obiektami będą musiały się później zmienić, samo przefaktoryzowanie samego kodu jest godnym doświadczeniem do opanowania. Witamy na pokładzie !

Scott Stensland
źródło
Dzięki za wkład. Po prostu zamierzam to kontynuować. Uczę się również trochę o przekazywaniu i mutowaniu atrybutów / zmiennych obiektu. To naprawdę fascynujące, aby wziąć coś ze świata rzeczywistego i spróbować przedstawić go w kodzie komputerowym.
Nate
9

Twój cel ma wiele wyzwań. Podzielę je na części.

SMILES nie jest trywialnym językiem do analizy, a zasady percepcji aromatyczności nie są dobrze zdefiniowane. Szczegółowa definicja gramatyki z projektu OpenSMILES powinna pomóc.

SMILES określa topologię, ale nie podaje informacji 2D ani 3D. Robienie obu jest trudne. (To znaczy, jeśli chcesz, żeby ładnie wyglądało.)

Naprawdę powinieneś zajrzeć do zestawu narzędzi cheminformatics RDKit (lub OpenBabel, ale wolę RDKit). Ma wbudowany parser SMILES, a także układ 2D i wierzę, że generowanie konformacji 3D. OpenBabel również.

Następnie na wyświetlaczu musisz wymyślić system GUI. W rzeczywistości tutaj zestaw narzędzi cheminformatics CDK w Javie jest najbardziej zaawansowany.

Ale znasz podstawy reprezentowania cząsteczki. Istnieją różnice między małocząsteczkowymi i wielkocząsteczkowymi modelami danych (białko, DNA), ale ponieważ jesteś zainteresowany SMILES, oznacza to, że jesteś zorientowany na małe cząsteczki.

Możesz zajrzeć do dokumentacji API dla RDKit, OpenBabel, CDK, OEChem i Indigo, i wielu innych. To da ci wyobrażenie o różnorodnych sposobach rozwijania API klasy. Spośród nich najbardziej wolę OEChem, a następnie RDKit. Mimo że OEChem jest oprogramowaniem typu open source, interfejs API jest dostępny online i można go swobodnie czytać, wraz z przykładami użycia.

Krótko mówiąc, posiadaj klasę cząsteczek z listą instancji Atom i Bonda. „mol.AddAtom (numer elementu)” tworzy nowy atom, bez żadnych wiązań, „mol.AddBond (atom1, atom2, bond_type)” tworzy połączenie. Każde wiązanie musi znać atomy, z którymi jest związane, i każdy atom potrzebuje listy wiązań. Prowadzi to do wielu cykli w strukturze danych, ale jest potrzebne, aby różne algorytmy, takie jak wyszukiwanie połączeń, mogły być wykonywane w czasie liniowym.

Nie używaj matrycy 2D. Chociaż jest to wykonalne dla małej cząsteczki, nie skaluje się tak dobrze i nie ma takiej potrzeby. Niewiele algorytmów potrzebuje macierzy łączności, którą można łatwo wygenerować w razie potrzeby.

Nie masz „FunctionalGroup”. To jest zbyt wyspecjalizowane. Użyj czegoś takiego jak „podzbiór” lub „fragment”, który zawiera listę interesujących Cię atomów i wiązań. W ten sposób możesz również obsługiwać takie rzeczy, jak „wybrane atomy” i „podbudowa pierścieniowa” i „rusztowanie”, odnosząc się do określony podzbiór.

Spojrzałem na twoją pastebin. Analizator składni nie powinien działać w ten sposób. Parsowanie należy oddzielić od faktycznej struktury cząsteczki. Wypróbuj coś takiego:

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
   ..

a następnie parser dla prostego łańcucha liniowego, takiego jak „CC O”, to:

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

Oczywiście pełny parser SMILES jest o wiele bardziej skomplikowany, a pełny model danych musi obsługiwać takie rzeczy, jak zliczanie wodoru, które często są niejawne.

Listy mailingowe OpenBabel, RDKit i CDK są również dobrym miejscem, jeśli zdecydujesz się użyć jednego z tych zestawów narzędzi. Istnieje również strona pytań i odpowiedzi „Niebieski obelisk”, której gospodarzem jest Shapado.

Andrew Dalke
źródło
1

Innym podejściem na początek może być spojrzenie na kod, który już robi coś związanego z twoim problemem. W takim przypadku twoje ćwiczenie może nawet skończyć w innym programie, i byłoby fajnie, prawda?

Programy, które mogą Cię zainteresować

  • Pakiet do symulacji MD i modelowania molekularnego MMTK (jak już zasugerował Nate powyżej)

  • Pakiet wizualizacji PyMol

olenz
źródło
1

Poznanie szczegółów systemu obiektów molekularnych jest dla chemików wspaniałym sposobem nauki programowania obiektowego. Przekonasz się, że wdrożenie takiego systemu poprawi twoje intuicje molekularne. Powinieneś trochę przemyśleć atomy, cząsteczki i być może kolekcje cząsteczek pod względem atrybutów i metod.

Oto kilka fajnych slajdów w języku Python (nieco starszych), które mogą pomóc: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Do sprawdzenia swojej pracy: oprócz openbabel (który ma wiązania python!) I MMTK, w phenix jest ELBOW.

Dla ciebie jest też PerlMol (Perlmol.org). PerlMol jest napisany w perlu zorientowanym obiektowo i można go pobrać z CPAN.

Demian
źródło