magattacaのブログ

日付以外誤報

RDKitで3次元構造に水素原子を付加するときの設定(addCoords)

RDKitの基本的な操作についてのメモです。

Chem.AddHs()の引数のaddCoords=Trueを今更知った!」って話です。

よくやるミス

立体構造の座標が入ったMolファイル、SDFファイルから化合物を読み込んだ後で、「水素原子を付け足したいなー」って時があります。

まず、molファイルからmolオブジェクトを作ります。

from rdkit import Chem
from rdkit.Chem.Draw import IPythonConsole

m = Chem.MolFromMolFile('test.mol')

IPythonConsole.drawMol3D(m)

で、何も考えずにChem.AddHs()とやって、こんな構造がでてがっかりします。

mH = Chem.AddHs(m)

IPythonConsole.drawMol3D(mH)

遠近法みたいですね。

addCoords=Trueをつけると?

違う、そうじゃない!ということでaddCoords=Trueします。

true_mH = Chem.AddHs(m, addCoords=True)

IPythonConsole.drawMol3D(true_mH)

そう、これが欲しかった!

何が起きてる?

何が起きてるのか座標を確認してみましょう。

addCoords=Trueを設定しなかった場合のMOLブロックはこんな感じです。

print(Chem.MolToMolBlock(mH))

"""
    EFZ
         RDKit          3D
    
     30 32  0  0  1  0  0  0  0  0999 V2000
       -4.6650  -32.8110   24.1290 Cl  0  0  0  0  0  0  0  0  0  0  0  0
        0.7540  -37.4060   23.9780 F   0  0  0  0  0  0  0  0  0  0  0  0
       -1.2240  -36.9050   24.5760 F   0  0  0  0  0  0  0  0  0  0  0  0
       -0.8430  -37.4960   22.5660 F   0  0  0  0  0  0  0  0  0  0  0  0
        1.5560  -35.7230   20.0590 O   0  0  0  0  0  0  0  0  0  0  0  0
        0.9480  -35.2860   22.1560 O   0  0  0  0  0  0  0  0  0  0  0  0
       -0.6250  -35.1620   20.4090 N   0  0  0  0  0  0  0  0  0  0  0  0
       -1.6090  -34.5740   21.2770 C   0  0  0  0  0  0  0  0  0  0  0  0
       -2.8080  -34.0130   20.7730 C   0  0  0  0  0  0  0  0  0  0  0  0
       -3.7390  -33.4660   21.6780 C   0  0  0  0  0  0  0  0  0  0  0  0
       -3.4980  -33.4840   23.0470 C   0  0  0  0  0  0  0  0  0  0  0  0
       -2.3320  -34.0240   23.5560 C   0  0  0  0  0  0  0  0  0  0  0  0
       -1.4060  -34.6050   22.6750 C   0  0  0  0  0  0  0  0  0  0  0  0
       -0.0960  -35.2860   23.1970 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.4550  -34.6070   24.3910 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.8900  -34.0500   25.3200 C   0  0  0  0  0  0  0  0  0  0  0  0
        1.5190  -33.2180   26.6670 C   0  0  0  0  0  0  0  0  0  0  0  0
        2.2540  -32.3400   26.2030 C   0  0  0  0  0  0  0  0  0  0  0  0
        1.0630  -32.0720   26.5920 C   0  0  0  0  0  0  0  0  0  0  0  0
       -0.3570  -36.7960   23.5830 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.6810  -35.4120   20.8040 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
      1 11  1  0
      2 20  1  0
      3 20  1  0
      4 20  1  0
      5 21  2  0
      6 14  1  0
      6 21  1  0
      7  8  1  0
      7 21  1  0
      8  9  2  0
      8 13  1  0
      9 10  1  0
     10 11  2  0
     11 12  1  0
     12 13  2  0
     13 14  1  0
     14 15  1  0
     14 20  1  0
     15 16  3  0
     16 17  1  0
     17 18  1  0
     17 19  1  0
     18 19  1  0
      7 22  1  0
      9 23  1  0
     10 24  1  0
     12 25  1  0
     17 26  1  0
     18 27  1  0
     18 28  1  0
     19 29  1  0
     19 30  1  0
    M  END
"""

水素原子(H)の座標にご注目ください。複数ある水素原子のXYZ座標が全て「0.0000」になっています。

Chem.addHs()はデフォルトでは水素原子の座標を原点にするようです。付加した水素原子がすべて原点に集まっているので、3D描画では原点から飛び出る結合が描かれていたみたいです。

addCoords=TrueのMOLブロックはこうなっています。

print(Chem.MolToMolBlock(true_mH))

