magattacaのブログ

日付以外誤報

Working with Molecules part3 〜RDKit 直訳 Day7〜

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

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

本日の訳出に困った用語
pickling machinery : pickle化機能
SMILES string: SMILES文字列
raw binary data: 生のバイナリデータ
constructor: コンストラク
overhead: 付帯的コスト
binary string: バイナリ列
reparse : 再解析
built-in functionality: 組み込みの機能
image grid: グリッドレイアウトの画像

以下、訳

分子の保存(Preserving Molecules)

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

Pythonの”pickle化"機能をつかうことで、分子をテキストへ変換することも、テキストから分子に変換することもできます。

>>> m = Chem.MolFromSmiles('c1ccncc1')
>>> import pickle
>>> pkl = pickle.dumps(m)
>>> m2=pickle.loads(pkl)
>>> Chem.MolToSmiles(m2)
'c1ccncc1'

RDKitのpickel形式はかなりコンパクトで、MolファイルやSMILES文字列から分子を構築するよりもpickelからの構築の方がとても速いです。ですので、繰り返し扱う分子はpickelとして保存しておくのが良いでしょう。

pickelに含まれている生のバイナリデータは分子から直接取得することもできます。

>>> binStr = m.ToBinary()

Chem.Molコンストラクタを使ってバイナリデータから分子を再構築することも可能です。

>>> m2 = Chem.Mol(binStr)
>>> Chem.MolToSmiles(m2)
'c1ccncc1'
>>> len(binStr)
123

これはpickleよりも小さいことに注目してください。

>>> len(binStr) < len(pkl)
True

より大きなサイズの分子のセットを扱う際に、pickel化機能を使うことに伴う付帯的なコストは、通常はそれほど大きくはなりません(pickelに伴う余分なデータは分子のサイズとは独立のものですが、一方でバイナリ列は分子のサイズが大きくなるにつれて長くなります)。

Tip: SDファイルやSMILESのテーブルを再解析する代わりに、ディスク上にpickel形式で分子を保存することのパフォーマンスの違いは一概には言えません。テストとして私のノートPCで実行した場合、SDファイルから699個のドラッグライクな分子のセットを読み込むのに10.8秒、pickelファイルからは0.7秒かかりました。また、pickelファイルはファイルサイズも小さく、SDファイルの1/3でしたが、いつもこの様に劇的な差があるわけではありません(今回は特に余分が多いSDファイルでした)。

分子を描く(Drawing Molecules)

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

RDKitには分子から画像を生成するための機能がいくつか組み込まれており、rdkit.Chem.Drawパッケージの中にあります。:
[link] rdkit.Chem.Draw

>>> suppl = Chem.SDMolSupplier('data/cdk2.sdf')
>>> ms = [x for x in suppl if x is not None]
>>> for m in ms: tmp=AllChem.Compute2DCoords(m)
>>> from rdkit.Chem import Draw
>>> Draw.MolToFile(ms[0],'images/cdk2_mol1.o.png')
>>> Draw.MolToFile(ms[1],'images/cdk2_mol2.o.png')

このような画像を生成します。
f:id:magattaca:20181202210942p:plain:w200f:id:magattaca:20181202211000p:plain:w200
cdk2_mol1.png, cdk2_mol2.png

分子のセットからグリッドレイアウトの画像を作ることもできます:

>>> img=Draw.MolsToGridImage(ms[:8],molsPerRow=4,subImgSize=(200,200),legends=[x.GetProp("_Name") for x in ms[:8]])

これはPILイメージを返し、ファイルに保存することができます:

>>> img.save('images/cdk2_molgrid.o.png')

結果はこのようになります:

f:id:magattaca:20181202211047p:plain
cdk_molgrid.png

もちろん共通骨格で整列させればより見やすくなります。このように簡単にできます:

>>> p = Chem.MolFromSmiles('[nH]1cnc2cncnc21')
>>> subms = [x for x in ms if x.HasSubstructMatch(p)]
>>> len(subms)
14
>>> AllChem.Compute2DCoords(p)
0
>>> for m in subms: AllChem.GenerateDepictionMatching2DStructure(m,p)
>>> img=Draw.MolsToGridImage(subms,molsPerRow=4,subImgSize=(200,200),legends=[x.GetProp("_Name") for x in subms])
>>> img.save('images/cdk2_molgrid.aligned.o.png')

