Quale struttura di dati useresti per rappresentare un composto organico?


11

Esistono buone strutture di dati là fuori che possono essere utilizzate per rappresentare una molecola?

Stavo pensando che forse lo rappresento come un grafico rendendo ogni atomo un vertice, tuttavia è comune che i composti organici abbiano molti carboni e idrogeni. Come lo numereresti? C'è un buon modo per rappresentare le molecole, ma allo stesso tempo avere un .contains()metodo efficiente ?

Uno degli usi più basilari per questo sarebbe verificare se un composto contiene un gruppo carbonile, un idrogeno benzilico o persino un anello benzenico.



8
Penso che dovresti chiedere a un chimico. Potrebbero non sapere come programmarlo, ma sanno sicuramente come rappresentare i composti e hanno comunque pensato alla maggior parte delle possibilità (per esempio, rappresentano il bencene solo con un esagono). Inoltre, ci sono alcuni livelli di astrazione (una proteina è descritta come una sequenza di aminoacidi, non come un gruppo di atomi). Una volta capito come rappresentarlo su carta, la parte di programmazione dovrebbe essere abbastanza semplice
SJuan76

Questa è un'ottima domanda Spero di avere la possibilità di aggiungere qualche pensiero più tardi.
Stephen,

2
Due cose da ricordare: ricordare che gli atomi possono avere isotopi diversi e ricordare che alcuni composti hanno gli stessi elementi, ma sono diversi a causa della posizione di legame .
Telastyn,

Risposte:


7

(Laureato in biochimica con 30 anni di esperienza nello sviluppo di software)

Le molecole non organiche sono "relativamente" semplici. Quelli interessanti sono quelli che possono legarsi con se stessi, ad esempio C, N, O, Si perché puoi ottenere alcune combinazioni davvero funky. L'anello benzenico è un esempio molto semplice. Alcune varianti sostituiscono un azoto per uno dei carboni e diventa strano velocemente.

Vorrei iniziare con un oggetto "atomo" con i vari tipi di atomo che ereditano da esso.

Ogni oggetto "atomo" conterrebbe un elenco di oggetti atomici per rappresentare i vari legami in modo che l'azoto abbia un elenco di dimensioni fisse 3. Potrebbe quindi memorizzare collegamenti ad altri tre atomi. Un doppio legame potrebbe essere rappresentato come una voce duplicata.

Ogni atomo avrebbe regole incorporate su ciò a cui legalmente può legarsi e su come.

Quindi puoi creare molecole ragionevolmente complicate in modo inequivocabile - perché il legame 3 sul Carbonio # 1 è collegato al legame 1 su Idrogeno 2 ecc.

Spero che abbia un senso ...


4

La prima tentazione con la modellazione è quella di utilizzare una struttura di dati in stile quad-tree. Ogni atomo di carbonio ha quattro connessioni, ciascuna di ossigeno due e ciascuna di idrogeno. Non penso che questa sia la soluzione corretta.

Penso che la soluzione corretta sia già stata inventata. La struttura dei dati da utilizzare è una stringa.

Pensaci. I chimici hanno modellato i composti organici per molto tempo ormai. Se mostri un chimico CH4, lo riconosceranno immediatamente come metano. Mostra loro CH3CH2OH e lo riconosceranno come etanolo. Lo riconoscono perché identificano la combinazione CH3CH2 come un composto "eth" (che significa due atomi di carbonio) e l'OH come un "anolo" o gruppo alcolico.

Abbiamo anche una metodologia preesistente per la ricerca e l'identificazione di sottostringhe - espressioni regolari.

Quindi per rappresentare programmaticamente un composto organico, definirei un composto contenente una stringa che rappresenta la sua formula chimica e una stringa che definisce il suo nome chimico. Potrebbe avere metodi che identificano le proprietà "speciali" del composto.

Una classe di esempio 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);
    }
}

Ovviamente dovresti scrivere la classe nameCalculator, che calcola il nome in base alla formula. Dovresti creare la regex che definisce un anello di benzina. Definisci regex extra per ciascuno dei gruppi che desideri cercare.

Il vantaggio di modellare i composti in questo modo è che è nella lingua che è esattamente nel dominio aziendale dell'utente finale. Tutto ciò che lo sviluppatore deve sapere sono le stringhe da cercare, che possono essere facilmente fornite da un libro di testo o da un chimico.

Se sono necessarie rappresentazioni strutturali di questi prodotti chimici, suggerisco di cercare di mantenere le rappresentazioni SMILES della formula.

SMILES rappresentazione della formula chimica


2
Come gestite gli isomeri in questo modo?

Questa è un'ottima domanda. Si scopre che questo è già stato pensato. Ho aggiunto informazioni sulla rappresentazione della formula chimica SMILES nella risposta.
Stephen,

ci sono vari sistemi di nomi sistematici che possono anche essere usati a seconda delle proprietà che vuoi veramente modellare
jk.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.