有機化合物を表すためにどのデータ構造を使用しますか?


11

分子を表すために使用できる優れたデータ構造はありますか?

すべての原子を頂点にすることでグラフとして表現できると考えていましたが、有機化合物には多くの炭素と水素が含まれているのが一般的です。どのように番号を付けますか?分子を表現する良い方法はありますが、同時に効率的な.contains()方法がありますか?

これの最も基本的な用途の1つは、化合物にカルボニル基、ベンジル水素、またはベンゼン環が含まれているかどうかを確認することです。



8
化学者に尋ねるべきだと思います。彼らはそれをプログラムする方法を知らないかもしれませんが、化合物を表現する方法を知っており、ほとんどの可能性について知っています(例えば、彼らは六角形だけでベンセンを表します)。また、いくつかの抽象化レベルがあります(タンパク質は、原子のグループとしてではなく、アミノ酸のシーケンスとして記述されます)。紙でそれを表現する方法を理解したら、プログラミングの部分は非常に簡単です
SJuan76

これは素晴らしい質問です。うまくいけば、後で少し考えを追加する機会が得られるでしょう。
スティーブン

2
覚えておくべき2つのこと:原子は異なる同位体を持つことができることを忘れないでください。また、いくつかの化合物は同じ元素を持っていますが、結合位置のために異なることを忘れないでください。
テラスティン

回答:


7

(30年のソフトウェア開発経験を持つ生化学の卒業生)

非有機分子は「比較的」単純です。面白いものは、C、N、O、Siなど、自分自身と結合できるものです。なぜなら、いくつかの本当にファンキーな組み合わせが得られるからです。ベンゼン環は非常に簡単な例です。いくつかのバリエーションは、炭素の1つを窒素に置き換えて、奇妙に速くなります。

さまざまなタイプのアトムを継承する「atom」オブジェクトから始めます。

各「原子」オブジェクトには、さまざまな結合を表す原子オブジェクトのリストが含まれているため、窒素には固定サイズ3のリストがあります。その後、他の3つの原子へのリンクを格納できます。二重結合は、重複したエントリとして表される可能性があります。

各アトムには、合法的に結合できるものとその方法に関するルールが組み込まれています。

したがって、炭素#1の結合3は水素2の結合1などにリンクされているため、合理的に複雑な分子を明確に構成できます。

理にかなっていることを願っています...


4

これをモデル化する最初の誘惑は、四分木スタイルのデータ構造を使用することです。各炭素原子には4つの接続があり、各酸素は2つ、各水素は1つです。しかし、これが適切な解決策だとは思いません。

適切な解決策はすでに発明されていると思います。使用するデータ構造は文字列です。

これについて考える。化学者は、有機化合物をかなり長い間モデリングしています。化学者CH4を表示すると、すぐにメタンとして認識されます。彼らにCH3CH2OHを見せれば、彼らはそれをエタノールとして認識するでしょう。彼らは、CH3CH2の組み合わせを「eth」化合物(2つの炭素原子を意味する)として識別し、OHを「アルコール」またはアルコール基として識別するため、これを認識します。

また、部分文字列(正規表現)を検索および識別するための既存の方法論もあります。

プログラムで有機化合物を表すために、化学式を表す文字列と化学名を定義する文字列を含む化合物を定義します。化合物がどの「特別な」特性を持っているかを特定するメソッドを持つことができます。

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が。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.