Erstellen eines molekularen Editors / Visualisierers: Objektorientierte Programmierung, Datenstrukturen und Moleküle


12

Ich bin neu in der Programmierung und ich versuche mein erstes großes Problem zu lösen und mein erstes großes Programm zu schreiben. Ich habe nach Open-Source-Beispielen für Code gesucht, von denen ich lernen kann, aber bisher nur Code in Sprachen gefunden, die ich nicht vollständig verstehe oder die verwandte, aber immer noch zu weit entfernte Dinge tun, von denen ich wirklich lernen kann. Ich habe hier einige konzeptionelle Probleme.

Ich möchte mit einer einfachen Software kleine organische Moleküle erstellen, modifizieren und später darstellen. Dies ist hauptsächlich eine Lernübung. Ein Benutzer würde eine SMILES-Zeichenfolge eingeben oder aus einem Basissatz von Startermolekülen auswählen und könnte dann entweder grafisch oder über eine Texteingabesyntax auf diesem Molekül aufbauen. Ich bin jedoch noch nicht einmal an diesem Punkt der Komplexität. Ich kann nicht einmal vollständig verstehen, wie man Klassen / Objekte zum Speichern der Moleküle herstellt. Meine Frage ist also kurz und bündig: Wie verwende ich Klassen / Objekte zum Aufbau von Molekülen, während alle Informationsebenen erhalten bleiben, und welche Datenstrukturen sollten als Attribute für welche Objekte verwendet werden? Und können Objekte Attribute für andere Objekte sein?

Hier ist mein bisheriger Gedankengang: Ich habe mir überlegt, eine "Molecule" -Klasse, dann eine "Atom" -Klasse / Unterklasse und eine "Bond" -Klasse und vielleicht auch eine "FunctionalGroup" -Klasse zu haben. Das scheint ein guter Anfang zu sein, aber vielleicht verstehe ich OOP falsch und das ist schlecht. Aber dann wird mein Problem (für mich) wirklich verwirrend. Obwohl ich alle diese Konzepte / Ideen / Klassen habe, verstehe ich nicht genau, welche Datenstrukturen zur Darstellung des Moleküls erforderlich sind. Eine Atomliste wäre eine gute Sache. Könnte diese Liste eine Liste von Atom-Objekten sein? Ich müsste auch eine Möglichkeit haben, Konnektivität zu speichern. Eine 2D-Matrix scheint eine gute Idee zu sein, bei der die Bindungsreihenfolge als ganze Zahlen in den Matrixpositionen angegeben wird.

An diesem Punkt fange ich an, mit der Aufgabe überwältigt zu werden. Ist alles, was ich bisher mache, sinnvoll? Das Anbringen eines Anzeige- / Zeichnungsaspekts darüber kann bedeuten, dass ich viele dieser Dinge neu schreiben / überarbeiten muss, aber ich versuche nur, an einen Punkt zu gelangen, an dem ich zumindest Moleküle mit den relevanten Daten speichern und dann darauf zugreifen kann diese Daten zu überprüfen / ändern. Ich habe darüber nachgedacht, dies in Python zu tun, sodass der Code / die Klassen möglicherweise so aussehen würden: http://pastebin.com/uUi1BMzr

Vielleicht ist dies wirklich eine Programmierfrage für StackOverflow, aber ich dachte, es wäre spezifisch genug, um hierher zu kommen. Jede Unterstützung wäre sehr dankbar, auch wenn Sie nur darauf hinweisen, wo ich konzeptionelle Fehler gemacht habe. Danke im Voraus.


1
Außerdem habe ich für alle, die versuchen, etwas Ähnliches zu tun, gerade ein nettes Open-Source-Python-Paket gefunden, das mir bei einigen Konzepten namens MMTK für das Tool-Kit für die Molekularmechanik geholfen hat.
Nate

1
Haben Sie sich OpenBabel angesehen? Das sollte alles zur Hand haben, was Sie brauchen.
Deathbreath

Antworten:


5

Das Schreiben von Software ist ein iterativer Prozess - Code schreiben -> sehen, wie weit Sie kommen, dann planen Sie die nächsten Schritte -> Code schreiben -> wiederholen. In diesem Stadium des Kunstlernens würde ich vorschlagen, dass Sie bald einsteigen, um das Wasser zu testen. Sie müssen das gesamte System nicht im Voraus planen. Ja, Python wäre eine gute Muttersprache. Probieren Sie zur Visualisierung MatPlotLib aus, auch NumPy und SciPy sind praktisch. Software im industriellen Maßstab stützt sich immer darauf, vorab erstellte Bibliotheken einzuspielen, anstatt alles selbst zu schreiben, und dennoch können und sollten einfache Lösungen selbst geschrieben werden, insbesondere beim Erlernen des Programmierens. Ihr OO-Layout scheint vorerst in Ordnung zu sein. Wenn sich Ihre Objektbeziehungen später ändern müssen, ist es eine wertvolle Erfahrung, den Code selbst neu zu faktorisieren. Willkommen an Bord !


Danke für die Eingabe. Ich werde einfach weitermachen. Ich lerne auch ein bisschen über das Übergeben und Mutieren von Objektattributen / -variablen. Es ist wirklich faszinierend, etwas aus der realen Welt zu nehmen und es im Computercode darzustellen.
Nate

9

Ihr Ziel hat viele Herausforderungen. Ich werde sie in Teile zerlegen.

