¿Qué estructura de datos usarías para representar un compuesto orgánico?

11

¿Hay alguna buena estructura de datos que pueda usarse para representar una molécula?

Estaba pensando que tal vez lo represento como un Gráfico al hacer que cada átomo sea un vértice, sin embargo, es común que los compuestos orgánicos tengan muchos Carbones e Hidrógenos. ¿Cómo lo numerarías? ¿Hay una buena manera de representar moléculas, pero al mismo tiempo, tener un .contains()método eficiente ?

Uno de los usos más básicos para esto sería verificar si un compuesto contiene un grupo carbonilo, o un hidrógeno bencílico, o incluso un anillo de benceno.

Richarizardd
fuente
Relacionado: scicomp.stackexchange.com/q/2081
scriptin
8
Creo que deberías preguntarle a un químico. Es posible que no sepan cómo programarlo, pero sí saben cómo representar compuestos y tienen en cuenta la mayoría de las posibilidades (por ejemplo, representan benceno solo con un hexágono). Además, hay algunos niveles de abstracción (una proteína se describe como una secuencia de aminoácidos, no como un grupo de átomos). Una vez que comprenda cómo representarlo en papel, la parte de programación debería ser bastante sencilla
SJuan76
Esta es una excelente pregunta. Espero tener la oportunidad de agregar algunos pensamientos más adelante.
Stephen
2
Dos cosas para recordar: recuerde que los átomos pueden tener isótopos diferentes, y recuerde que algunos compuestos tienen los mismos elementos, pero son diferentes debido a la ubicación del enlace .
Telastyn

Respuestas:

7

(Graduado en bioquímica con 30 años de experiencia en desarrollo de software)

Las moléculas no orgánicas son "relativamente" simples. Los interesantes son los que pueden unirse entre sí, por ejemplo, C, N, O, Si porque puedes obtener algunas combinaciones realmente originales. El anillo de benceno es un ejemplo muy simple. Algunas variaciones sustituyen un Nitrógeno por uno de los Carbones y se vuelve extraño rápidamente.

Comenzaría con un objeto "átomo" con los diversos tipos de átomos que heredan de él.

Cada objeto "átomo" contendría una lista de objetos atómicos para representar los diversos enlaces, por lo que Nitrógeno tendría una lista de tamaño fijo 3. Luego podría almacenar enlaces a otros tres átomos. Un doble enlace podría representarse como una entrada duplicada.

Cada átomo tendría reglas incrustadas sobre a qué puede vincularse legalmente y cómo.

Por lo tanto, puede formar moléculas razonablemente complicadas sin ambigüedades, porque el enlace 3 en el Carbono # 1 está vinculado al enlace 1 en el Hidrógeno 2, etc.

Espero que tenga sentido ...

mcottle
fuente
4

La primera tentación con modelar esto es usar una estructura de datos de estilo de cuatro árboles. Cada átomo de carbono tiene cuatro conexiones, cada oxígeno dos y cada uno de hidrógeno. Sin embargo, no creo que esta sea la solución adecuada.

Creo que la solución adecuada ya se ha inventado. La estructura de datos a usar es una cadena.

Piensa sobre esto. Los químicos han estado modelando compuestos orgánicos durante bastante tiempo. Si le muestra a un químico CH4, inmediatamente lo reconocerán como metano. Muéstreles CH3CH2OH y lo reconocerán como etanol. Reconocen esto porque identifican la combinación CH3CH2 como un compuesto "eth" (que significa dos átomos de carbono) y el OH como un grupo "anol" o alcohol.

También tenemos una metodología preexistente para buscar e identificar subcadenas: expresiones regulares.

Entonces, para representar programáticamente un compuesto orgánico, definiría un compuesto como que contiene una cadena que representa su fórmula química y una cadena que define su nombre químico. Podría tener métodos que identificaran qué propiedades "especiales" tenía el compuesto.

Una clase de ejemplo 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);
    }
}

Obviamente, necesitaría escribir la clase nameCalculator, que calcula el nombre a partir de la fórmula. Debería crear la expresión regular que define un anillo de bencina. Defina expresiones regulares adicionales para cada uno de los grupos que desea buscar.

La ventaja de modelar los compuestos de esta manera es que está en el lenguaje que se encuentra exactamente en el dominio comercial del usuario final. Todo lo que usted, como desarrollador, necesita saber son las cadenas que debe buscar, que pueden ser proporcionadas fácilmente por un libro de texto o por un químico.

Si se requieren representaciones estructurales de estos químicos, sugiero buscar mantener representaciones de la fórmula en SONRISA.

Representaciones de la fórmula química de SMILES

Stephen
fuente
2
¿Cómo manejas los isómeros de esta manera?
Esa es una gran pregunta. Resulta que esto ya se ha pensado. He agregado información sobre la representación de la fórmula química SMILES en la respuesta.
Stephen
existen varios sistemas de nombres sistemáticos que también podrían usarse según las propiedades que realmente desee modelar
jk.