分子エディター/ビジュアライザーの作成:オブジェクト指向プログラミング、データ構造、分子


12

私はプログラミングが初めてで、最初の大きな問題を解決し、最初の大きなプログラムを作成しようとしています。私は学習するコードのオープンソースの例を探しましたが、これまでのところ、私が完全に理解していない言語、または関連するがまだあまりにも遠い言語のコードのみを見つけました。ここでいくつかの概念的な手順を実行するのに問題があります。

私は、小さな有機分子を構築し、修正し、後で表現するための簡単なソフトウェアを作りたいです。これは主に学習課題です。ユーザーは、SMILES文字列を指定するか、スターター分子の基本セットから選択し、グラフィカルに、またはテキスト入力構文を介してその分子を構築できます。しかし、私はまだ複雑さのその時点ではありません。クラス/オブジェクトを作成して分子を保存する方法を完全に理解することすらできません。だから、私の質問は簡潔に:すべてのレベルの情報を保持しながら分子を構築するためにクラス/オブジェクトをどのように使用し、どのオブジェクトの属性としてどのデータ構造を使用する必要がありますか?また、オブジェクトを他のオブジェクトの属性にすることはできますか?

これまでの私の思考の流れは次のとおりです。「分子」クラス、次に「アトム」クラス/サブクラス、「ボンド」サブクラス、そしておそらく「FunctionalGroup」サブクラスも考えていました。始めるには良い場所のように思えますが、OOPを誤解しているのかもしれませんが、これは悪いことです。しかし、その後、私の問題は本当に混乱します(私にとって)。これらの概念/アイデア/クラスはすべてありますが、分子を表現するためにどのデータ構造が必要かを完全には把握していません。原子のリストがあればいいでしょう。そのリストはAtomオブジェクトのリストですか?接続性を保存する方法も必要です。2Dマトリックスは、結合位置がマトリックス位置の整数であるため、良いアイデアのようです。

この時点で、私は仕事に圧倒され始めています。これまでにやっていることはすべて理にかなっていますか?この上に表示/描画アスペクトを追加することは、これらの多くのことを書き直し/再作業する必要があることを意味するかもしれませんが、少なくとも関連するデータで分子を保存してからアクセスできるポイントに到達しようとしていますチェック/変更するデータ。Pythonでこれを行うことを考えていたので、コード/クラスはおそらく次のようになります:http : //pastebin.com/uUi1BMzr

おそらくこれはStackOverflowのプログラミングの質問かもしれませんが、ここに行くのに十分具体的だと思いました。私が概念的な失敗をした場所を指摘しただけでも、どんな援助も大歓迎です。前もって感謝します。


1
また、似たようなことをしようとする人のために、MMTKという分子力学ツールキットの概念を助けてくれる素敵なオープンソースpythonパッケージを見つけました。
ネイト

1
OpenBabelを見たことがありますか?必要なものはすべて手元にあるはずです。
デスブレス

回答:


5

ソフトウェアの記述は反復プロセスです。コードを記述します->どこまで到達できるかを確認し、次のステップを計画します->コードを記述します->繰り返します。芸術を学ぶこの段階で、水をテストするためだけにすぐに飛び込むことをお勧めします。システム全体を事前に計画する必要はありません。はい、pythonは良い第一言語です。視覚化にはMatPlotLibを試してください。NumPyとSciPyも便利です。産業規模のソフトウェアは、すべてを自分で作成するのではなく、ビルド前のライブラリを取り込むことに常に依存していますが、特にプログラミングを学習する場合は、簡単なソリューションを自分で作成する必要があります。OOレイアウトは今のところOKのようです。オブジェクトの関係を後で変更する必要がある場合/その場合、コード自体をリファクタリングする行為は習得する価値のある経験です。ようこそ!


入力いただきありがとうございます。私はそれを続けるつもりです。また、オブジェクトの属性/変数の受け渡しと変更についても少し学んでいます。現実の世界から何かを得て、それをコンピューターコードで表現しようとするのは本当に魅力的です。
ネイト

9

あなたの目標には多くの課題があります。それらを部品に分解します。

SMILESは解析するのに簡単な言語ではありません。また、芳香性の知覚の規則は明確に定義されていません。OpenSMILESプロジェクトの詳細な文法定義が役立つ場合があります。

SMILESはトポロジを定義しますが、2Dまたは3Dの情報は提供しません。どちらかを作るのは難しいです。(つまり、見栄えを良くしたい場合です。)

本当に、RDKit cheminformaticsツールキット(またはOpenBabelですが、私はRDKitが好きです)を調べる必要があります。SMILESパーサーと2Dレイアウトが組み込まれており、3Dコンフォメーションの生成を信じています。OpenBabelも同様です。

