magattacaのブログ

日付以外誤報

Substructure Searching〜RDKit 直訳 Day8〜

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

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

本日の訳出に困った用語
substructure matching : 部分構造の一致検索
query : クエリ
atom index : アトムインデックス
list comprehension syntax : リスト内包表記
semantics : セマンティクス(意味?意図?)
argument: 引数
non-chiral query: 非キラルクエリ
SMARTS pattern : SMRTS パターン(SMARTS言語 (SMiles ARbitrary Target Specification) は、パターン記述言語) reaction SMARTS : reaction SMARTS
recursive SMARTS: recursive SMARTS
atom map bumber proerty :アトムマップナンバーのプロパティ

以下、訳

部分構造探索(Substructure Searching)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#substructure-searching

SMARTSから構築された分子のクエリを使えば、部分構造の一致検索ができます:

>>> m = Chem.MolFromSmiles('c1ccccc1O')
>>> patt = Chem.MolFromSmarts('ccO')
>>> m.HasSubstructMatch(patt)
True
>>> m.GetSubstructMatch(patt)
(0, 5, 6)

これらは"patt"に保存された原子で並べられた、分子"m"のアトムインデックスです。一致した組み合わせをすべて得るには次のようにします:

>>> m.GetSubstructMatches(patt)
((0, 5, 6), (4, 5, 6))

これを使って、分子のリストに簡単にフィルタをかけることができます:

>>> suppl = Chem.SDMolSupplier('data/actives_5ht3.sdf')
>>> patt = Chem.MolFromSmarts('c[NH1]')
>>> matches = []
>>> for mol in suppl:
...   if mol.HasSubstructMatch(patt):
...     matches.append(mol)
...
>>> len(matches)
22

同じことをPythonのリスト内包表記をつかってより簡潔に書けます:

>>> matches = [x for x in suppl if x.HasSubstructMatch(patt)]
>>> len(matches)
22

SMARTSの代わりにSMILESから構築した分子を使用して部分構造の一致検索をすることもできます:

>>> m = Chem.MolFromSmiles('C1=CC=CC=C1OC')
>>> m.HasSubstructMatch(Chem.MolFromSmarts('CO'))
True
>>> m.HasSubstructMatch(Chem.MolFromSmiles('CO'))
True

ですが、二つの表記法の意味するもの[semantics]が完全に等価であるわけではないことは忘れない様にしてください:

>>> m.HasSubstructMatch(Chem.MolFromSmiles('COC'))
True
>>> m.HasSubstructMatch(Chem.MolFromSmarts('COC'))
False
>>> m.HasSubstructMatch(Chem.MolFromSmarts('COc')) #<- need an aromatic C
True

部分構造一致検索における立体化学(Stereochemistry in substructure matches)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#stereochemistry-in-substructure-matches

デフォルトでは部分構造検索で立体化学に関する情報は使われません:

>>> m = Chem.MolFromSmiles('CC[C@H](F)Cl')
>>> m.HasSubstructMatch(Chem.MolFromSmiles('C[C@H](F)Cl'))
True
>>> m.HasSubstructMatch(Chem.MolFromSmiles('C[C@@H](F)Cl'))
True
>>> m.HasSubstructMatch(Chem.MolFromSmiles('CC(F)Cl'))
True

useChirality 引数によって変更可能です:

>>> m.HasSubstructMatch(Chem.MolFromSmiles('C[C@H](F)Cl'),useChirality=True)
True
>>> m.HasSubstructMatch(Chem.MolFromSmiles('C[C@@H](F)Cl'),useChirality=True)
False
>>> m.HasSubstructMatch(Chem.MolFromSmiles('CC(F)Cl'),useChirality=True)
True

useChirality が設定されると非キラルクエリがキラルクエリにマッチすることに注意してください。キラルクエリは非キラルクエリには一致しません:

>>> m.HasSubstructMatch(Chem.MolFromSmiles('CC(F)Cl'))
True
>>> m2 = Chem.MolFromSmiles('CCC(F)Cl')
>>> m2.HasSubstructMatch(Chem.MolFromSmiles('C[C@H](F)Cl'),useChirality=True)
False

SMARTSのアトムマップインデックス(Atom Map Indices in SMARTS)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#atom-map-indices-in-smarts

SMARTS(Chemical Reactionsを参照)で最もよく使われますが、より一般的なものです。例えば、Guba et al.(DOI: acs.jcim.5b00522)によるSMARTSパターンを使った二面角の解析ではインデックスが注目している二面角を成す4つの原子を定義するのに使われています。芳香族のC=N二面角の場合は [cH0:1][c:2]([cH0])!@[CX3!r:3]=[NX2!r:4] という様になります。なぜrecursive SMARTSを使わなかったのだろうか、その方がもっと簡単になるのに、という疑問が頭をよぎるかもしれませんが、彼らがそうしているので仕方ありません。GetSubstructureMatchesで得られるアトムリストはSMARTSの順番になっていることが保証されていますが、この場合5つの原子を得るので、正しい順番で注目している4つの原子を選び出す必要があります。SMARTSの解析が行われると、関係する原子にアトムマップナンバーのプロパティが割り当てられますが、この情報は簡単に引き出すことができます。

[link] Chemical Reactions

>>> qmol = Chem.MolFromSmarts( '[cH0:1][c:2]([cH0])!@[CX3!r:3]=[NX2!r:4]' )
>>> ind_map = {}
>>> for atom in qmol.GetAtoms() :
...     map_num = atom.GetAtomMapNum()
...     if map_num:
...         ind_map[map_num-1] = atom.GetIdx()
>>> ind_map
{0: 0, 1: 1, 2: 3, 3: 4}
>>> map_list = [ind_map[x] for x in sorted(ind_map)]
>>> map_list
[0, 1, 3, 4]

次に、分子のクエリを使うと条件にマッチした4つの原子のインデックスを以下の様に得ることができます:

>>> mol = Chem.MolFromSmiles('Cc1cccc(C)c1C(C)=NC')
>>> for match in mol.GetSubstructMatches( qmol ) :
...     mas = [match[x] for x in map_list]
...     print(mas)
[1, 7, 8, 10]

12/08/2018

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

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