magattacaのブログ

日付以外誤報

Reading and Writing Molecules part 2 〜RDKit 直訳 Day4〜

(12/30追記)試訳をまとめたテストサイトを作成しました。よろしければご参照ください。

こちらはRDKit直訳 Advent Calendar 2018 - Adventar 4日目の記事です。基本的な進め方は1日目の記事をご覧ください。

本日の訳出に困った用語
atomic coordinate: 原子座標
store: 格納
depiction: 描画
embed: 埋め込み
conformation: コンフォメーション、配座
file-like: file-like

以下、訳

分子の書き込み(Writing molecules)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#writing-molecules

分子が一つの場合、rdkit.Chemモジュールにある複数の関数でテキスト形式に変換することができます。

[link] rdkit.Chem

例えば、SMILESに変換したい場合次のようにします:

>>> m = Chem.MolFromMolFile('data/chiral.mol')
>>> Chem.MolToSmiles(m)
'C[C@H](O)c1ccccc1'
>>> Chem.MolToSmiles(m,isomericSmiles=False)
'CC(O)c1ccccc1'

生成されるSMILESはcanonical SMILESであることに注意してください。つまりインプットとしてどのように分子を読み込んだとしても、同じ分子に対しては同じSMILESがアウトプットされます。

>>> Chem.MolToSmiles(Chem.MolFromSmiles('C1=CC=CN=C1'))
'c1ccncc1'
>>> Chem.MolToSmiles(Chem.MolFromSmiles('c1cccnc1'))
'c1ccncc1'
>>> Chem.MolToSmiles(Chem.MolFromSmiles('n1ccccc1'))
'c1ccncc1'

もしケクレ形式のSMILESを作りたいなら、最初に分子をケクレ化したのち "kekuleSmiles"オプションを使ってください。

>>> Chem.Kekulize(m)
>>> Chem.MolToSmiles(m,kekuleSmiles=True)
'C[C@H](O)C1=CC=CC=C1'

この記事を記載している時点(2008年8月)で、kekuleSmiles をリクエストすると生成されるSMILESはカノニカルではありません。SMILESの生成段階ではなく、ケクレ化の段階自体に限界があります。

MDL Mol block も利用可能です:

>>> m2 = Chem.MolFromSmiles('C1CCC1')
>>> print(Chem.MolToMolBlock(m2))    

     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.0000   -1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

mol blockに名前を含めるためには、分子の"_Name"プロパティをセットしてください:

>>> m2.SetProp("_Name","cyclobutane")
>>> print(Chem.MolToMolBlock(m2))     
cyclobutane
     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.0000   -1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

ほとんどのソフトウェアで原子や結合の立体化学を正しく認識させるためには、mol blockが原子座標を含むことが必須です。また分子を描画する、といった様々な理由で原子座標は便利です。デフォルトでは座標を持たない分子のmol blockを生成させると、自動的に座標が生成されます。ですが、これらは分子には格納されません。 rdkit.Chem.AllChemモジュールの機能を使うと、座標を生成させ、分子に格納することができます。(より詳細な情報はChem vs AllChemセクションを参照してください。)

[link] rdkit.Chem.AllChem
[link] Chem vs AllChem

格納できる座標としてはまず2Dの座標(すなわち描画[depiction])があります:

>>> from rdkit.Chem import AllChem
>>> AllChem.Compute2DCoords(m2)
0
>>> print(Chem.MolToMolBlock(m2))     
cyclobutane
     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.0000   -1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

あるいは分子にうめこむ[embed]ことで3D座標を付け加えることもできます(この例ではETKDG法を使用しています。ETKDG法についてはより詳細に下で説明します。)

>>> AllChem.EmbedMolecule(m2)
0
>>> print(Chem.MolToMolBlock(m2))    
cyclobutane
     RDKit          3D

  4  4  0  0  0  0  0  0  0  0999 V2000
   -0.8321    0.5405   -0.1981 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.3467   -0.8825   -0.2651 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7190   -0.5613    0.7314 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.4599    0.9032    0.5020 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

良い3Dコンフォメーションを得るには、ほとんどの場合、まず初めに水素原子を分子に付加すること上手くいきます。

>>> m3 = Chem.AddHs(m2)
>>> AllChem.EmbedMolecule(m3)
0

この付加した水素原子を取り除くこともできます。

>>> m3 = Chem.RemoveHs(m3)
>>> print(Chem.MolToMolBlock(m3))    
cyclobutane
     RDKit          3D

  4  4  0  0  0  0  0  0  0  0999 V2000
    0.3497    0.9755   -0.2202 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.9814   -0.3380    0.2534 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.3384   -1.0009   -0.1474 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.9992    0.3532    0.1458 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

分子をファイルに書き込みたい時にはPythonファイルオブジェクトを使ってください:

>>> print(Chem.MolToMolBlock(m2),file=open('data/foo.mol','w+'))
>>>

分子の集合を書き出す方法(Writing sets of molecules)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#writing-sets-of-molecules

分子が複数ある場合はrdkit.Chem.rdmolfiles.SDWriterオブジェクトを使うことでファイルに書き出すことができます。

[link] rdkit.Chem.rdmolfiles.SDWriter

>>> w = Chem.SDWriter('data/foo.sdf')
>>> for m in mols: w.write(m)
...
>>>

SDWriterはfile-likeなオブジェクトを使っても初期化することができます:

>>> from rdkit.six import StringIO
>>> sio = StringIO()
>>> w = Chem.SDWriter(sio)
>>> for m in mols: w.write(m)
...
>>> w.flush()
>>> print(sio.getvalue())
mol-295
     RDKit          3D

 20 22  0  0  1  0  0  0  0  0999 V2000
    2.3200    0.0800   -0.1000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.8400   -1.2200    0.1200 C   0  0  0  0  0  0  0  0  0  0  0  0
...
  1  3  1  0
  1  4  1  0
  2  5  1  0
M  END
$$$$

他に利用可能な書き込み用のモジュールとして、rdkit.Chem.rdmolfiles.SmilesWriterrdkit.Chem.rdmolfiles.TDTWriterがあります。

[link] rdkit.Chem.rdmolfiles.SmilesWriter
[link] rdkit.Chem.rdmolfiles.TDTWriter

12/04/2018

このブログ記事のライセンス

以上はRDKit Documentationの試訳です。
ライセンスはCC BY-SA 4.0で、Greg Landrum氏の功績の元に作成しています。
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0