magattacaのブログ

日付以外誤報

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