この様な結果が返ってきます。:

f:id:magattaca:20181202211121p:plain
cdk_molgrid_aligned.png

12/07/2018

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

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

Working with Molecules part2 〜RDKit 直訳 Day6〜

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

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

本日の訳出に困った用語
canonical orientation: 正規化された向き
common template: 共通骨格
core function: コア関数
fine-grained control: 高精細な調整
distance bounds matrix: 距離拘束条件の行列
triangle-bounds smoothing algorithm: 三角拘束スムージングアルゴリズム
crude force field: 粗い力場
clean up: 整形、クリーンアップ
torsion angle preference: 優先される二面角の傾向
verbiage: 冗長な方法
MMFF atom typing code: MMFFの原子タイプを設定するコード
aromaticity flag: 芳香族性フラグ
flag prealigned: prealignedフラグ
run single threaded: 単一スレッドで実行
embarassingly parallel rask: 驚異的並列タスク処理

以下、訳

2Dの分子の取り扱い:描画の生成(Working with 2D molecules: Gemeratomg Depoctions)

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

RDkitには分子の描画(2次元座標のセット)を生成するためのライブラリーがあります。AllChemモジュールに含まれるこのライブラリーはrdkit.Chem.rdDepictor.Compute2DCoords()関数によりアクセスできます。

[link] rdkit.Chem.rdDepictor.Compute2DCoords()

>>> m = Chem.MolFromSmiles('c1nccc2n1ccc2')
>>> AllChem.Compute2DCoords(m)
0

2次元のコンフォメーションは正規化された向き[canonical orientation]で構築されます。また、描画が最も明確になるように、分子内の重なりを最小化するように作られます。

共通骨格を有する複数の分子のセットがあり、その骨格に対して揃えて並べたい場合は、以下のようにしてください。

>>> template = Chem.MolFromSmiles('c1nccc2n1ccc2')
>>> AllChem.Compute2DCoords(template)
0
>>> AllChem.GenerateDepictionMatching2DStructure(m,template)

上記のプロセスをいくつかの分子に適用すると以下のような図が得られます。

f:id:magattaca:20181202113506p:plain:w200f:id:magattaca:20181202113519p:plain:w200f:id:magattaca:20181202113527p:plain:w200
picture_1.png, picture_0.ong, picture_3.png

Compute2DCoords のもう一つのオプションをつかうと、3Dコンフォメーションを近似した2次元描画を生成することができます。rdkit.Chem.AllChem.GenerateDepictionMatching3DStructure()関数を使用すればできます。

PDB 1XP0構造の中のリガンドを使って生成した場合の結果は以下のようになります。

f:id:magattaca:20181202113936p:plain:w200f:id:magattaca:20181202113940p:plain:w200
picture_2.png, picture_4.png

コア関数のrdkit.Chem.rdDepictor.Compute2DCoordsMimicDistmat()を使うと、もっと高精細な調整が可能ですが、このページの範囲を超えているためここでは触れません。使用例は AllChem.py の GenerateDepictionMatching3DStructure の実装を参照してください。

[link] rdkit.Chem.rdDepictor.Compute2DCoordsMimicDistmat

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

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

RDKitで分子のコンフォメーションを生成するには2つの方法があります。元々はDistance Geometry法を使っていました[脚注1]。

[脚注1] Blaney, J. M.; Dixon, J. S. “Distance Geometry in Molecular Modeling”. Reviews in Computational Chemistry; VCH: New York, 1994.

アルゴリズム流れは次のようになります:

1. 対象の分子の原子結合表と、一連のルールに基づいて距離拘束条件の行列[distance bounds matrix]を計算
2. 拘束条件行列は三角拘束スムージングアルゴリズム[triangle-bounds smoothing algorithm]を使ってスムージング
3. 拘束条件行列を満たす距離行列をランダムに生成
4. 生成された距離行列を3次元に埋め込み(各原子の座標を生成)
5. 生成した座標を、粗い力場[crude force field]と拘束条件行列を用いて整形[clean up]

この手順で生成されるコンフォメーションはかなり粗いものである傾向があることに気をつけてください。力場を用いたクリーンアップが必要となりますが、RDKitに実装されているUniversal Force Field (UFF)を使うことができます。[脚注2]。

