ご注文はリード化合物ですか?〜医薬化学録にわ〜

自分の勉強や備忘録などを兼ねて好き勝手なことを書いていくブログです。

小ネタ:Fingerprint の算出方法

RDKit にはさまざまな fingerprint が実装されています。
おそらく最もよく使われている fingerprint は Morgan fingerprint (ECFP)ですが、他にも MACCS Key や SMILES extended-connectivity fingerprint (SECFP)、MinHash fingerprint (MHFP) などの計算も可能です。
MHFP と SECFP については以下の Reymond の原著論文を参照して下さい。

jcheminf.biomedcentral.com

RDKit で各 fingerprint を計算するサンプルコードは以下の通りです。

from rdkit.Chem.rdMolDescriptors import GetMACCSKeysFingerprint, GetMorganFingerprintAsBitVect
from rdkit.Chem.rdMHFPFingerprint import MHFPEncoder

# Mol オブジェクトのリストを用意
mols = [Chem.MolFromSmiles(smiles) for smiles in ["CCO", "c1ccccc1", "CC(=O)Oc1ccccc1C(=O)O"]]

# MACCS Key
maccs = np.array([GetMACCSKeysFingerprint(mol) for mol in mols])

# ECFP4
ecfp4 = np.array([GetMorganFingerprintAsBitVect(mol, 2, 2048) for mol in mols])

# ECFP6
ecfp6 = np.array([GetMorganFingerprintAsBitVect(mol, 3, 2048) for mol in mols])

# FCFP4
ecfp4 = np.array([GetMorganFingerprintAsBitVect(mol, 2, 2048, useFeatures = True) for mol in mols])

# FCFP6
ecfp4 = np.array([GetMorganFingerprintAsBitVect(mol, 3, 2048, useFeatures = True) for mol in mols])

# SECFP4
secfp4 = np.array([MHFPEncoder().EncodeSECFPMol(mol, 2) for mol in mols])

# SECFP6
secfp4 = np.array([MHFPEncoder().EncodeSECFPMol(mol, 3) for mol in mols])

# MHFP4、binary vector ではなく、整数のベクトルが得られる。
mhfp4 = np.array([MHFPEncoder().EncodeMol(mol, 2) for mol in mols])

# MHFP6、binary vector ではなく、整数のベクトルが得られる。
mhfp6 = np.array([MHFPEncoder().EncodeMol(mol, 3) for mol in mols])

MACCS Key は 167 次元のベクトルが出力されますが、最初の次元は必ず 0 なので、それを除いた 166 次元のベクトルを解析に用いて下さい。
各 fingerprint の数字は fingerprint に対応する fragment の直径のパスの長さを示します。関数の引数は半径のパスの長さなので、注意して下さい。
MHFP は Reymond のグループが公開しているものと挙動が異なる可能性があります(要検証)。

算出した fingerprint は保存することもできます。

github.com

以下に fingerprint の保存例を示します。

# Fingerprint の算出
mol = Chem.MolFromSmiles("CC(=O)Oc1ccccc1C(=O)O")
fp = GetMorganFingerprintAsBitVect(mol, 2, 2048)

# Fingerprint を文字列表記する
fp_str = fp.ToBase64()

# テキストファイルなどにして保存
with open("ecfp4.txt", "a") as writer:
    writer.write()

Fingerprint の復元例は以下の通りです。

from rdkit.DataStructs.cDataStructs import ExplicitBitVect

# テキストファイルから fingerprint の文字列を読み込む
with open("ecfp4.txt", "r") as reader:
    fp_str = reader.read()

# Fingerprint 復元用のインスタンスを作成。Vector の次元数を引数とする
re_fp = ExplicitBitVect(2048)

# Fingerprint の文字列を読み込ませて復元する
re_fp.FromBase64(fp_str)

# 復元した fingerprint が元の fingerprint と一致しているか確認
re_fp == fp