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