[脚注2] Rappé, A. K.; Casewit, C. J.; Colwell, K. S.; Goddard III, W. A.; Skiff, W. M. “UFF, a full periodic table force field for molecular mechanics and molecular dynamics simulations”. J. Am. Chem. Soc. 114:10024-35 (1992) .

最近になって、RinikerとLandrumの方法が実装されました[脚注18]。この方法では、Distance Geometry法を用いて生成したコンフォマーを、Cambridge Structural Database(CSD)から導いた優先される二面角の傾向[torsion angle preference]を使って修正します。この方法を使うことで、構造をクリーンアップするための最小化ステップが必要なくなります。

[脚注18] Riniker, S.; Landrum, G. A. “Better Informed Distance Geometry: Using What We Know To Improve Conformation Generation” J. Chem. Inf. Comp. Sci. 55:2562-74 (2015)

RDKit 2018.09 リリース版から、ETKDGがコンフォメーション生成法のデフォルトとなりました。

上述の冗長な方法と比べて、分子の埋め込みの全工程がより簡単になっているので、ETKDGの有用性がわかります。

>>> m2=Chem.AddHs(m)
>>> AllChem.EmbedMolecule(m2)
0

RDKitではMMFF94力場の実装も使用可能です[脚注12],[脚注13],[脚注14],[脚注15],[脚注16]。MMFFの原子タイプを設定するコードは独自の芳香族モデルを使用するため、MMFFに関係する方法を呼び出した後で、分子の芳香族性フラグが修正されることに注意してください。

[脚注12] Halgren, T. A. “Merck molecular force field. I. Basis, form, scope, parameterization, and performance of MMFF94.” J. Comp. Chem. 17:490–19 (1996).
[脚注13] Halgren, T. A. “Merck molecular force field. II. MMFF94 van der Waals and electrostatic parameters for intermolecular interactions.” J. Comp. Chem. 17:520–52 (1996).
[脚注14] Halgren, T. A. “Merck molecular force field. III. Molecular geometries and vibrational frequencies for MMFF94.” J. Comp. Chem. 17:553–86 (1996).
[脚注15] Halgren, T. A. & Nachbar, R. B. “Merck molecular force field. IV. conformational energies and geometries for MMFF94.” J. Comp. Chem. 17:587-615 (1996).
[脚注16] Halgren, T. A. “MMFF VI. MMFF94s option for energy minimization studies.” J. Comp. Chem. 20:720–9 (1999).

MMFF94を使ってRDKitで生成したコンフォマーを最小化する例です:

>>> m = Chem.MolFromSmiles('C1CCC1OC')
>>> m2=Chem.AddHs(m)
>>> AllChem.EmbedMolecule(m2)
0
>>> AllChem.MMFFOptimizeMolecule(m2)
0

上記の例でChem.AddHs()を呼び出していることに注意してください。デフォルトではRDKitの分子はグラフの中に水素原子を明示的に保持していませんが、本物らしい幾何構造を得るには重要です。したがって、一般的には水素原子を付加する必要があります。必要とあらばChem.RemoveHs()を呼び出すことで、いつでも後から削除できます。

RDKitでは複数のコンフォマーを異なる埋め込み方法を使って生成することもできます。いずれの場合も、異なるランダムな出発点からdistance geometry計算を複数回実行するだけです。numConfsオプションを使うことで、生成するコンフォマーの数をセットすることができます。オプションの設定以外は上述の方法と同じです。生成したコンフォマーは互いに整列させることができ、RMS値を計算できます。

>>> m = Chem.MolFromSmiles('C1CCC1OC')
>>> m2=Chem.AddHs(m)
>>> # run ETKDG 10 times
>>> cids = AllChem.EmbedMultipleConfs(m2, numConfs=10)
>>> print(len(cids))
10
>>> rmslist = []
>>> AllChem.AlignMolConformers(m2, RMSlist=rmslist)
>>> print(len(rmslist))
9

rmslistは最初のコンフォマーとその他すべてのコンフォマーのそれぞれとのRMS値を含むリストです。特定の2つのコンフォマー(例えば1と9)のRMSを計算することも可能です。コンフォマーがすでに整列されている場合、prealignedフラグにより明示することができます(デフォルトではこの関数はコンフォマーの整列を行います)。

>>> rms = AllChem.GetConformerRMS(m2, 1, 9, prealigned=True)

(ETKDGを使った場合、大抵不要ですが)コンフォマーにMMFF94を実行したい場合、便利な関数があります。

