Какую структуру данных вы бы использовали для представления органического соединения?

11

Есть ли хорошие структуры данных, которые можно использовать для представления молекулы?

Я подумал, может быть, я представляю его как График, превращая каждый атом в вершину, однако для органических соединений характерно наличие большого количества атомов углерода и водорода. Как бы вы это посчитали? Есть ли хороший способ для представления молекул, но в то же время, есть эффективный .contains()метод?

Одним из самых основных применений для этого может быть проверка того, содержит ли соединение карбонильную группу, или бензиловый водород, или даже бензольное кольцо.

Richarizardd
источник
Связанный: scicomp.stackexchange.com/q/2081
scriptin
8
Я думаю, вы должны спросить химика. Они могут не знать, как его запрограммировать, но они точно знают, как представлять соединения, и имеют хотя бы большинство возможностей (например, они представляют бенсен только с шестиугольником). Кроме того, существуют некоторые уровни абстракции (белок описывается как последовательность аминокислот, а не как группа атомов). Как только вы поймете, как изобразить это на бумаге, часть программирования должна быть достаточно простой
SJuan76
Это отличный вопрос. Надеюсь, у меня будет возможность добавить некоторые мысли чуть позже.
Стивен
2
Помните две вещи: помните, что атомы могут иметь разные изотопы, и помните, что некоторые соединения имеют одинаковые элементы, но различаются из-за местоположения связи .
Теластин

Ответы:

7

(Выпускник биохимии с 30-летним опытом разработки программного обеспечения)

Неорганические молекулы "относительно" просты. Интересными являются те, которые могут связываться друг с другом, например, C, N, O, Si, потому что вы можете получить действительно забавные комбинации. Бензольное кольцо - очень простой пример. Некоторые вариации заменяют азот на один из атомов углерода, и он быстро становится странным.

Я бы начал с объекта «атом» с различными типами атомов, наследуемых от него.

Каждый объект «атом» будет содержать список объектов атома для представления различных связей, поэтому у азота будет список фиксированного размера 3. Затем он может хранить ссылки на три других атома. Двойная связь может быть представлена ​​как повторяющаяся запись.

Каждый атом будет иметь встроенные правила о том, с чем он может юридически связываться и как.

Таким образом, вы можете составить достаточно сложные молекулы однозначно - потому что связь 3 на углероде # 1 связана с связью 1 на водороде 2 и т. Д.

Надеюсь, что это имеет смысл ...

mcottle
источник
4

Первое искушение при моделировании - это использовать структуру данных в стиле квад-дерева. Каждый атом углерода имеет четыре соединения, каждый кислород два и каждый водород один. Я не думаю, что это правильное решение, хотя.

Я думаю, что правильное решение уже придумано. Используемая структура данных - это строка.

Подумай об этом. Химики уже довольно давно моделируют органические соединения. Если вы покажете химику CH4, они сразу узнают это как метан. Покажите им CH3CH2OH, и они узнают это как этанол. Они признают это, потому что они идентифицируют комбинацию CH3CH2 как «этильное» соединение (имеется в виду два атома углерода), а ОН как «анольную» или спиртовую группу.

У нас также есть существующая методология поиска и идентификации подстрок - регулярные выражения.

Таким образом, чтобы представить программно органическое соединение, я бы определил соединение как содержащее строку, представляющую его химическую формулу, и строку, определяющую его химическое название. У него могут быть методы, которые определяют, какие «особые» свойства у соединения.

Пример класса в 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);
    }
}

Очевидно, вам нужно написать класс nameCalculator, который вычисляет имя на основе формулы. Вам нужно создать регулярное выражение, которое определяет бензиновое кольцо. Определите дополнительные регулярные выражения для каждой из групп, которые вы хотите найти.

Преимущество моделирования соединений таким образом заключается в том, что он находится на языке, который находится в бизнес-сфере конечного пользователя. Все, что вам нужно знать разработчику, - это строки для поиска, которые могут быть легко предоставлены либо учебником, либо химиком.

Если требуются структурные представления этих химических веществ, я предлагаю рассмотреть возможность представления SMILES формул.

SMILES представление химической формулы

Стивен
источник
2
Как вы справляетесь с изомерами таким образом?
Это отличный вопрос. Оказывается, об этом уже думали. Я добавил информацию о представлении химической формулы SMILES в ответ.
Стивен
Существуют различные системы систематических имен, которые также могут использоваться в зависимости от того, какие свойства вы действительно хотите смоделировать
jk.