Quelle structure de données utiliseriez-vous pour représenter un composé organique?

11

Existe-t-il de bonnes structures de données qui peuvent être utilisées pour représenter une molécule?

Je pensais peut-être que je le représentais comme un graphique en faisant de chaque atome un sommet, cependant, il est courant que les composés organiques contiennent beaucoup de carbones et d'hydrogènes. Comment le numéroteriez-vous? Existe-t-il un bon moyen de représenter les molécules, mais en même temps, avez-vous une .contains()méthode efficace ?

L'une des utilisations les plus élémentaires serait de vérifier si un composé contient un groupe carbonyle, ou un hydrogène benzylique, ou même un cycle benzénique.

Richarizardd
la source
8
Je pense que vous devriez demander à un chimiste. Ils ne savent peut-être pas comment le programmer, mais ils savent certainement comment représenter les composés, et ils ont pensé à la plupart des possibilités (par exemple, ils représentent le bencène juste avec un hexagone). En outre, il existe certains niveaux d'abstraction (une protéine est décrite comme une séquence d'acides aminés, pas comme un groupe d'atomes). Une fois que vous comprenez comment le représenter sur papier, la partie programmation devrait être assez simple
SJuan76
Ceci est une excellente question. J'espère que j'aurai l'occasion d'ajouter quelques réflexions un peu plus tard.
Stephen
2
Deux choses à retenir: rappelez-vous que les atomes peuvent avoir différents isotopes et rappelez-vous que certains composés ont les mêmes éléments, mais sont différents en raison de l'emplacement de la liaison .
Telastyn

Réponses:

7

(Diplômé en biochimie avec 30 ans d'expérience en développement de logiciels)

Les molécules non organiques sont «relativement» simples. Les plus intéressants sont ceux qui peuvent se lier avec eux-mêmes, par exemple C, N, O, Si, car vous pouvez obtenir des combinaisons vraiment géniales. La bague Benzène est un exemple très simple. Certaines variantes remplacent un azote par l'un des carbones et cela devient vite bizarre.

Je commencerais par un objet "atom" avec les différents types d'atomes qui en héritent.

Chaque objet "atome" contiendrait une liste d'objets atomiques pour représenter les différentes liaisons, de sorte que l'azote aurait une liste de taille fixe 3. Il pourrait alors stocker des liens vers trois autres atomes. Une double liaison peut être représentée comme une entrée en double.

Chaque atome aurait des règles intégrées sur ce à quoi il peut légalement se lier et comment.

Vous pouvez donc créer des molécules raisonnablement complexes sans ambiguïté - car la liaison 3 sur le carbone # 1 est liée à la liaison 1 sur l'hydrogène 2, etc.

J'espère que cela a du sens ...

mcottle
la source
4

La première tentation de la modélisation consiste à utiliser une structure de données de style à quatre arbres. Chaque atome de carbone a quatre connexions, chaque oxygène deux et chaque hydrogène. Je ne pense pas que ce soit la bonne solution.

Je pense que la bonne solution a déjà été inventée. La structure de données à utiliser est une chaîne.

Penses-y. Les chimistes modélisent les composés organiques depuis assez longtemps maintenant. Si vous montrez un chimiste CH4, il le reconnaîtra immédiatement comme du méthane. Montrez-leur CH3CH2OH et ils le reconnaîtront comme de l'éthanol. Ils le reconnaissent parce qu'ils identifient la combinaison CH3CH2 comme un composé "eth" (signifiant deux atomes de carbone) et l'OH comme un groupe "anol" ou alcool.

Nous avons également une méthodologie préexistante pour rechercher et identifier les sous-chaînes - expressions régulières.

Donc, pour représenter par programme un composé organique, je définirais un composé comme contenant une chaîne qui représente sa formule chimique et une chaîne définissant son nom chimique. Il pourrait avoir des méthodes permettant d'identifier les propriétés "spéciales" du composé.

Un exemple de classe en 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);
    }
}

De toute évidence, vous devez écrire la classe nameCalculator, qui calcule le nom en fonction de la formule. Vous auriez besoin de créer l'expression régulière qui définit un cycle de benzine. Définissez des expressions rationnelles supplémentaires pour chacun des groupes que vous souhaitez rechercher.

L'avantage de modéliser les composés de cette façon est que c'est dans le langage qui appartient exactement au domaine d'activité de l'utilisateur final. Tout ce que vous, le développeur, devez savoir, ce sont les chaînes à rechercher, qui peuvent facilement être fournies par un manuel ou un chimiste.

Si des représentations structurelles de ces produits chimiques sont nécessaires, je suggère de chercher à conserver les représentations SMILES de la formule.

Représentation de la formule chimique de SMILES

Stephen
la source
2
Comment gérez-vous les isomères de cette façon?
Voilà une excellente question. Il s'avère que cela a déjà été pensé. J'ai ajouté des informations sur la représentation de la formule chimique SMILES dans la réponse.
Stephen
il existe différents systèmes de noms systématiques qui pourraient également être utilisés en fonction des propriétés que vous souhaitez réellement modéliser
jk.