>>> res = AllChem.MMFFOptimizeMoleculeConfs(m2)

それぞれのコンフォマーについて二つのタプル(not_converged, energy)を含むリストが返されます。not_convergedが0なら、そのコンフォマーの最小化は収束しています。

デフォルトではAllChem.EmbedMultipleConfsAllChem.MMFFOptimizeMoleculeConfs()は単一スレッドで実行しますが、 numThreads引数から驚異的並列処理[embarassingly parallel task]を実行するためにマルチスレッドを同時に使うこともできます。

>>> cids = AllChem.EmbedMultipleConfs(m2, numThreads=0)
>>> res = AllChem.MMFFOptimizeMoleculeConfs(m2, numThreads=0)

numThredsを0に設定することで、あなたのコンピュータで許可されている最大数のスレッドをつかうことができます

Disclaimer/Warning: コンフォメーションの生成は難しく、かつ微妙なタスクです。RDKitで提供されている元々の2Dから3D変換は「リアル」なコンフォメーションを分析する手段の代替とすることを意図したものではありません。単に必要な時に素早く3D構造を提供するためのものです。ですが、我々は新しいETKDG法はほとんどの目的の場合に適うと信じています。

12/06/2018

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

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

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

Reading and Writing Molecules part 2 〜RDKit 直訳 Day4〜

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

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

本日の訳出に困った用語
atomic coordinate: 原子座標
store: 格納
depiction: 描画
embed: 埋め込み
conformation: コンフォメーション、配座
file-like: file-like

以下、訳

分子の書き込み(Writing molecules)

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

分子が一つの場合、rdkit.Chemモジュールにある複数の関数でテキスト形式に変換することができます。

[link] rdkit.Chem

例えば、SMILESに変換したい場合次のようにします:

>>> m = Chem.MolFromMolFile('data/chiral.mol')
>>> Chem.MolToSmiles(m)
'C[C@H](O)c1ccccc1'
>>> Chem.MolToSmiles(m,isomericSmiles=False)
'CC(O)c1ccccc1'

生成されるSMILESはcanonical SMILESであることに注意してください。つまりインプットとしてどのように分子を読み込んだとしても、同じ分子に対しては同じSMILESがアウトプットされます。

>>> Chem.MolToSmiles(Chem.MolFromSmiles('C1=CC=CN=C1'))
'c1ccncc1'
>>> Chem.MolToSmiles(Chem.MolFromSmiles('c1cccnc1'))
'c1ccncc1'
>>> Chem.MolToSmiles(Chem.MolFromSmiles('n1ccccc1'))
'c1ccncc1'

もしケクレ形式のSMILESを作りたいなら、最初に分子をケクレ化したのち "kekuleSmiles"オプションを使ってください。

>>> Chem.Kekulize(m)
>>> Chem.MolToSmiles(m,kekuleSmiles=True)
'C[C@H](O)C1=CC=CC=C1'

この記事を記載している時点(2008年8月)で、kekuleSmiles をリクエストすると生成されるSMILESはカノニカルではありません。SMILESの生成段階ではなく、ケクレ化の段階自体に限界があります。

MDL Mol block も利用可能です:

>>> m2 = Chem.MolFromSmiles('C1CCC1')
>>> print(Chem.MolToMolBlock(m2))    

     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.0000   -1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

mol blockに名前を含めるためには、分子の"_Name"プロパティをセットしてください:

>>> m2.SetProp("_Name","cyclobutane")
>>> print(Chem.MolToMolBlock(m2))     
cyclobutane
     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.0000   -1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

ほとんどのソフトウェアで原子や結合の立体化学を正しく認識させるためには、mol blockが原子座標を含むことが必須です。また分子を描画する、といった様々な理由で原子座標は便利です。デフォルトでは座標を持たない分子のmol blockを生成させると、自動的に座標が生成されます。ですが、これらは分子には格納されません。 rdkit.Chem.AllChemモジュールの機能を使うと、座標を生成させ、分子に格納することができます。(より詳細な情報はChem vs AllChemセクションを参照してください。)

[link] rdkit.Chem.AllChem
[link] Chem vs AllChem

格納できる座標としてはまず2Dの座標(すなわち描画[depiction])があります:

