#7 RDKit の DrawMorganBit でBit collisionを確認した

yamasaKit
8 min readNov 7, 2018

--

TL; DR

DrawMorganBit や DrawMorganBits では Bit collisionしている場合も Bit に入っている部分構造の一例しか表示されません。DrawMorganBit では引数 whichExample を用いて表示するものを変更できます。

あと #6 で FCFP2 は芳香性炭素の情報が含まれてないと言ったのは間違いでした。詳しくは記事をご覧ください。

以下にコード例をのせておきます。

背景

#6RDKit の DrawMorganBits という関数を用いて ECFP, FCFP の各 Bit に含まれる部分構造の表示を行いました。最後に Bit collision している場合どの部分構造が表示されるのか?と疑問を投げかけてしめくくりましたが今回そちらを確認しました。

あと FCFP2 は芳香性炭素の情報が含まれてないと言ってしまってましたがちょっと変だなぁと思ったので詳しく調べたらちゃんと含まれていました。その辺も訂正としてまとめて解説したいと思います。

結果

1. FCFP2 の芳香性炭素
RDKit の FCFP の定義を見ると Aromatic は [a] と記載されておりすべての芳香性の原子と言えます。それなら #6 にて ECFP2 には radius=0 の芳香性炭素があったけど FCFP2 にはなさそうに見えたのは何故なのかというと

Fig. 1 Bit ID=4, whichExample=0 in unhashed FCFP2
Fig. 2 Bit ID=4, whichExample=1 in unhashed FCFP2

実は Fig.1 が FCFP2 の radius=0 の芳香性炭素を表している図でした。FCFP の Aromatic に関しては周りの原子の情報を考慮してないようで私は ”単結合で炭素と結合している芳香性炭素” の部分構造と誤解してしまい Fig. 2 と違うと思ったのですが FCFP では同じ部分構造と扱われるようです。訂正してお詫びします。

このような誤解を生まないためにも引数 whichExample を用いて複数の部分構造例を表示するのが大事ですね。 Fig. 1, 2 は同じ Bit ID の部分構造なのですが DrawMorganBit 関数の whichExample を変更することでどちらも表示することができました。(残念ながら DrawMorganBits には whichExampleがなさそうです)

# Draw Fig. 1
DrawMorganBit(mol, 4, FCFP2_bit_info, whichExample=0,
legend='Bit ID=4, whichExample=0')
# Draw Fig. 2
DrawMorganBit(mol, 4, FCFP2_bit_info, whichExample=1,
legend='Bit ID=4, whichExample=1')

whichExample に与えることのできる数字は分子中のある Bit ID が割り当てられている部分構造の数ですね。 Bit Info を確認すればいくつあるか確認できます。

Fig. 3 Aspirin with Atom Index
FCFP2_bit_info = {}
_ = AllChem.GetMorganFingerprint(mol, radius=1,
bitInfo=FCFP2_bit_info, useFeatures=True)
FCFP2_bit_info
{0: ((0, 0), (1, 0)),
1: ((12, 0),),
2: ((2, 0), (3, 0), (11, 0)),
4: ((4, 0), (5, 0), (6, 0), (7, 0), (8, 0), (9, 0)),
32: ((10, 0),),
605972801: ((10, 1),),
614173298: ((1, 1),),
728497630: ((9, 1),),
728943675: ((4, 1),),
3205495832: ((11, 1),),
3205495869: ((0, 1),),
3205496734: ((12, 1),),
3205496824: ((2, 1),),
3764344801: ((5, 1), (6, 1), (7, 1), (8, 1)),
3768571846: ((3, 1),)
}

上記の例の場合 Bit ID 4 は Atom Index 4, 5, 6, 7, 8, 9 の原子を中心とした radius=0 の部分構造であり全部で 6 個分子中にあることがわかります。したがって whichExample は 0–5 まで与えることができます。具体的にどのような部分構造が表示されるかは gist のコードをご覧ください。

なお Atom index をあらかじめ表示するように設定しておくと非常にわかりやすくなりますね。Atom Index の表示はこちらのページを参考にさせてもらいました。

2. hashed Fingerprint で Bit collision がある場合の表示
Bit Info がどのようなルールで書かれているかがわかれば、 Bit collision がある場合 DrawMorganBit(s) がどのように表示されるかを確認するのは簡単です。Aspirin の 8 Bit ECFP2 を発生させてみましょう。
#6 にてunhashed ECFP2 の時には 17 種類の部分構造に対する Bit ID が発生していたので Bit collision は確実にしているはずです。

ECFP2_8_bit_info = {}
_ = AllChem.GetMorganFingerprintAsBitVect(mol, radius=1, nBits=8,
bitInfo=ECFP2_8_bit_info)
ECFP2_8_bit_info
{0: ((6, 1), (7, 1), (10, 1)),
1: ((0, 0), (5, 0), (6, 0), (7, 0), (8, 0), (0, 1), (3, 1)),
2: ((2, 0), (11, 0), (4, 1)),
3: ((1, 1),),
4: ((4, 0), (9, 0)),
5: ((2, 1), (11, 1), (12, 1)),
6: ((5, 1), (8, 1)),
7: ((1, 0), (3, 0), (10, 0), (12, 0), (9, 1))}

全部で 8 個 Bit ID が出力されています。そして Bit ID 1 に注目すると、 radius=0 または 1 と 明らかに radius が異なる部分構造が同時に含まれており Bit collision していることがわかります。

whichExample を用いて異なる部分構造を表示してみましょう。以下のようになります。 (whichExample=2, 3, 4 はwhichExample=1と同じ図になるので省略)

Fig. 4 Bit ID=1, whichExample=0 in 8 Bit FCFP2
Fig. 5 Bit ID=1, whichExample=1 in 8 Bit FCFP2
Fig. 6 Bit ID=1, whichExample=5 in 8 Bit FCFP2
Fig. 7 Bit ID=1, whichExample=6 in 8 Bit FCFP2

上記の 4 種類の部分構造がすべて同じ Bit に入ってしまっているのを確認することができました。デフォルトだと Fig. 4 が表示されるのでこれだけを見て Fig. 5, 6, 7 も同じ Bit に入っているというのはなかなか想像できませんよね。

最後に

Bit collision している場合 DrawMorganBit(s)のデフォルトとして表示される whichExample=0 の図だけ見ていては (私がしてしまったように) 誤解を生む可能性があります。#6 で示したように unhashed Fingerprint を用いて Bit collision を防いだり、 whichExample を用いてすべての図を表示したりすると良いと思います。

Python (version 3.6.2)
RDKit (version 2018.09.1)

--

--