magattacaのブログ

日付以外誤報

Fingerprinting and Molecular Similarity part2 〜RDKit 直訳 Day13〜

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

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

本日の訳出に困った用語
Morgan fingerprint: Morganフィンガープリント
Circular fingerprint: Circularフィンガープリント
family of fingerprints: 一連のフィンガープリント
Morgan algorithm: Morganアルゴリズム
user-supplied atom invariants: ユーザー定義のアトム不変量
cout: ビットのカウント数
bit vector: ビットベクトル
ECFP family of fingerprint: ECFPフィンガープリントファミリー
connectivity information: 結合関係の情報
feature-based invariant: 特徴量ベースの不変量
FCFP fingerprint: FCFPフィンガープリント
similarity score: 類似性スコア
the diameter of the atom environments considered: 考慮している原子の環境の直径
dictionary: 辞書型のデータ
submolecule: 擬似分子

以下、訳

Morganフィンガープリント(Circularフィンガープリント)(Morgan FIngerprints(Circular Fingerprints))

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#morgan-fingerprints-circular-fingerprints

circularフィンガープリント[脚注5]としてより知られているかもしれませんが、Morganフィンガープリントと呼ばれる一連のフィンガープリントは、ユーザー定義のアトム不変量のセットに対してMorganアルゴリズムを適用することで生成されます。Morganフィンガープリントを生成するときには、フィンガープリントの半径を定義しなければなりません:

[脚注5] Rogers, D.; Hahn, M. “Extended-Connectivity Fingerprints.” J. Chem. Inf. and Model. 50:742-54 (2010).

>>> from rdkit.Chem import AllChem
>>> m1 = Chem.MolFromSmiles('Cc1ccccc1')
>>> fp1 = AllChem.GetMorganFingerprint(m1,2)
>>> fp1
<rdkit.DataStructs.cDataStructs.UIntSparseIntVect object at 0x...>
>>> m2 = Chem.MolFromSmiles('Cc1ncccc1')
>>> fp2 = AllChem.GetMorganFingerprint(m2,2)
>>> DataStructs.DiceSimilarity(fp1,fp2)
0.55...

アトムペアやトポロジカルトーションのようにMorganフィンガープリントは、デフォルトではビットのカウント数を使いますが、ビットベクトルとして計算することもできます:

>>> fp1 = AllChem.GetMorganFingerprintAsBitVect(m1,2,nBits=1024)
>>> fp1
<rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x...>
>>> fp2 = AllChem.GetMorganFingerprintAsBitVect(m2,2,nBits=1024)
>>> DataStructs.DiceSimilarity(fp1,fp2)
0.51...

デフォルトのアトム不変量は、よく知られたECFPフィンガープリントファミリーで使われているものと類似した、結合関係の情報を使います。FCFPフィンガープリントで使われているものに類似した、特徴ベースの不変量を使うこともできます。特徴量の定義はFeature Definitions Used in the Morgan Fingerprintsセクションに記載されています。時折、とても異なる類似性スコアを出すことがあります。

[link] Feature Definitions Used in the Morgan Fingerprints

>>> m1 = Chem.MolFromSmiles('c1ccccn1')
>>> m2 = Chem.MolFromSmiles('c1ccco1')
>>> fp1 = AllChem.GetMorganFingerprint(m1,2)
>>> fp2 = AllChem.GetMorganFingerprint(m2,2)
>>> ffp1 = AllChem.GetMorganFingerprint(m1,2,useFeatures=True)
>>> ffp2 = AllChem.GetMorganFingerprint(m2,2,useFeatures=True)
>>> DataStructs.DiceSimilarity(fp1,fp2)
0.36...
>>> DataStructs.DiceSimilarity(ffp1,ffp2)
0.90...

RDKitで生成したECFP/FCFPフィンガープリントとMorganフィンガープリントを比較する際には、Morganフィンガープリントのパラメーターが半径であるのに対して、ECFP4の4は考慮している原子の環境の直径に一致していることを思い出してください。したがって、上記の例では半径=2とすることで、ECFP4とFCFP4とおおよそ等価となります。

rdkit.Chem.rdMolDescriptors.GetMorganFingerprint()のオプションの不変量の引数を使うことで、ユーザー自身でアトム不変量を設定することもできます。不変量に定数を使った簡単な例が以下になります。得られたフィンカープリントで分子のトポロジーを比較しています。

[link] rdkit.Chem.rdMolDescriptors.GetMorganFingerprint()

>>> m1 = Chem.MolFromSmiles('Cc1ccccc1')
>>> m2 = Chem.MolFromSmiles('Cc1ncncn1')
>>> fp1 = AllChem.GetMorganFingerprint(m1,2,invariants=[1]*m1.GetNumAtoms())
>>> fp2 = AllChem.GetMorganFingerprint(m2,2,invariants=[1]*m2.GetNumAtoms())
>>> fp1==fp2
True

デフォルトでは結合次数が考慮されていることに注意してください:

>>> m3 = Chem.MolFromSmiles('CC1CCCCC1')
>>> fp3 = AllChem.GetMorganFingerprint(m3,2,invariants=[1]*m3.GetNumAtoms())
>>> fp1==fp3
False