"""
    EFZ
         RDKit          3D
    
     30 32  0  0  1  0  0  0  0  0999 V2000
       -4.6650  -32.8110   24.1290 Cl  0  0  0  0  0  0  0  0  0  0  0  0
        0.7540  -37.4060   23.9780 F   0  0  0  0  0  0  0  0  0  0  0  0
       -1.2240  -36.9050   24.5760 F   0  0  0  0  0  0  0  0  0  0  0  0
       -0.8430  -37.4960   22.5660 F   0  0  0  0  0  0  0  0  0  0  0  0
        1.5560  -35.7230   20.0590 O   0  0  0  0  0  0  0  0  0  0  0  0
        0.9480  -35.2860   22.1560 O   0  0  0  0  0  0  0  0  0  0  0  0
       -0.6250  -35.1620   20.4090 N   0  0  0  0  0  0  0  0  0  0  0  0
       -1.6090  -34.5740   21.2770 C   0  0  0  0  0  0  0  0  0  0  0  0
       -2.8080  -34.0130   20.7730 C   0  0  0  0  0  0  0  0  0  0  0  0
       -3.7390  -33.4660   21.6780 C   0  0  0  0  0  0  0  0  0  0  0  0
       -3.4980  -33.4840   23.0470 C   0  0  0  0  0  0  0  0  0  0  0  0
       -2.3320  -34.0240   23.5560 C   0  0  0  0  0  0  0  0  0  0  0  0
       -1.4060  -34.6050   22.6750 C   0  0  0  0  0  0  0  0  0  0  0  0
       -0.0960  -35.2860   23.1970 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.4550  -34.6070   24.3910 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.8900  -34.0500   25.3200 C   0  0  0  0  0  0  0  0  0  0  0  0
        1.5190  -33.2180   26.6670 C   0  0  0  0  0  0  0  0  0  0  0  0
        2.2540  -32.3400   26.2030 C   0  0  0  0  0  0  0  0  0  0  0  0
        1.0630  -32.0720   26.5920 C   0  0  0  0  0  0  0  0  0  0  0  0
       -0.3570  -36.7960   23.5830 C   0  0  0  0  0  0  0  0  0  0  0  0
        0.6810  -35.4120   20.8040 C   0  0  0  0  0  0  0  0  0  0  0  0
       -0.9030  -35.4093   19.4485 H   0  0  0  0  0  0  0  0  0  0  0  0
       -3.0092  -34.0045   19.6916 H   0  0  0  0  0  0  0  0  0  0  0  0
       -4.6687  -33.0188   21.2963 H   0  0  0  0  0  0  0  0  0  0  0  0
       -2.1321  -33.9989   24.6374 H   0  0  0  0  0  0  0  0  0  0  0  0
        1.6124  -33.9674   27.4668 H   0  0  0  0  0  0  0  0  0  0  0  0
        3.1187  -31.9803   26.7800 H   0  0  0  0  0  0  0  0  0  0  0  0
        2.8248  -32.2051   25.2724 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.2807  -31.8348   25.8560 H   0  0  0  0  0  0  0  0  0  0  0  0
        0.6089  -31.3601   27.2970 H   0  0  0  0  0  0  0  0  0  0  0  0
      1 11  1  0
      2 20  1  0
      3 20  1  0
      4 20  1  0
      5 21  2  0
      6 14  1  0
      6 21  1  0
      7  8  1  0
      7 21  1  0
      8  9  2  0
      8 13  1  0
      9 10  1  0
     10 11  2  0
     11 12  1  0
     12 13  2  0
     13 14  1  0
     14 15  1  0
     14 20  1  0
     15 16  3  0
     16 17  1  0
     17 18  1  0
     17 19  1  0
     18 19  1  0
      7 22  1  0
      9 23  1  0
     10 24  1  0
     12 25  1  0
     17 26  1  0
     18 27  1  0
     18 28  1  0
     19 29  1  0
     19 30  1  0
    M  END
"""

水素原子のXYZ座標に数値がはいっていました。

以上です。

おわりに

3次元構造に水素原子を付け足すときに、以下の記事に紹介してくださっているような方法をとったりしていました。

qiita.com

「①一度SMILESに戻して、②molオブジェクトを作り直し、③水素原子を付加して、④3次元座標を生成」といった手順です。

これだと元のファイルの折角の3次元座標を捨ててしまっていて、もったいないなーと思っていました。簡単な設定で解決できることがわかってよかったです。

・・・むしろなぜ今まで気づかなかったのか。

ところで今回例につかった化合物はエファビレンツです。

この不斉をどう合成するか??・・・答えはアートオブプロセスケミストリーで!

おしまい。