RDkitで各種の分子フィンガープリントの生成を行います。
マルチSDF読み込み
delaney水溶解度データセットから作成したマルチSDFを読み込みます。
from rdkit import Chem mols = Chem.SDMolSupplier('delaney_multi.sdf') for mol in mols: print(mol.GetProp("_Name")) print(mol.GetPropsAsDict())
### out Amigdalin {'sol_exp': -0.77} Fenfuram {'sol_exp': -3.3} citral {'sol_exp': -2.06} ~~~ 2-Methylbutane {'sol_exp': -3.18} Stirofos {'sol_exp': -4.522}
MACCS Keys
フラグメント構造に基づくフィンガープリント。166bit
import numpy as np from rdkit.Chem import MACCSkeys fps1 = [ MACCSkeys.GenMACCSKeys(mol).ToBitString() for mol in mols] fps2 = [ list(map(int,list(fps))) for fps in fps1] fps3 = np.array(fps2)
>>>print(fps3) [[0 0 0 ... 1 1 0] [0 0 0 ... 1 1 0] [0 0 0 ... 1 0 0] ... [0 0 0 ... 1 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 1 1 0]]
numpy行列でフィンガープリントを得るために煩雑な処理をしています。 もっと賢い方法がある気がしますがまあ良いでしょう。
それぞれのbitがどんな構造を表しているかは下記リンクがわかりやすいです。
MayaChemTools:Documentation:Fingerprints/MACCSKeys.pm
Morgan Fingerprint
circular fingerprintsとも言われます。 MACCSkey同様にフラグメント構造に基づいていますが、こちらは各フラグメント間の距離もある程度考慮されます。
from rdkit.Chem import AllChem fps1 = [ AllChem.GetMorganFingerprintAsBitVect(mol,radius=2,nBits=1024) for mol in mols] fps2 = [ list(map(int,list(fps))) for fps in fps1] fps3 = np.array(fps2)
公式ドキュメントによるとradius=2でECFP4と概ね同等とのこと。
それぞれのbitが何を表しているのかを見てみます。
mol = mols[0] info={} fp = AllChem.GetMorganFingerprint(mol,2,bitInfo=info) print(len(fp.GetNonzeroElements())) # 44 print(len(info)) # 44
>>>info {98513984: ((16, 1), (17, 1), (18, 1)), 199163361: ((10, 1),), 266675433: ((21, 1), (23, 1), (25, 1), (27, 1), (29, 1), (31, 1)), 442608029: ((9, 2),), 447529997: ((22, 2), (28, 2)), 642367021: ((15, 2), (19, 2)), 675765711: ((20, 1), (22, 1), (26, 1), (28, 1), (24, 1), (30, 1)), 847433064: ((13, 0),), ... 以下略
例えば98513984は原子番号16と1,17と1,18と1の計3回記録されています。 これがどの構造を示すかは以下で調べることができます。
env = Chem.FindAtomEnvironmentOfRadiusN(mol,radius=2,rootedAtAtom=16) amap={} submol=Chem.PathToSubmol(mol,env,atomMap=amap)
>>>Chem.MolToSmiles(submol) 'ccccc'