この設定を外すこともできます:

>>> fp1 = AllChem.GetMorganFingerprint(m1,2,invariants=[1]*m1.GetNumAtoms(),
... useBondTypes=False)
>>> fp3 = AllChem.GetMorganFingerprint(m3,2,invariants=[1]*m3.GetNumAtoms(),
... useBondTypes=False)
>>> fp1==fp3
True

モーガンフィンガープリントのビットの説明(Explaining bits from Morgan Fingerprints)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#explaining-bits-from-morgan-fingerprints

bitinfo引数を介して、Morganフィンガープリントの特定のビットに寄与する原子についての情報を手に入れることができます。この辞書型のデータには、フィンガープリントのビットセットごとに一つのエントリーが取り込まれており、キー[key]はビットID、値[value]は(アトムインデックス、半径)のタプルのリストとなっています。

>>> m = Chem.MolFromSmiles('c1cccnc1C')
>>> info={}
>>> fp = AllChem.GetMorganFingerprint(m,2,bitInfo=info)
>>> len(fp.GetNonzeroElements())
16
>>> len(info)
16
>>> info[98513984]
((1, 1), (2, 1))
>>> info[4048591891]
((5, 2),)

上記を解釈すると、ビット98513984はatom 1とatom 2に一度ずつ、それぞれ半径1で計2回セットされています。また、ビット4048591891はatom 5に半径2でセットされています。

ビット4048591891にフォーカスを当ててみましょう。分子全体から、atom 5の半径2の中にある全ての原子からなる部分[擬似分子 submolecule]を抜き出すことができます:

>>> env = Chem.FindAtomEnvironmentOfRadiusN(m,2,5)
>>> amap={}
>>> submol=Chem.PathToSubmol(m,env,atomMap=amap)
>>> submol.GetNumAtoms()
6
>>> amap
{0: 3, 1: 5, 3: 4, 4: 0, 5: 1, 6: 2}

この擬似分子のSMILESを生成することでビットを"説明"しましょう:

>>> Chem.MolToSmiles(submol)
'ccc(C)nc'

中心の原子にSMILESの起点[root]を置くともっと役に立ちます:

>>> Chem.MolToSmiles(submol,rootedAtAtom=amap[5],canonical=False)
'c(nc)(C)cc'

上記の代わりとなる別の方法として、rdkit.Chem.MolFragmentToSmiles()関数をつかうと、同じことを(特に多数の分子を扱う際に、より高速に)行うことができます。

[link] rdkit.Chem.MolFragmentToSmiles()

>>> atoms=set()
>>> for bidx in env:
...     atoms.add(m.GetBondWithIdx(bidx).GetBeginAtomIdx())
...     atoms.add(m.GetBondWithIdx(bidx).GetEndAtomIdx())
...
>>> Chem.MolFragmentToSmiles(m,atomsToUse=list(atoms),bondsToUse=env,rootedAtAtom=5)
'c(C)(cc)nc'

フィンガープリントのビットのイメージの生成(Generating images of fingerprint bits)

[Link] https://www.rdkit.org/docs/GettingStartedInPython.html#generating-images-of-fingerprint-bits

MorganフィンガープリントとRDKitフィンガープリントに対しては、rdkit.Chem.Draw.DrawMorganBit()関数とrdkit.Chem.Draw.DrawRDKitBit()関数を使うことでビットを定義する原子の環境のイメージを生成することができます。

[link] rdkit.Chem.Draw.DrawMorganBit()
[link] rdkit.Chem.Draw.DrawRDKitBit()

>>> from rdkit.Chem import Draw
>>> mol = Chem.MolFromSmiles('c1ccccc1CC1CC1')
>>> bi = {}
>>> fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, bitInfo=bi)
>>> bi[872]
((6, 2),)
>>> mfp2_svg = Draw.DrawMorganBit(mol, 872, bi)
>>> rdkbi = {}
>>> rdkfp = Chem.RDKFingerprint(mol, maxPath=5, bitInfo=rdkbi)
>>> rdkbi[1553]
[[0, 1, 9, 5, 4], [2, 3, 4, 9, 5]]
>>> rdk_svg = Draw.DrawRDKitBit(mol, 1553, rdkbi)

このようなイメージができます:

svg未対応のためFigureは省略(mfp2_bit872.svg, rdk_bit1553.svg)


Morgan bit          RDKit bit          

Morganビットのデフォルトのハイライトの色は以下を示します:
* blue: 環境の中心となるアトム
* yellow: 芳香族のアトム
* gray: 脂肪族環構造のアトム

RDKitビットのデフォルトのハイライトの色は以下を示します:
* yellow: 芳香族のアトム

(上記のRDKitフィンガープリントのビット1553の例のように)分子の複数の原子に同じビットがセットされている場合には、描画機能は一番最初の例を表示することに気をつけてください。どの例を表示するか明示することで変更することができます:

>>> rdk_svg = Draw.DrawRDKitBit(mol, 1553, rdkbi, whichExample=1)

このようなイメージができます:

svg未対応のためFigureは省略(rdk_bit_1553_2.svg)
RDKit bit

12/13/2018

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

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