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次元構造に水素原子を付け足すときに、以下の記事に紹介してくださっているような方法をとったりしていました。
「①一度SMILESに戻して、②molオブジェクトを作り直し、③水素原子を付加して、④3次元座標を生成」といった手順です。
これだと元のファイルの折角の3次元座標を捨ててしまっていて、もったいないなーと思っていました。簡単な設定で解決できることがわかってよかったです。
・・・むしろなぜ今まで気づかなかったのか。
ところで今回例につかった化合物はエファビレンツです。
この不斉をどう合成するか??・・・答えはアートオブプロセスケミストリーで!
おしまい。