Quale struttura dati useresti per rappresentare un composto organico?

11

Ci sono buone strutture dati là fuori che possono essere usate 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 classificheresti? Esiste un buon modo per rappresentare le molecole, ma allo stesso tempo avere un efficiente metodo .contains() ?

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

    
posta Richarizardd 06.05.2015 - 21:33
fonte

2 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 es. C, N, O, Si perché puoi ottenere alcune combinazioni davvero funky. L'anello Benzene è un esempio molto semplice. Alcune varianti sostituiscono un azoto per uno dei Carboni e diventa stranamente veloce.

Vorrei iniziare con un oggetto "atom" con i vari tipi di atomi che ne ereditano.

Ogni oggetto "atomo" conterrebbe una lista di oggetti atomici per rappresentare i vari legami in modo tale che Azoto avrebbe una lista di dimensione fissa 3. Potrà quindi memorizzare i collegamenti con altri tre atomi. Un doppio legame potrebbe essere rappresentato come una voce duplicata.

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

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

Spero che abbia senso ...

    
risposta data 07.05.2015 - 05:11
fonte
4

La prima tentazione con la modellazione è usare una struttura 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 adeguata però.

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

Pensa a questo. I chimici hanno modellato composti organici da molto tempo ormai. Se mostri un chimico CH4, lo riconosceranno immediatamente come metano. Mostragli CH3CH2OH e lo riconosceranno come etanolo. Lo riconoscono perché identificano la combinazione CH3CH2 come un composto "et" (che significa due atomi di carbonio) e l'OH come un "anol" 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. Poteva avere metodi che identificavano le proprietà "speciali" del composto.

Un esempio di classe 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 è nella lingua che è esattamente nel dominio aziendale dell'utente finale. Tutto ciò che gli sviluppatori devono sapere sono le stringhe da cercare, che possono essere facilmente fornite da un libro di testo o da un farmacista.

Se sono necessarie rappresentazioni strutturali di queste sostanze chimiche, suggerisco di cercare di mantenere le rappresentazioni SMILES della formula.

Rappresentazione della formula chimica SMILES

    
risposta data 07.05.2015 - 03:16
fonte

Leggi altre domande sui tag