Que estrutura de dados você usaria para representar um composto orgânico?

11

Existem boas estruturas de dados por aí que podem ser usadas para representar uma molécula?

Eu estava pensando que talvez eu o represente como um gráfico, transformando cada átomo em um vértice; no entanto, é comum que compostos orgânicos tenham muitos carbonos e hidrogênios. Como você o numeraria? Existe uma boa maneira de representar moléculas, mas ao mesmo tempo, ter um .contains()método eficiente ?

Um dos usos mais básicos para isso seria verificar se um composto contém um grupo carbonil, ou um hidrogênio benzílico, ou mesmo um anel benzeno.

Richarizardd
fonte
Veja também: scicomp.stackexchange.com/q/2081
scriptin
8
Eu acho que você deveria perguntar a um químico. Eles podem não saber como programá-lo, mas com certeza sabem como representar compostos, e têm a maioria das possibilidades (por exemplo, representam bencene apenas com um hexágono). Além disso, existem alguns níveis de abstração (uma proteína é descrita como uma sequência de aminoácidos, não como um grupo de átomos). Depois de entender como para representá-lo no papel, a parte de programação deve ser bastante simples
SJuan76
Esta é uma excelente pergunta. Espero ter a chance de acrescentar alguns pensamentos mais tarde.
Stephen
2
Duas coisas a serem lembradas: lembre-se de que os átomos podem ter isótopos diferentes e lembre-se de que alguns compostos têm os mesmos elementos, mas são diferentes devido à localização da ligação .
Telastyn

Respostas:

7

(Graduado em Bioquímica com 30 anos de experiência em desenvolvimento de software)

Moléculas não orgânicas são "relativamente" simples. Os interessantes são os que podem se unir, por exemplo, C, N, O, Si, porque você pode obter algumas combinações realmente divertidas. O anel benzeno é um exemplo muito simples. Algumas variações substituem um nitrogênio por um dos carbonos e fica estranho rapidamente.

Eu começaria com um objeto "átomo" com os vários tipos de átomos herdados dele.

Cada objeto "átomo" conteria uma lista de objetos átomos para representar as várias ligações, de modo que o nitrogênio teria uma lista de tamanho fixo 3. Ele poderia então armazenar links para outros três átomos. Uma ligação dupla pode ser representada como uma entrada duplicada.

Cada átomo teria regras embutidas sobre o que pode legalmente se vincular e como.

Assim, você pode criar moléculas razoavelmente complicadas sem ambiguidade - porque a ligação 3 no carbono nº 1 está ligada à ligação 1 no hidrogênio 2, etc.

Espero que faça sentido ...

mcottle
fonte
4

A primeira tentação de modelar isso é usar uma estrutura de dados no estilo de quatro árvores. Cada átomo de carbono tem quatro conexões, cada oxigênio dois e cada hidrogênio um. Eu não acho que essa seja a solução adequada.

Eu acho que a solução adequada já foi inventada. A estrutura de dados a ser usada é uma sequência.

Pense sobre isso. Os químicos vêm modelando compostos orgânicos há bastante tempo. Se você mostrar um químico CH4, eles o reconhecerão imediatamente como metano. Mostre a eles CH3CH2OH e eles reconhecerão isso como etanol. Eles reconhecem isso porque identificam a combinação CH3CH2 como um composto "eth" (significando dois átomos de carbono) e o OH como um grupo "anol" ou álcool.

Também temos uma metodologia pré-existente para pesquisar e identificar substrings - expressões regulares.

Então, para representar programaticamente um composto orgânico, eu definiria um composto como contendo uma cadeia que representa sua fórmula química e uma cadeia que define seu nome químico. Poderia ter métodos que identificassem quais propriedades "especiais" o composto possuía.

Um exemplo de classe em 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, você precisaria escrever a classe nameCalculator, que calcula o nome com base na fórmula. Você precisaria criar o regex que define um anel de benzina. Defina regexes extras para cada um dos grupos que você deseja pesquisar.

A vantagem de modelar os compostos dessa maneira é a linguagem exatamente no domínio comercial do usuário final. Tudo que você, como desenvolvedor, precisa saber são as sequências a serem pesquisadas, que podem ser facilmente fornecidas por um livro de texto ou por um químico.

Se forem necessárias representações estruturais desses produtos químicos, sugiro procurar manter as representações SMILES da fórmula.

Representação da fórmula química SMILES

Stephen
fonte
2
Como você lida com isômeros dessa maneira?
Essa é uma ótima pergunta. Acontece que isso já foi pensado. Eu adicionei informações sobre a representação da fórmula química SMILES na resposta.
7305 Stephen
existem vários sistemas de nomes sistemáticos que também podem ser usados ​​dependendo de quais propriedades você deseja modelar
jk.