Welche Datenstruktur würden Sie verwenden, um eine organische Verbindung darzustellen?


11

Gibt es gute Datenstrukturen, mit denen ein Molekül dargestellt werden kann?

Ich dachte, ich könnte es als Graph darstellen, indem ich jedes Atom zu einem Scheitelpunkt mache. Es ist jedoch üblich, dass organische Verbindungen viele Kohlenstoffe und Wasserstoff enthalten. Wie würden Sie es nummerieren? Gibt es eine gute Möglichkeit, Moleküle darzustellen und gleichzeitig eine effiziente .contains()Methode zu haben?

Eine der grundlegendsten Anwendungen hierfür wäre die Überprüfung, ob eine Verbindung eine Carbonylgruppe oder einen benzylischen Wasserstoff oder sogar einen Benzolring enthält.



8
Ich denke, Sie sollten einen Chemiker fragen. Sie wissen vielleicht nicht, wie man es programmiert, aber sie wissen sicher, wie man Verbindungen darstellt, und haben über die meisten Möglichkeiten nachgedacht (zum Beispiel stellen sie Bencen nur mit einem Sechseck dar). Es gibt auch einige Abstraktionsstufen (ein Protein wird als eine Sequenz von Aminosäuren beschrieben, nicht als eine Gruppe von Atomen). Sobald Sie verstanden haben, wie man es in Papierform darstellt, sollte der Programmierteil recht einfach sein
SJuan76

Dies ist eine ausgezeichnete Frage. Hoffentlich bekomme ich später die Gelegenheit, ein paar Gedanken hinzuzufügen.
Stephen

2
Zwei Dinge, an die Sie sich erinnern sollten: Denken Sie daran, dass Atome unterschiedliche Isotope haben können, und denken Sie daran, dass einige Verbindungen dieselben Elemente haben, sich jedoch aufgrund der Bindungsstelle unterscheiden .
Telastyn

Antworten:


7

(Absolvent der Biochemie mit 30 Jahren Erfahrung in der Softwareentwicklung)

Nichtorganische Moleküle sind "relativ" einfach. Die interessanten sind diejenigen, die sich mit sich selbst verbinden können, z. B. C, N, O, Si, weil Sie einige wirklich funky Kombinationen erhalten können. Der Benzolring ist ein sehr einfaches Beispiel. Einige Variationen ersetzen einen der Kohlenstoffe durch Stickstoff und es wird schnell komisch.

Ich würde mit einem "Atom" -Objekt beginnen, dessen verschiedene Atomtypen von ihm erben.

Jedes "Atom" -Objekt würde eine Liste von Atomobjekten enthalten, um die verschiedenen Bindungen darzustellen, so dass Stickstoff eine Liste mit fester Größe 3 haben würde. Es könnte dann Verknüpfungen zu drei anderen Atomen speichern. Eine Doppelbindung könnte als doppelter Eintrag dargestellt werden.

In jedes Atom wären Regeln eingebettet, an was und wie es sich legal binden kann.

Sie können also einigermaßen komplizierte Moleküle eindeutig bilden - da Bindung 3 am Kohlenstoff Nr. 1 mit Bindung 1 am Wasserstoff 2 usw. verbunden ist.

Hoffe das macht Sinn ...


4

Die erste Versuchung bei der Modellierung besteht darin, eine Datenstruktur im Quad-Tree-Stil zu verwenden. Jedes Kohlenstoffatom hat vier Verbindungen, jeder Sauerstoff zwei und jeder Wasserstoff eins. Ich denke jedoch nicht, dass dies die richtige Lösung ist.

Ich denke, dass die richtige Lösung bereits erfunden wurde. Die zu verwendende Datenstruktur ist eine Zeichenfolge.

Denk darüber nach. Chemiker modellieren seit geraumer Zeit organische Verbindungen. Wenn Sie einen Chemiker CH4 zeigen, wird dieser sofort als Methan erkannt. Zeigen Sie ihnen CH3CH2OH und sie werden das als Ethanol erkennen. Sie erkennen dies, weil sie die CH3CH2-Kombination als "eth" -Verbindung (dh zwei Kohlenstoffatome) und das OH als "Anol" - oder Alkoholgruppe identifizieren.

Wir haben auch eine bereits vorhandene Methode zum Suchen und Identifizieren von Teilzeichenfolgen - reguläre Ausdrücke.

Um eine organische Verbindung programmatisch darzustellen, würde ich eine Verbindung so definieren, dass sie eine Zeichenfolge enthält, die ihre chemische Formel darstellt, und eine Zeichenfolge, die ihren chemischen Namen definiert. Es könnte Methoden geben, die identifizieren, welche "besonderen" Eigenschaften die Verbindung hatte.

Eine Beispielklasse in C #:

public class OrganicCompound
{
    private Regex benzineRingRegex;

    public OrganicCompound(string formula, NameCalculator nameCalculator, Regex benzineRingRegex)
    {
        this.Formula = formula;
        this.Name = nameCalculator.CalculateName(formula);
        this.benzineRingRegex = benzineRingRegex
    }

    public string Formula { get; private set; }

    public string Name { get; private set; }

    public bool HasBenzeneRing() 
    { 
        return Regex.IsMatch(this.Formula, benzineRingRegex);
    }
}

Natürlich müssten Sie die Klasse nameCalculator schreiben, die den Namen basierend auf der Formel berechnet. Sie müssten den regulären Ausdruck erstellen, der einen Benzinring definiert. Definieren Sie zusätzliche reguläre Ausdrücke für jede der Gruppen, nach denen Sie suchen möchten.

Der Vorteil der Modellierung der Verbindungen auf diese Weise liegt in der Sprache, die genau im Geschäftsbereich des Endbenutzers liegt. Alles, was Sie als Entwickler wissen müssen, sind die zu suchenden Zeichenfolgen, die entweder von einem Lehrbuch oder einem Chemiker bereitgestellt werden können.

Wenn strukturelle Darstellungen dieser Chemikalien erforderlich sind, empfehle ich, die SMILES-Darstellungen der Formel beizubehalten.

SMILES Darstellung der chemischen Formel


2
Wie geht man so mit Isomeren um ?

Das ist eine gute Frage. Es stellt sich heraus, dass darüber bereits nachgedacht wurde. Ich habe der Antwort Informationen zur Darstellung der chemischen Formel SMILES hinzugefügt.
Stephen

Es gibt verschiedene systematische Namenssysteme, die auch verwendet werden können, je nachdem, welche Eigenschaften Sie tatsächlich modellieren möchten
jk.
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.