次に、表示のためにGUIシステムを把握する必要があります。実際、ここではJavaのCDK cheminformaticsツールキットが最も先進的です。

しかし、あなたは分子を表現する方法の基本にいます。小分子と大分子(タンパク質、DNA)のデータモデルには違いがありますが、SMILESに興味があるため、低分子指向であることを意味します。

RDKit、OpenBabel、CDK、OEChem、およびIndigoなどのAPIドキュメントをご覧ください。これにより、人々がクラスAPIを開発するさまざまな方法がわかります。これらの中で、私はOEChemを最も好み、RDKitがそれに続きます。OEChemはオープンソースですが、APIはオンラインであり、使用例とともに自由に読むことができます。

つまり、AtomおよびBondインスタンスのリストを持つMoleculeクラスがあります。「mol.AddAtom(element number)」は結合のない新しい原子を作成し、「mol.AddBond(atom1、atom2、bond_type)」は結合接続を作成します。各結合は、接続されている原子を知る必要があり、各原子には結合のリストが必要です。これにより、データ構造に多くのサイクルが発生しますが、接続性検索などのさまざまなアルゴリズムを線形時間で実行できるようにするために必要です。

2Dマトリックスを使用しないでください。小分子には適していますが、それほどうまくスケーリングできず、その必要はありません。接続性マトリックスを必要とするアルゴリズムはほとんどなく、必要な場合に簡単に生成されます。

「FunctionalGroup」はありません。専門性が高すぎます。関心のある原子と結合のリストを含む「サブセット」または「フラグメント」のようなものを使用します。そのようにして、「選択された原子」、「リング部分構造」、「足場」などを参照して処理することもできます特定のサブセット。

あなたのペーストビンを見ました。パーサーはそのようには動作しません。実際の分子構造から解析を分離する必要があります。次のようなものを試してください:

class Molecule(object):
    def __init__(self):
        self.atoms = []
        self.bonds = []
        self._atom_id = 0
        self._bond_id = 0
    def _next_atom_id(self):
        atom_id = self._atom_id
        self.atom_id += 1
        return atom_id
    def AddAtom(self, eleno):
        self.atoms.append(Atom(self, self._next_atom_id(), eleno))
    def AddBond(self, atom1, atom2, bondtype):
        assert atom1.molecule is atom2.molecule
        self.bonds.append(Bond(self, self._next_bond_id(),
                               atom1, atom2, bondtype))

class Atom(object):
    def __init__(self, molecule, id, eleno):
        self.molecule = molecule
        self.id = id
        self.eleno = eleno
        self.charge = 0
        self.isotope = 0
   ..

そして、「CC O」のような単純な線形チェーンのパーサーは次のとおりです。

def parse_linear_chain(text):
   mol = Molecule()
   prev_atom = None
   for atom_symbol in text.split():
     eleno = lookup_symbol[atom_symbol]
     atom = mol.NewAtom(eleno)
     if pre_atom is not None:
       mol.AddBond(prev_atom, atom, 1)
     prev_atom = atom
   return mol

もちろん、完全なSMILESパーサーはこれよりもはるかに複雑であり、完全なデータモデルは、しばしば暗黙的である水素カウントのようなものを処理する必要があります。

OpenBabel、RDKit、およびCDKのメーリングリストも、これらのツールキットのいずれかを使用する場合に最適な場所です。シャパドがホストする「ブルーオベリスク」Q&Aサイトもあります。


1

開始するための別のアプローチは、既に問題に関連する何かをしているいくつかのコードを見ることです。その場合、あなたの運動は他のプログラムで終わるかもしれません、そしてそれは素晴らしいことではないでしょうか?

あなたにとって興味のあるプログラムは

  • MDシミュレーションおよび分子モデリングパッケージMMTK(上記のネイトによって既に提案されている)

  • 視覚化パッケージPyMol


1

分子オブジェクトシステムの詳細を学ぶことは、化学者がオブジェクト指向プログラミングを学ぶ素晴らしい方法です。このようなシステムの実装により、分子の直感が改善されることがわかります。属性とメソッドの観点から、原子、分子、およびおそらく分子のコレクションについていくつかの厳しい考えをする必要があります。

以下に役立つPython(少し古い)スライドを示します:http : //www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

作業を確認するために:openbabel(pythonバインディングがあります!)およびMMTKに加えて、phenixにはELBOWがあります。

あなたの多言語については、PerlMol(Perlmol.org)もあります。PerlMolはオブジェクト指向のperlで書かれており、CPANからダウンロードできます。

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