>>> from rdkit.Chem import AllChem
>>> AllChem.Compute2DCoords(m2)
0
>>> print(Chem.MolToMolBlock(m2))     
cyclobutane
     RDKit          2D

  4  4  0  0  0  0  0  0  0  0999 V2000
    1.0607   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.0000   -1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.0607    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.0607    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

あるいは分子にうめこむ[embed]ことで3D座標を付け加えることもできます(この例ではETKDG法を使用しています。ETKDG法についてはより詳細に下で説明します。)

>>> AllChem.EmbedMolecule(m2)
0
>>> print(Chem.MolToMolBlock(m2))    
cyclobutane
     RDKit          3D

  4  4  0  0  0  0  0  0  0  0999 V2000
   -0.8321    0.5405   -0.1981 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.3467   -0.8825   -0.2651 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7190   -0.5613    0.7314 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.4599    0.9032    0.5020 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

良い3Dコンフォメーションを得るには、ほとんどの場合、まず初めに水素原子を分子に付加すること上手くいきます。

>>> m3 = Chem.AddHs(m2)
>>> AllChem.EmbedMolecule(m3)
0

この付加した水素原子を取り除くこともできます。

>>> m3 = Chem.RemoveHs(m3)
>>> print(Chem.MolToMolBlock(m3))    
cyclobutane
     RDKit          3D

  4  4  0  0  0  0  0  0  0  0999 V2000
    0.3497    0.9755   -0.2202 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.9814   -0.3380    0.2534 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.3384   -1.0009   -0.1474 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.9992    0.3532    0.1458 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  1  0
  3  4  1  0
  4  1  1  0
M  END

分子をファイルに書き込みたい時にはPythonファイルオブジェクトを使ってください:

>>> print(Chem.MolToMolBlock(m2),file=open('data/foo.mol','w+'))
>>>

分子の集合を書き出す方法(Writing sets of molecules)

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

分子が複数ある場合はrdkit.Chem.rdmolfiles.SDWriterオブジェクトを使うことでファイルに書き出すことができます。

[link] rdkit.Chem.rdmolfiles.SDWriter

>>> w = Chem.SDWriter('data/foo.sdf')
>>> for m in mols: w.write(m)
...
>>>

SDWriterはfile-likeなオブジェクトを使っても初期化することができます:

>>> from rdkit.six import StringIO
>>> sio = StringIO()
>>> w = Chem.SDWriter(sio)
>>> for m in mols: w.write(m)
...
>>> w.flush()
>>> print(sio.getvalue())
mol-295
     RDKit          3D

 20 22  0  0  1  0  0  0  0  0999 V2000
    2.3200    0.0800   -0.1000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.8400   -1.2200    0.1200 C   0  0  0  0  0  0  0  0  0  0  0  0
...
  1  3  1  0
  1  4  1  0
  2  5  1  0
M  END
$$$$

他に利用可能な書き込み用のモジュールとして、rdkit.Chem.rdmolfiles.SmilesWriterrdkit.Chem.rdmolfiles.TDTWriterがあります。

[link] rdkit.Chem.rdmolfiles.SmilesWriter
[link] rdkit.Chem.rdmolfiles.TDTWriter

12/04/2018

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

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

Reading and Writing Molecules part 1 〜RDKit 直訳 Day3〜

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

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

本日の訳出に困った用語
good practice: グッドプラクティス
random-access object: ランダムアクセスオブジェクト

以下、訳

PythonでRDKitを始めよう(Getting Started with RDKit in Python)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#getting-started-with-the-rdkit-in-python

このページについて(What is this?)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#what-is-this

このページはどうすればPythonからRDKitの機能を使うことができるか、その大まかな見取り図を提供することを目的としています。網羅的ではないですし、マニュアルでもありません。

間違いに気づいた場合や、こうした方が良いといった提案があればソースドキュメント(.rstファイル)をご自身で修正するか、もしくはメーリングリストrdkit-devel@lists.sourceforge.net)に送ってください。特に、ここに書かれていないことで、どうすれば良いか解決するのに時間がかかったことがあれば、ぜひ書き加えてください。このページへの貢献はRDKitコミュニティにもあなた自身の将来にとっても、とてもためになるでしょう。

分子の読み込みと書き込み(Reading and Writing Molecules)

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

1分子の読み込み(Reading single molecules)

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

基本的な分子を取り扱う機能の多くはrdkit.Chem モジュールに含まれています。

[link] rdkit.Chem

