Fingerprintの可視化について

フィンガープリント(Fingerprint)をRDkitで可視化する方法についてまとめた。
(本記事は「化学の新しいカタチ」の内容を簡潔にまとめたものです。より詳しい内容はそちらに載っています)

フィンガープリントについて

フィンガープリントとは、化合物中に特定の部分構造が含まれるかを 「0 or 1」のビットで表したもの(参考)。
化合物の物性予測の際の変数としてよく用いられるが、あるビットが重要だと分かったとしても、化学的な知見を得るためにはビットと構造を紐づけて可視化することが必須となる。
(フィンガープリントへの変換方法まとめはこちら

準備

モジュールのインストール

conda install -c conda-forge rdkit

分子の準備

題材としてカフェイン分子を利用する。

from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw
mol = Chem.MolFromSmiles('Cn1c(=O)c2c(ncn2C)n(C)c1=O')
smiles = Chem.MolToSmiles(mol)
# とりあえず描画したい時
img = Draw.MolToImage(mol)
img.save('caffeine_molecule.png',bbox_inches='tight')
img


可視化

可視化に対応している、 「Morganフィンガープリント」 および、 「RDkitフィンガープリント」両方で可視化してみる。

Morganフィンガープリント

### Morganフィンガープリント
#ビットの立っている位置と,関連する部分構造を記録する辞書(Fingerprintの可視化に必要)
bitI_morgan = {}
fp_morgan = AllChem.GetMorganFingerprintAsBitVect(mol, 2, 1024, bitInfo=bitI_morgan)
#ビットの立っている一と関連する部分構造が辞書形式で格納される。
print('Morgan Fingerprintの数:',fp_morgan.GetNumBits())
print('Onのビットの数:',fp_morgan.GetNumOnBits())
"""output
Morgan Fingerprintの数: 1024
Onのビットの数: 24
"""
#それぞれのビットが立っているか調べる
for key in list(bitI_morgan.keys())[:5]:
print('ビット:{};, 関連する部分構造:{}'.format(key, bitI_morgan[key]))
"""output
ビット:0;, 関連する部分構造:((10, 2),)
ビット:33;, 関連する部分構造:((0, 0), (9, 0), (11, 0), (5, 2))
ビット:121;, 関連する部分構造:((0, 1), (9, 1), (11, 1))
ビット:179;, 関連する部分構造:((6, 2),)
ビット:234;, 関連する部分構造:((1, 2),)
"""
#単一のビット可視化にはDrawMorganbitを使う。
img = Draw.DrawMorganBit(mol, list(bitI_morgan.keys())[1], bitI_morgan)
img.save('bit_single_molecule_morgan.png',bbox_inches='tight')
#複数のビットの可視化
morgan_turples = ((mol, bit, bitI_morgan) for bit in list(bitI_morgan.keys()))
img = Draw.DrawMorganBits(morgan_turples, molsPerRow=5,
legends=['bit: '+str(x) for x in list(bitI_morgan.keys())])
img.save('bit_several_molecule_morgan.png',bbox_inches='tight')
img

単一ビットの描画結果


複数ビットの描画結果


MorganFingerprint可視化方法のルール

(参考HPより)

  • 原子の位置は分子内の位置と同じように描画
  • ビット情報の中心原子は薄い青丸で表現
  • 芳香族原子は黄色い丸で表現
  • 環状の脂肪族原子は灰色で表現
  • 直接にはフィンガープリントに含まれないが,原子の結合タイプ決定に影響する部分を薄い灰色で表現

RDkitフィンガープリント

#ビットの立っている位置と,関連する部分構造を記録する辞書(Fingerprintの可視化に必要)
bitI_rdkit = {}
fp_rdkit = Chem.RDKFingerprint(mol, fpSize=1024, bitInfo=bitI_rdkit)
#ビットの立っている一と関連する部分構造が辞書形式で格納される。
print('RDkit Fingerprintの数:',fp_rdkit.GetNumBits())
print('Onのビットの数:',fp_rdkit.GetNumOnBits())
"""output
RDkit Fingerprintの数: 1024
Onのビットの数: 626
"""
#それぞれのビットが立っているか調べる
for key in list(bitI_rdkit.keys())[:5]:
print('ビット:{};, 関連する部分構造:{}'.format(key, bitI_rdkit[key]))
"""output
ビット:0;, 関連する部分構造:[[1, 3, 4], [3, 4, 9], [3, 4, 5]]
ビット:1;, 関連する部分構造:[[0, 13, 11, 9, 4, 14, 8], [0, 13, 1, 3, 4, 9, 2], [0, 13, 1, 3, 4, 5, 2], [1, 3, 14, 8, 13, 11, 10], [4, 9, 11, 10, 5, 14, 8]]
ビット:2;, 関連する部分構造:[[3], [4]]
ビット:3;, 関連する部分構造:[[1], [5], [6], [7], [9], [11], [13], [14]]
ビット:4;, 関連する部分構造:[[0, 13, 11, 10, 9, 4], [0, 13, 11, 10, 1, 3]]
"""
#単一のビット可視化にはDrawRDkitbitを使う。
img = Draw.DrawRDKitBit(mol, list(bitI_rdkit.keys())[0], bitI_rdkit)
img.save('bit_single_molecule_RDKit.png',bbox_inches='tight')
#複数のビットの可視化
rdkit_turples = ((mol, bit, bitI_rdkit) for bit in list(bitI_rdkit.keys())[:12])
img = Draw.DrawRDKitBits(rdkit_turples, molsPerRow=5,
legends=['bit: '+str(x) for x in list(bitI_rdkit.keys())[:12]])
img.save('bit_several_molecule_rdkit.png',bbox_inches='tight')
img

単一ビットの描画結果


複数ビットの描画結果


<<

RDKitフィンガープリント可視化のルール

参考HPより)

  • 原子の位置は分子内の位置と同じように描画
  • 描画された結合は全てビット情報の一部
  • 芳香族原子は黄色い丸で表現
  • 脂肪族原子はデフォルト設定では特に決まった表記なし

参考

関連書籍