SMILES ist keine triviale Sprache zum Parsen, und die Regeln für die Wahrnehmung von Aromen sind nicht genau definiert. Die detaillierte Grammatikdefinition aus dem OpenSMILES-Projekt sollte einigen helfen.

SMILES definiert die Topologie, gibt jedoch keine 2D- oder 3D-Informationen an. Beides zu machen ist schwer. (Das heißt, wenn Sie wollen, dass es schön aussieht.)

In Wirklichkeit sollten Sie sich das RDKit-Toolkit für Cheminformatik (oder OpenBabel, aber ich bevorzuge RDKit) ansehen. Es hat einen eingebauten SMILES-Parser sowie ein 2D-Layout, und ich glaube, dass eine 3D-Konformation erzeugt wird. OpenBabel auch.

Dann müssen Sie für die Anzeige das GUI-System herausfinden. Tatsächlich ist hier das CDK-Toolkit für die Cheminformatik in Java am weitesten fortgeschritten.

Aber Sie sind in den Grundlagen der Darstellung eines Moleküls. Es gibt Unterschiede zwischen Datenmodellen mit kleinen und großen Molekülen (Protein, DNA). Da Sie sich jedoch für SMILES interessieren, bedeutet dies, dass Sie sich an kleinen Molekülen orientieren.

Sie können sich unter anderem die API-Dokumente für RDKit, OpenBabel, CDK, OEChem und Indigo ansehen. Auf diese Weise erhalten Sie eine Vorstellung von den verschiedenen Möglichkeiten, mit denen Benutzer ihre Klassen-API entwickeln. Von diesen bevorzuge ich OEChem am meisten, gefolgt von RDKit. Obwohl es sich bei OEChem um Open Source handelt, ist die API online und frei lesbar, zusammen mit Anwendungsbeispielen.

Kurz gesagt, haben Sie eine Molecule-Klasse mit einer Liste von Atom- und Bond-Instanzen. "mol.AddAtom (Elementnummer)" erstellt ein neues Atom ohne Bindungen, "mol.AddBond (Atom1, Atom2, Bindungstyp)" stellt eine Bindungsverbindung her. Jede Bindung muss die Atome kennen, mit denen sie verbunden ist, und jedes Atom benötigt eine Liste von Bindungen. Dies führt zu vielen Zyklen in der Datenstruktur, die jedoch erforderlich sind, damit verschiedene Algorithmen wie die Konnektivitätssuche in linearer Zeit ausgeführt werden können.

Verwenden Sie keine 2D-Matrix. Obwohl es für ein kleines Molekül machbar ist, skaliert es nicht so gut und es ist nicht nötig. Nur wenige Algorithmen benötigen eine Konnektivitätsmatrix, die bei Bedarf problemlos generiert werden kann.

Ich habe keine "FunctionalGroup". Es ist zu spezialisiert. Verwenden Sie eine Art "Teilmenge" oder "Fragment", die die Liste der Atome und Bindungen enthält, an denen Sie interessiert sind. Auf diese Weise können Sie unter Bezugnahme auf auch Dinge wie "ausgewählte Atome" und "Ring-Teilstruktur" und "Gerüst" behandeln die spezifische Teilmenge.

Ich habe auf deinen Pastebin geschaut. Der Parser sollte nicht so funktionieren. Sie sollten das Parsen von Ihrer tatsächlichen Molekülstruktur trennen. Versuchen Sie so etwas:

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

und dann ist der Parser für eine einfache lineare Kette wie "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

Natürlich ist ein vollständiger SMILES-Parser viel komplizierter, und das vollständige Datenmodell muss Dinge wie Wasserstoffzählungen verarbeiten, die häufig implizit sind.

Die OpenBabel-, RDKit- und CDK-Mailinglisten sind ebenfalls eine gute Adresse, wenn Sie eines dieser Toolkits verwenden möchten. Es gibt auch die von Shapado gehostete Q & A-Site "Blue Obelisk".


1

Ein anderer Ansatz für den Einstieg könnte darin bestehen, einen Blick auf Code zu werfen, der bereits etwas mit Ihrem Problem zu tun hat. In diesem Fall könnte Ihre Übung sogar in einem anderen Programm enden, und das wäre schön, nicht wahr?

Programme, die für Sie von Interesse sein könnten, sind

  • Das MD-Simulations- und Molekülmodellierungspaket MMTK (wie bereits von Nate oben vorgeschlagen)

  • Das Visualisierungspaket PyMol


1

Das Erlernen der Details eines molekularen Objektsystems ist für Chemiker eine wunderbare Möglichkeit, objektorientiertes Programmieren zu erlernen. Sie werden feststellen, dass die Implementierung eines solchen Systems Ihre molekularen Intuitionen verfeinern wird. Sie sollten sich einige Gedanken über Atome, Moleküle und möglicherweise Sammlungen von Molekülen in Bezug auf Attribute und Methoden machen.

Hier sind ein paar nette (etwas ältere) Python-Folien, die vielleicht helfen: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Zur Überprüfung Ihrer Arbeit: Neben openbabel (mit Python-Bindungen!) Und MMTK gibt es ELBOW in Phenix.

Für die Polyglotte in dir gibt es auch PerlMol (Perlmol.org). PerlMol ist in objektorientiertem Perl geschrieben und kann von CPAN heruntergeladen werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.