>>> from __future__ import print_function
>>> from rdkit import Chem

一つ一つの分子は様々な方法で構築することができます。例えば:

>>> m = Chem.MolFromSmiles('Cc1ccccc1')
>>> m = Chem.MolFromMolFile('data/input.mol')
>>> stringWithMolData=open('datainput.mol','r').read()
>>> m = Chem.MolFromMolBlock(stringWithMolData)

うまくいけばこれらの関数はすべてrdkit.Chem.rdchem.molオブジェクトを返します。

[link] rdkit.Chem.rdchem.Mol

>>> m
<rdkit.Chem.rdchem.Mol object at 0x...>

失敗した場合は None を返します:

>>> m = Chem.MolFromMolFile('data/invalid.mol')
>>> m is None
True

エラーメッセージの感覚を掴むためにわざとおかしなことをしてみましょう:

>>> m1 = Chem.MolFromSmiles('CO(C)C')

以下のようなメッセージが表示されます
: [12:18:01] Explicit valence for atom # 1 O greater than permitted
また、

>>> m2 = Chem.MolFromSmiles('c1cc1')

このようなメッセージが出ます:
[12:20:41] Can't kekulize mol.
どちらの場合もNone値が返されます:

>>> m1 is None
True
>>> m2 is None
True

まとまった数の分子を読み込む(Reading sets of molecules)

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

分子の集合はSupplierを使うことで読み込めます。
(例えば rdkit.Chem.rdmolfiles.SDMolSupplierrdkit.Chem.rdmolfiles.SmilesMolSupplierなどです。)

[link] rdkit.Chem.rdmolfiles.SDMolSupplier
[link] rdkit.Chem.rdmolfiles.SmilesMolSupplier

>>> suppl = Chem.SDMolSupplier('data/5ht3ligs.sdf')
>>> for mol in suppl:
...   print(mol.GetNumAtoms())
...
20
24
24
26

Supplierから簡単に分子のリストを作ることが可能です。

>>> mols = [x for x in suppl]
>>> len(mols)
4

あるいは単純にSupplier自体をランダムアクセスオブジェクトとして扱うことも可能です:

>>> suppl[0].GetNumAtoms()
20

グッドプラクティスとしては、個々の分子が正しく読み込まれているかどうか、処理を行うまえにテストすることをお勧めします:

>>> suppl = Chem.SDMolSupplier('data/5ht3ligs.sdf')
>>> for mol in suppl:
...   if mol is None: continue
...   print(mol.GetNumAtoms())
...
20
24
24
26

Supplierの代わりとなりものとして、ファイルのようなオブジェクトから読みこむ際に、rdkit.Chem.rdmolfiles.ForwardSDMolSupplierが使えます。

[link] rdkit.Chem.rdmolfiles.ForwardSDMolSupplier

>>> inf = open('data/5ht3ligs.sdf','rb')
>>> fsuppl = Chem.ForwardSDMolSupplier(inf)
>>> for mol in fsuppl:
...   if mol is None: continue
...   print(mol.GetNumAtoms())
...
20
24
24
26

つまり、圧縮ファイルから読み込む際にも使えます。

>>> import gzip
>>> inf = gzip.open('data/actives_5ht3.sdf.gz')
>>> gzsuppl = Chem.ForwardSDMolSupplier(inf)
>>> ms = [x for x in gzsuppl if x is not None]
>>> len(ms)
180

ForwardSDMolSuppliersはランダムアクセスオブジェクトとしては使えないことに気をつけてください。

>>> fsuppl[0]
Traceback (most recent call last):
  ...
TypeError: 'ForwardSDMolSupplier' object does not support indexing

12/03/2018

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

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

An overview of the RDKit 〜RDKit 直訳 Day2〜

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

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

本日の訳出に困った用語
molecular operations: 分子の操作、取り扱い
Molecular database cartridge: 化合物データベース・カートリッジ
fingerprint similarity searching: フィンガープリント類似性探索
adaptive modeling: 適合モデリング
optimized cross reactivity estimation: 最適化交差反応性予測
commercially-available compounds: 購入可能な化合物
Gaussian molecular overlap code: ガウス型の分子重ね合わせコード
interrogation: 精査
directed synthesis: 指向性合成

以下、訳

RDKitの概要(An overview of the RDKit)

[Link] https://www.rdkit.org/docs/Overview.html#an-overview-of-the-rdkit

