小ネタ:Fingerprint の算出方法
RDKit にはさまざまな fingerprint が実装されています。
おそらく最もよく使われている fingerprint は Morgan fingerprint (ECFP)ですが、他にも MACCS Key や SMILES extended-connectivity fingerprint (SECFP)、MinHash fingerprint (MHFP) などの計算も可能です。
MHFP と SECFP については以下の Reymond の原著論文を参照して下さい。
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 は保存することもできます。
以下に 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