RDKit|摩根分子指紋計(jì)算瓷胧、提取與可視化

目錄

  • 一刑桑、摩根分子指紋計(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

本文參考自rdkit官方文檔绊茧。
代碼及源文件在這里铝宵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市华畏,隨后出現(xiàn)的幾起案子鹏秋,更是在濱河造成了極大的恐慌,老刑警劉巖亡笑,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侣夷,死亡現(xiàn)場離奇詭異,居然都是意外死亡仑乌,警方通過查閱死者的電腦和手機(jī)百拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門琴锭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衙传,你說我怎么就攤上這事决帖。” “怎么了蓖捶?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵地回,是天一觀的道長。 經(jīng)常有香客問我俊鱼,道長刻像,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任亭引,我火速辦了婚禮绎速,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焙蚓。我一直安慰自己,他們只是感情好洒宝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布购公。 她就那樣靜靜地躺著,像睡著了一般雁歌。 火紅的嫁衣襯著肌膚如雪宏浩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天靠瞎,我揣著相機(jī)與錄音比庄,去河邊找鬼。 笑死乏盐,一個(gè)胖子當(dāng)著我的面吹牛佳窑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播父能,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼神凑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了何吝?” 一聲冷哼從身側(cè)響起溉委,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爱榕,沒想到半個(gè)月后瓣喊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔酥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年藻三,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了八匠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趴酣,死狀恐怖梨树,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岖寞,我是刑警寧澤抡四,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站仗谆,受9級(jí)特大地震影響指巡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隶垮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一藻雪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狸吞,春花似錦勉耀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至威始,卻和暖如春枢纠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黎棠。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工晋渺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脓斩。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓木西,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俭厚。 傳聞我的和親對象是個(gè)殘疾皇子户魏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359