RDkitを用いた3D構造の最適化

前準備

モジュールのインストール

conda install -c conda-forge rdkit
pip install py3Dmol

分子の準備

適当な分子を準備する。

#分子の準備
mol = Chem.MolFromSmiles('CN[C@H](C)[C@H](O)c1ccccc1')
#もしくは,SDFファイルの読み込みの際に,removeHs=Falseとすることで、水素原子を保持したまま分子の読み込みが可能
# suppl = Chem.SDMolSupplier('XXXX.sdf', removeHs=False)
# mols = [mol for mol in suppl if mol is not None]

最適化前の構造を確認

とりあえず、未処理の分子の3D構造を確認してみる。

#Jupyter notebook上で描画してみる
IPythonConsole.drawMol3D(mol)

#MOLファイルを出力して、座標から構造を確認することも可能
mb = Chem.MolToMolBlock(mol)
with open('mol_2D.mol', 'w') as f:
    f.write(mb)


sp3炭素も全て平面に押し込まれてしまっている。
(実際は、マウスで構造をぐりぐり動かして確認することが可能)

水素の付加と三次元構造の最適化

水素の付加について

通常、RDkitに格納された分子は水素原子が暗に扱われている。
3次元の幾何構造を生成したり、最適化する場合には、良い3Dコンフォメーションを得るには、水素原子を分子に付加することが必要

三次元構造の最適化について

Molオブジェクトの3次元構造の最適化は、AllChem.EmbedMoleculeで行うことが可能。
RDkitでは以下の4つの方法が実装されており、デフォルトはETKDG法になっているとのこと。(普段使う分には、ETKDGの使用で問題ないらしい参考))

  • ディスタンス・ジオメトリー(DG)法:Stochasticな立体構造の生成方法としてはかなり精度がよい
  • KDG:DG法に一般的な化学常識(ベンゼン環は平面、アルキンは直線)を加えた手法
  • ETDG:ケンブリッジ結晶構造データベースの実験データから得た二面角の分布傾向を考慮した手法
  • ETKDG:KDGとETDGの両方を合わせた手法
  • ETKDGv2
#水素の付加
molH = Chem.AddHs(mol)

#ETKDGによる構造最適化
p = AllChem.ETKDG()
AllChem.EmbedMolecule(molH, p)

#Jupyter notebook上で描画してみる
IPythonConsole.drawMol3D(molH)

#MOLファイルを出力して、座標から構造を確認。
mb = Chem.MolToMolBlock(molH)
with open('mol_3D.mol', 'w') as f:
    f.write(mb)


画像だとわかりにくいが、水素が付加され立体構造も妥当なものになっている。

参考

関連書籍