目錄
- 一刑桑、摩根分子指紋計(jì)算
- 1.簡介
- 2.SparseIntVects
- 3.ExplicitBitVects4
- 4.FCFPs
- 5.更多泛化
- 二蝇刀、摩根分子指紋提取
- 1.提取方法一
- 2.提取方法二
- 三、指紋可視化
一直焙、摩根分子指紋計(jì)算
1.簡介
摩根分子指紋(Morgan Fingerprints)景东,是一種圓形指紋,也屬于拓?fù)湫椭讣y奔誓,是通過對標(biāo)準(zhǔn)的摩根算法進(jìn)行改造后得到斤吐。可以大致等同于擴(kuò)展連通性指紋(Extended-Connectivity Fingerprints,ECFPs)和措。
這類指紋有諸多優(yōu)點(diǎn)庄呈,例如計(jì)算速度快、沒有經(jīng)過預(yù)定義(可以表示無窮多種不同的分子特征)臼婆、可以包含手性信息抒痒、指紋中的每個(gè)元素代表一種特定子結(jié)構(gòu)幌绍、可以方便地進(jìn)行分析和解釋颁褂、可以根據(jù)不同的需要進(jìn)行相應(yīng)的修改等。這類指紋設(shè)計(jì)的最初目的是用于搜索與活性相關(guān)的分子特征傀广,而非子結(jié)構(gòu)搜索颁独。此外也可以用于相似性搜索、聚類伪冰、虛擬篩選等方向誓酒。指紋的生成過程大致分為以下幾個(gè)步驟:
- 1.原子初始化。為每個(gè)重原子分配一個(gè)整數(shù)標(biāo)識(shí)符
- 2.迭代更新贮聂。以每個(gè)重原子為中心靠柑,將周圍一圈的重原子合并進(jìn)來,直到到達(dá)指定半徑吓懈。
- 3.特征生成歼冰。對子結(jié)構(gòu)進(jìn)行運(yùn)算,并生成特征列表耻警。
更多內(nèi)容可以參考ChemAxon的介紹隔嫡,還有ECFPs的文章。
ECFPs可以捕捉到精確的子結(jié)構(gòu)細(xì)節(jié)甘穿,相對應(yīng)的腮恩,功能基指紋(Functional class fingerprints,F(xiàn)CFPs)則更為泛化温兼,可以將同一類功能基作為一種特征結(jié)構(gòu)秸滴。在rdkit中兩種特征都可以通過GetMorganFingerprint實(shí)現(xiàn)。
- 先定義兩個(gè)分子
>>> from rdkit import Chem
>>> from rdkit import DataStructs
>>> from rdkit.Chem import AllChem
>>> from rdkit.Chem import Draw
>>> m1 = Chem.MolFromSmiles('ClC1=COCNC1')
>>> m2 = Chem.MolFromSmiles('BrC1=COCNC1')
>>> Draw.MolsToGridImage([m1, m2], subImgSize=(150, 150), legends=['ClC1CNCOC1', 'BrC1CNCOC1'])
輸入兩個(gè)分子
- 以SparseIntVects方式生成ECFPs指紋:GetMorganFingerprint(mol, radius, ...)
或者稱為SparseBitVects
mol:mol對象
radius:考慮半徑 - 使用Dice方法比較兩個(gè)指紋的相似性:DiceSimilarity()
>>> fp1 = AllChem.GetMorganFingerprint(m1, 2)
>>> fp2 = AllChem.GetMorganFingerprint(m2, 2)
>>> DataStructs.DiceSimilarity(fp1, fp2)
0.7
- 查看長度:GetLength()
返回指紋的長度 - 查看非空元素:GetNonzeroElements()
返回值是一個(gè)字典募判,鍵對應(yīng)非空指紋的位數(shù)荡含,值是指紋出現(xiàn)的頻數(shù)
>>> print(fp1.GetLength())
4294967295
>>> print(fp1.GetNonzeroElements())
{39328034: 1, 211414882: 1, 362715007: 1, 2626911012: 1, 2968968094: 2, ...}
3.ExplicitBitVects
- 以ExplicitBitVects方式生成ECFPs指紋:GetMorganFingerprintAsBitVect(mol, radius, nBits, ...)
radius:考慮半徑
nBits:長度
>>> fp1 = AllChem.GetMorganFingerprintAsBitVect(m1, 2, nBits=1024)
>>> fp2 = AllChem.GetMorganFingerprintAsBitVect(m2, 2, nBits=1024)
>>> DataStructs.DiceSimilarity(fp1, fp2)
0.6842105263157895
4.FCFPs
- 通過設(shè)置useFeatures=True生成FCFPs
可以看到ffp1和ffp2完全一致,即Cl和Br在特征上被歸為一類
>>> ffp1 = AllChem.GetMorganFingerprintAsBitVect(m1, 2, nBits=10, useFeatures=True)
>>> ffp2 = AllChem.GetMorganFingerprintAsBitVect(m2, 2, nBits=10, useFeatures=True)
>>> DataStructs.DiceSimilarity(ffp1, ffp2)
1.0
- 查看向量長度:GetNumBits()
- 將指紋轉(zhuǎn)成字符串:ToBitString()
>>> print(ffp1.GetNumBits())
10
>>> print(ffp1.ToBitString())
1111101111
5.更多泛化
- 通過設(shè)置invariants兰伤,忽略原子類型内颗,關(guān)注分子骨架
先來初始化三個(gè)分子
>>> m2 = Chem.MolFromSmiles('BrC1=CCCCC1')
>>> m3 = Chem.MolFromSmiles('BrC1CCCCC1')
>>> Draw.MolsToGridImage([m1, m2, m3], subImgSize=(200, 150))
泛化介紹
>>> fp1 = AllChem.GetMorganFingerprint(m1, 2, invariants=[1]*m1.GetNumAtoms())
>>> fp2 = AllChem.GetMorganFingerprint(m2, 2, invariants=[1]*m2.GetNumAtoms())
>>> fp3 = AllChem.GetMorganFingerprint(m3, 2, invariants=[1]*m3.GetNumAtoms())
>>> fp1 == fp2
True
- 比較fp1和fp2,可以看到指紋忽略了N敦腔、O均澳、C等差異,即fp1和fp2指紋一致,但這個(gè)時(shí)候還會(huì)考慮鍵的信息找前。例如比較fp1和fp3糟袁,它們是不相等的。
>>> fp1 == fp3
False
- 通過設(shè)置useBondTypes躺盛,忽略鍵的類型
>>> fp1 = AllChem.GetMorganFingerprint(m1, 2, invariants=[1]*m1.GetNumAtoms(), useBondTypes=False)
>>> fp3 = AllChem.GetMorganFingerprint(m1, 2, invariants=[1]*m3.GetNumAtoms(), useBondTypes=False)
>>> fp1 == fp3
True
二项戴、摩根分子指紋提取
- 在生成分子指紋過程中,通過向參數(shù)bitInfo傳入字典槽惫,可以獲取所有非空指紋信息
字典info鍵表示位的索引周叮,值為原子索引、半徑構(gòu)成的元組界斜,出現(xiàn)多個(gè)元組時(shí)仿耽,表示子結(jié)構(gòu)出現(xiàn)了多次
鍵為2968968094的值中含有多個(gè)元組,表示原子索引為4,6各薇,半徑為0的子結(jié)構(gòu)相同项贺,都記錄在這一位上
>>> info = {}
>>> fp_explain = AllChem.GetMorganFingerprint(m1, 2, bitInfo=info)
>>> info
{39328034: ((1, 1),),
211414882: ((5, 2),),
362715007: ((6, 1),),
397705891: ((4, 1),),
718785834: ((1, 2),),
1016841875: ((0, 0),),
1078999752: ((3, 1),),
1289643292: ((5, 1),),
2132511834: ((5, 0),),
2626911012: ((4, 2),),
2968968094: ((4, 0), (6, 0)),
...}
1.提取方法一
- 以提取出211414882的結(jié)構(gòu)為例,首先提取m1中峭判,半徑為2开缎,第5個(gè)原子的結(jié)構(gòu)
submol接收提取出的子結(jié)構(gòu)
amap用于接收原子索引的映射關(guān)系,鍵為原始分子中的原子索引林螃,值為子結(jié)構(gòu)中的原子索引
env是被提取出的鍵的索引
>>> amap = {}
>>> env = Chem.FindAtomEnvironmentOfRadiusN(m1, 2, 5)
>>> submol=Chem.PathToSubmol(m1, env, atomMap=amap)
>>> print(amap)
{1: 4, 3: 0, 4: 1, 5: 2, 6: 3}
>>> print(list(env))
[4, 5, 3, 6]
- 用SMILES表示該子結(jié)構(gòu)
>>> Chem.MolToSmiles(submol)
'CCNCO'
- 以第5個(gè)原子為中心奕删,用SMILES表示該子結(jié)構(gòu),可以看出是氮原子
>>> Chem.MolToSmiles(submol, rootedAtAtom=amap[5], canonical=False)
'N(CO)CC'
2.提取方法二
- 遍歷env中的所有鍵治宣,獲取鍵連接的所有原子急侥,保存在atoms中
通過給定分子,及要提取的原子信息侮邀、鍵信息坏怪,獲取子結(jié)構(gòu)
>>> atoms=set()
>>> for bidx in env:
>>> atoms.add(m1.GetBondWithIdx(bidx).GetBeginAtomIdx())
>>> atoms.add(m1.GetBondWithIdx(bidx).GetEndAtomIdx())
>>> Chem.MolFragmentToSmiles(m1, atomsToUse=list(atoms), bondsToUse=env, rootedAtAtom=5)
'N(CC)CO'
三、指紋可視化
查看211414882代表的子結(jié)構(gòu)
- 繪制子結(jié)構(gòu):DrawMorganBit(mol, bitId, bitInfo, ...)
mol:mol對象
bitId:要查看的bit id
bitInfo:指紋信息
>>> Draw.DrawMorganBit(m1, 211414882, info)
morgan指紋
- 在ECFPs中的顏色的含義:
藍(lán)色:表示中心原子
黃色:表示帶有芳香性質(zhì)的原子
灰色:表示在脂肪環(huán)中的原子
>>> mol = Chem.MolFromSmiles('c1ccccc1CC1CC1')
>>> bi = {}
>>> fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, bitInfo=bi)
>>> Draw.DrawMorganBit(mol, 872, bi)
morgan指紋2