magattacaのブログ

日付以外誤報

Working with Molecules part1 〜RDKit 直訳 Day5〜

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

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

本日の訳出に困った用語
hydrogen atoms implicit: 水素原子を暗に扱う(明示しない)
molecular graph: 分子グラフ構造
3D geometry: 3次元の幾何構造
aromatic bond type: 芳香族の結合タイプ

以下、訳

分子の取り扱い方(Working with Molecules)

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

原子、結合をループする(Looping over Atoms and Bonds)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#looping-over-atoms-and-bonds

分子さえ準備できれば、原子と結合をループするのは簡単です:

>>> m = Chem.MolFromSmiles('C1OC1')
>>> for atom in m.GetAtoms():
...   print(atom.GetAtomicNum())
...
6
8
6
>>> print(m.GetBonds()[0].GetBondType())
SINGLE

一つ一つの結合や原子をリクエストすることも可能です:

>>> m.GetAtomWithIdx(0).GetSymbol()
'C'
>>> m.GetAtomWithIdx(0).GetExplicitValence()
2
>>> m.GetBondWithIdx(0).GetBeginAtomIdx()
0
>>> m.GetBondWithIdx(0).GetEndAtomIdx()
1
>>> m.GetBondBetweenAtoms(0,1).GetBondType()
rdkit.Chem.rdchem.BondType.SINGLE

各原子にはそれぞれの隣接する原子についての情報も含まれます:

>>> atom = m.GetAtomWithIdx(0)
>>> [x.GetAtomicNum() for x in atom.GetNeighbors()]
[8, 6]
>>> len(atom.GetNeighbors()[-1].GetBonds())
2

環の情報(Ring Information)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#ring-information

原子と結合はどちらも分子の環構造についての情報をもっています:

>>> m = Chem.MolFromSmiles('OC1C2C1CC2')
>>> m.GetAtomWithIdx(0).IsInRing()
False
>>> m.GetAtomWithIdx(1).IsInRing()
True
>>> m.GetAtomWithIdx(2).IsInRingSize(3)
True
>>> m.GetAtomWithIdx(2).IsInRingSize(4)
True
>>> m.GetAtomWithIdx(2).IsInRingSize(5)
False
>>> m.GetBondWithIdx(1).IsInRingSize(3)
True
>>> m.GetBondWithIdx(1).IsInRing()
True

ただし、最小の環構造についての情報だけであることに注意してください:

>>> m.GetAtomWithIdx(1).IsInRingSize(5)
False

"最小の環構造についての最小のセット"(SSSR: Smallest Set of Smallest Rings)についてのより詳細な情報も利用可能です:

>>> ssr = Chem.GetSymmSSSR(m)
>>> len(ssr)
2
>>> list(ssr[0])
[1, 2, 3]
>>> list(ssr[1])
[4, 5, 2, 3]

名前が示すように、これは対称化(symmetrized)されたSSSRです。もし"本当の"SSSRの数について知りたければ、GetSSSR 関数を使ってください。

>>> Chem.GetSSSR(m)
2

対称化されたSSSRと対称化されていないSSSRの違いについてはThe SSSR Problemセクションでより詳細に議論されています。

[link] The SSSR Problem

分子の環構造について、より効率的なクエリー(Mol.GetAtomWithIdxを繰り返し呼び出すことを避ける方法)を使用するには、rdkit.Chem.rdchem.RingInfoクラスを使ってください

[link] rdkit.Chem.rdchem.RingInfo

>>> m = Chem.MolFromSmiles('OC1C2C1CC2')
>>> ri = m.GetRingInfo()
>>> ri.NumAtomRings(0)
0
>>> ri.NumAtomRings(1)
1
>>> ri.NumAtomRings(2)
2
>>> ri.IsAtomInRingOfSize(1,3)
True
>>> ri.IsBondInRingOfSize(1,3)
True

分子の修正(Modifying molecules)

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

通常、RDKitに格納された分子は水素原子が喑に扱われています(例えば、分子グラフ構造の中に水素原子は明示的にはあらわれません)。3次元の幾何構造を生成したり、最適化するといった、水素原子を明示的に扱うことが役立つ場合には、rdkit.Chem.rdmolops.AddHs()関数を使うことができます。

[link] rdkit.Chem.rdmolops.AddHs()

>>> m=Chem.MolFromSmiles('CCO')
>>> m.GetNumAtoms()
3
>>> m2 = Chem.AddHs(m)
>>> m2.GetNumAtoms()
9

水素原子はrdkit.Chem.rdmolops.RemoveHs()関数を使うことで取り除くことができます。

[link] rdkit.Chem.rdmolops.RemoveHs(): https://www.rdkit.org/docs/source/rdkit.Chem.rdmolops.html#rdkit.Chem.rdmolops.RemoveHs

>>> m3 = Chem.RemoveHs(m2)
>>> m3.GetNumAtoms()
3

RDKitの分子は通常、芳香環の結合は芳香族の結合タイプの情報とともに格納されています。これはrdkit.Chem.rdmolops.Kekulize()関数を使うことで変更することが可能です。

[link] rdkit.Chem.rdmolops.Kekulize()

>>> m = Chem.MolFromSmiles('c1ccccc1')
>>> m.GetBondWithIdx(0).GetBondType()
rdkit.Chem.rdchem.BondType.AROMATIC
>>> Chem.Kekulize(m)
>>> m.GetBondWithIdx(0).GetBondType()
rdkit.Chem.rdchem.BondType.DOUBLE
>>> m.GetBondWithIdx(1).GetBondType()
rdkit.Chem.rdchem.BondType.SINGLE

デフォルトでは元の分子フラグが消去されていないため、結合はまだ芳香族として認識されています(clearAromaticFlagsのデフォルトはFalseです)。

>>> m.GetBondWithIdx(1).GetIsAromatic()
True

フラグを消去するか否かは、明示的に設定する(True)、しない(False)を選択できます。

>>> m = Chem.MolFromSmiles('c1ccccc1')
>>> m.GetBondWithIdx(0).GetIsAromatic()
True
>>> m1 = Chem.MolFromSmiles('c1ccccc1')
>>> Chem.Kekulize(m1, clearAromaticFlags=True)
>>> m1.GetBondWithIdx(0).GetIsAromatic()
False

rdkit.Chem.rdmolops.SanitizeMol()関数を使えば、結合のタイプを芳香族に戻すことも可能です。

[link] rdkit.Chem.rdmolops.SanitizeMol()

>>> Chem.SanitizeMol(m)
rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_NONE
>>> m.GetBondWithIdx(0).GetBondType()
rdkit.Chem.rdchem.BondType.AROMATIC

SanitizeMol()の戻り値は問題なく実行できたことを示しています。

12/05/2018

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

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