magattacaのブログ

日付以外誤報

Maximum Common Substructure 〜RDKit 直訳 Day11〜

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

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

本日の訳出に困った用語
SMARTS string: SMARTS 文字列
bond type : 結合タイプ
comparison function : 比較関数
Isotope label : 同位体ラベル
wall-clock senconds:実時間
CPU seconds:CPU時間

以下、訳

最大共通部分構造(Maximum Common Substructure)

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

FindMCS関数は2つ以上の分子から最大共通部分構造(MCS)を見つけ出します:

>>> from rdkit.Chem import rdFMCS
>>> mol1 = Chem.MolFromSmiles("O=C(NCc1cc(OC)c(O)cc1)CCCC/C=C/C(C)C")
>>> mol2 = Chem.MolFromSmiles("CC(C)CCCCCC(=O)NCC1=CC(=C(C=C1)O)OC")
>>> mol3 = Chem.MolFromSmiles("c1(C=O)cc(OC)c(O)cc1")
>>> mols = [mol1,mol2,mol3]
>>> res=rdFMCS.FindMCS(mols)
>>> res
<rdkit.Chem.rdFMCS.MCSResult object at 0x...>
>>> res.numAtoms
10
>>> res.numBonds
10
>>> res.smartsString
'[#6]1(-[#6]):[#6]:[#6](-[#8]-[#6]):[#6](:[#6]:[#6]:1)-[#8]'
>>> res.canceled
False

FindMCS変数は、MCS中の原子と結合の番号の情報をもつMCSReultインスタンスと、見つかったMCSに一致するSMARTS文字列、そしてアルゴリズムタイムアウトした場合に教えてくれるフラグを返します。MCSが見つからなかった場合は、原子と結合の番号は0、SMARTSは''となります。

デフォルトでは、2つの原子は同じ元素の時に、2つの結合は同じ結合のタイプの時に一致となります。異なる比較関数をつかうにはatomComparebondCompareを明示してください。例えば以下の様に:

>>> mols = (Chem.MolFromSmiles('NCC'),Chem.MolFromSmiles('OC=C'))
>>> rdFMCS.FindMCS(mols).smartsString
''
>>> rdFMCS.FindMCS(mols, atomCompare=rdFMCS.AtomCompare.CompareAny).smartsString
'[#7,#8]-[#6]'
>>> rdFMCS.FindMCS(mols, bondCompare=rdFMCS.BondCompare.CompareAny).smartsString
'[#6]-,=[#6]'

atomCompare引数のオプションは、CompareAnyはいずれの原子も他のいかなる原子にもマッチする、CompareElementsは元素のタイプによって比較する、CompareIsotopesは同位体ラベルに基づいてマッチする、となっています。同位体ラベルはユーザー定義されたアトムタイプの実装にも使うことができます。CompareAnyのbondCompareはいずれの結合も他のいかなる結合にもマッチし、CompareOrderExactは同じ結合タイプを有する時のみ等価であるとします。そしてCompareOrderは単結合と芳香族結合が互いにマッチすることは許容しますが、それ以外については正確な結合次数の一致を要求します。

>>> mols = (Chem.MolFromSmiles('c1ccccc1'),Chem.MolFromSmiles('C1CCCC=C1'))
>>> rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareAny).smartsString
'[#6]1:,-[#6]:,-[#6]:,-[#6]:,-[#6]:,=[#6]:,-1'
>>> rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrderExact).smartsString
''
>>> rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrder).smartsString
'[#6](:,-[#6]:,-[#6]:,-[#6]):,-[#6]:,-[#6]'

部分構造は原子と結合の両方を保持します。デフォルトではアルゴリズムは見つかる結合の数を最大化しようとします。この設定はmaximizeBonds引数をFalseに設定することで変更できます。2つの小さな環構造は一つの大きな環構造よりも結合の数が少なくなるかもしれませんが、結合の数を最大化しようとする設定では環構造の数を最大化しようとする傾向があります。  

価数3の窒素原子を価数5の窒素原子とマッチさせたくない場合があるかもしれません。デフォルトではmachValenceがFlaseとなっており、価数の情報を無視します。Trueとすると、atomCompareの設定が、2つの原子が同じ価数を有することも要求する様に変更されます。

>>> mols = (Chem.MolFromSmiles('NC1OC1'),Chem.MolFromSmiles('C1OC1[N+](=O)[O-]'))
>>> rdFMCS.FindMCS(mols).numAtoms
4
>>> rdFMCS.FindMCS(mols, matchValences=True).numBonds
3

炭素原子からなる直鎖構造が環構造とマッチするのが奇妙に見えるかもしれませんが、ringMatchesRingOnlyがデフォルトではFalseとなっているからです。Trueに変更すると、環構造の結合は、環構造とだけマッチする様になります。

>>> mols = [Chem.MolFromSmiles("C1CCC1CCC"), Chem.MolFromSmiles("C1CCCCCC1")]
>>> rdFMCS.FindMCS(mols).smartsString
'[#6](-[#6]-[#6])-[#6]-[#6]-[#6]-[#6]'
>>> rdFMCS.FindMCS(mols, ringMatchesRingOnly=True).smartsString
'[#6](-[#6]-[#6])-[#6]'

さらに制限を加えることもでき、(この場合の様に)環構造のうち部分構造の場合は許容されないように設定することもできます。つまり、ある原子がMCSの一部で、分子全体の環構造の中にあるなら、その原子はMCSの環構造に含まれます。completeRingsOnlyをTrueとすることで、この必要条件のオン・オフを切り替えることができます。ringMatchesRingOnlyもTrueとして下さい。

>>> mols = [Chem.MolFromSmiles("CCC1CC2C1CN2"), Chem.MolFromSmiles("C1CC2C1CC2")]
>>> rdFMCS.FindMCS(mols).smartsString
'[#6]1-[#6]-[#6](-[#6]-1-[#6])-[#6]'
>>> rdFMCS.FindMCS(mols, ringMatchesRingOnly=True).smartsString
'[#6](-[#6]-[#6]-[#6]-[#6])-[#6]'
>>> rdFMCS.FindMCS(mols, completeRingsOnly=True).smartsString
'[#6]1-[#6]-[#6]-[#6]-1'

MCSアルゴリズムは最大共通部分構造を網羅的に探索します。大抵の場合あっという間に終わりますが、数分あるいはもっと時間がかかる場合があります。timeoutパラメータを使えば、設定した秒数(実時間でCPU時間ではありません)で検索を打ち切り、時間内で見つかった最も良い一致構造を返します。タイムアウトの時間に達するとMCSResultのcanceledプロパティがFalseではなくTrueとなります。

>>> mols = [Chem.MolFromSmiles("Nc1ccccc1"*10), Chem.MolFromSmiles("Nc1ccccccccc1"*10)]
>>> rdFMCS.FindMCS(mols, timeout=1).canceled
True

(50秒後のMCSは511の原子を含みました。)

12/11/2018

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

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