RDKitっていったい?(What is it?)

[Link] https://www.rdkit.org/docs/Overview.html#what-is-it

ケモインフォマティクス のためのオープンソースのツールキット(Open source toolkit for cheminformatics)

[Link] https://www.rdkit.org/docs/Overview.html#open-source-toolkit-for-cheminformatics

運営に関する情報 (Operational)

[Link] https://www.rdkit.org/docs/Overview.html#operational

[link] rdkit-discuss
[link] rdkit-devel

沿革(History)

[Link] https://www.rdkit.org/docs/Overview.html#history

  • 2000-2006: Rational DiscoveryにおいてADME、Tox、生理活性を予測するモデルを作成するために開発され使われていた
  • June 2006: ソフトウェアをオープンソース(BSD license)としてリリース、Rational Discoveryを閉鎖
  • 現在まで: オープンソースでの開発を継続、Novartis内で使用、Novartisからのコントリビューションはオープンソース版へ反映

他のオープンソースプロジェクトとの統合

[Link] https://www.rdkit.org/docs/Overview.html#integration-with-other-open-source-projects

[脚注1] :これらの実装は機能しますが、必ずしも最良、最速、完全であるとは限りません。

他のオープソースプロジェクトによる使用(Usage by other open-source projects)

[Link] https://www.rdkit.org/docs/Overview.html#usage-by-other-open-source-projects

この項目は必然的に最新の情報ではなくなってしまいます。もし他にご存知のプロジェクトがあれば我々に連絡、あるいはプルリクエストをサブミットしてください!

  • gpusimilarity - フィンガープリント類似性探索の Cuda/Thrustによる実装
    [link] gpusimilarity
  • Samson Connect - ナノシステムのシミュレーションと適合モデリングのためのソフトウェア
    [link] Samson Connect
  • mol_frame - DaskとPandas DataFrameのための化学構造の取り扱い
    [link] mol_frame   
  • RDKitjs - JavasScriptのためのRDKit機能のポート
    [link] RDKitjs
  • DeepChem - 化学のためのディープラーニングのためのpythonライブラリ
    [link] DeepChem
  • mmpdb - Matched molecular pair データベースの生成と分析
    [link] mmpdb
  • CheTo (文献)- ケミカルトピックモデリング
    [link] CheTo
    [link] 文献
  • OCEAN (文献)- 最適化交差反応性予測
    [link] OCEAN
    [link] 文献
  • ChEMBL Beaker - RDKit と OSARのためのスタンドアローンウェブサーバーラッパー
    [link] ChEMBL Beaker
  • myChEMBL (ブログ記事, 文献) - ケモインフォマティクスツールとオープンデータの仮想マシンによる実装
    [link] myChEMBL
    [link] ブログ記事
    [link] 文献
  • ZINC - バーチャルスクリーニングのための購入可能な化合物の無料データベース
    [link] ZINC
  • sdf_viewer.py - インラタクティブなSDFビューワー
    [link] sdf_viewer.py
  • sdf2ppt - Powerpoint/openofficeプレゼンテーションでSDFファイルの読み込みとイメージグリッドとして分子の表示を行う
    [link] sdf2ppt
  • MolGears - 生理活性分子のためのケモインフォマティクスツール
    [link] MolGears
  • PYPL - Oracle PL/SQLからPythonスクリプトの呼び出しを可能にするシンプルなカートリッジ
    [link] PYPL
  • shape-it-rdkit - silicos it からRDKitバックエンドに移植されたガウス型の分子重ね合わせコード
    [link] shape-it-rdkit
  • WONKA - タンパク質-リガンド共結晶構造の解析と精査のためのツール
    [link] WONKA
  • OOMMPPAA - タンパク質-リガンド共結晶構造に基づく指向性合成とデータ分析のためのツール
    [link] OOMMPPAA
  • OCEAN - ChEMBLをデータソースとして用いて化学構造の標的を予測するためのツール
    [link] OCEAN
  • chemfp - 非常に高速なフィンガープリント検索
    [link] chemfp
  • rdkit_ipynb_tools - IPython NotebookのためのRDKitツール
    [link] rdkit_ipynb_tools
  • Vernalis KNIME nodes
    [link] Vernalis KNIME nodes
  • Erlwood KNIME nodes
    [link] Erlwood KNIME nodes
  • AZOrange
    [link] AZOrange

