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.
data-structures
Richarizardd
la source
la source
Réponses:
(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 ...
la source
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 #:
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
la source