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