The Contrib Directory

[Link] https://www.rdkit.org/docs/Overview.html#the-contrib-directory

標準RDKitディストリビューションの一部である Contrib ディレクトリはコミュニティメンバーからのコントリビューションによるコードを含みます。

脚注(Footenotes)

[Link] https://www.rdkit.org/docs/Overview.html#footnotes

脚注1: これらの実装は機能しますが、必ずしも最良、最速、あるいは最も完全であるとは限りません。

ライセンス(License)

[Link] https://www.rdkit.org/docs/Overview.html#license

この文書の著作権は copyright (C) 2013-2018 by Greg Landrum に所属しています。

この文書はCreative Commons Attribution-ShareAlike 4.0 Licenseのもとでライセンスされています。このライセンスを見るためにはhttp://creativecommons.org/licenses/by-sa/4.0/ にアクセスするか、Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. に手紙を送ってください。

このライセンスの意図はRDKitそのものの意図と似ています。簡単に言えば "これを使ってなんでもやりたいことをやっていいけど、私たちの功績にも言及してください”

12/02/2018

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

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

RDKit Documentation 翻訳に取り組むにあたって ~RDKit直訳 Day 1~

「RDKitに入門!」と題して、3回にわたりRDKitを使って遊んでみました。非常に便利で、まだまだ素敵な機能がたくさんありそうです。これまでの記事は、完全に「化学の新しいカタチ」さんの記事に負んぶに抱っこという感じで、ひたすらコードをコピー&ペーストさせていただいていました。

 

このままではいけない、自分でも調べなければ・・・ということで、手始めにRDKit のオンラインマニュアル(The RDKit Documentation)を読むことにしました。

 

折しも12月、Advent Calendarの季節!乗るしかない、このビッグウェーブに!

 

 早速作りました。題して「RDKit直訳 Advent Calendar 2018 」!

adventar.org

 そして気づいた・・・Documentation充実しすぎてて量多すぎ。

完全に見切り発車です。

心が折れそうなので目標をRDKit Documentationのうち、「Getting Started with the RDKit in Python」の翻訳としました。(それでも多い・・・)

 

そもそも翻訳など大学受験の遠い記憶ですし、進め方を最初に決めておかないとよくわからなくなってしまいそうです。そこで1日目の今日はまずどの様に進めていくかについて記載します。

 

①全体の流れ

約3週間なので、18個にざっくり分割し、月曜日から土曜日までは一つずつ訳して途中経過として公開します。

日曜日は見直し、および遅れを取り戻すための予備日としておきます。

 

②翻訳の書き方(暫定)

Markdown記法で書きます。

 はてなブログとJupyter notebookがいずれもMarkdownに対応しているので。

 Markdownの書き方から調べないと・・・)

 

・文書中のリンクは英語の本家サイトへのリンクを貼ります。

 (全体ができないと相互リンクは難しいのと管理しきれないので)

 また、単語に直接URLを貼り付けるのではなく、別途URLを記載します。

 

・脚注は文書の間に挟みます。

 Markdownの書き方が複数ありよくわからないのと、最後に脚注を記載すると行き着くまでに力尽きそうなので、出てきたところで挟んで行きます。

 また、脚注はリンクではなく、地の文とします。

 

・専門用語

 ど素人のため専門用語の訳語がわかりません。できるだけ調べるつもりではありますが、おそらくおかしな単語を連発すると思います。

 そこで、各記事の冒頭に使用した用語の英日対応を記載します。

 もし「この訳はおかしい、ありえない」と思われた方はコメント欄やtwitter で指摘していただければ幸いです。また、訳語がわからない場合「#ケモ訳語」のハッシュタグをつけてツイートするのでお気付きの方は訳語を教えていただければと思います。

 

③ライセンス

RDKit Documentation に Creative Commons Attribution-ShareAlike 4.0 License とかいてあるのですが、翻訳して公開しても大丈夫なやつということで良いですよね???

 

技術も理論もわからずに進めていくという暴挙にでているので、どこまでやれるかはわかりませんが気が向いたら覗きにいただければと思います。

 

12/01/2018

 

12/30追記

試訳をまとめたテストページを作成しました。よろしければご参照ください

RDKitドキュメンテーション非公式日本語版サイト — RDKit_unofficial_translation_JP 1.00 ドキュメント