どこから見てもメンダコ

軟体動物門頭足綱八腕類メンダコ科

RDkitで分子フィンガープリントの生成

RDkitで各種の分子フィンガープリントの生成を行います。

マルチSDF読み込み

delaney水溶解度データセットから作成したマルチSDFを読み込みます。

horomary.hatenablog.com

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'