RDKit|分子基礎(chǔ)操作與藥效團(tuán)查找

分子基礎(chǔ)操作與藥效團(tuán)查找

文章目錄

  • 1.原子操作
  • 2.鍵操作
  • 3.環(huán)操作
  • 4.手動(dòng)實(shí)現(xiàn)氧族藥效團(tuán)查找

1.原子操作

在rdkit中,分子中的每一個(gè)原子都是對(duì)象措伐,可以通過(guò)原子對(duì)象的屬性和函數(shù)來(lái)獲取各種信息。

  • 對(duì)原子進(jìn)行遍歷:m.GetAtoms()
  • 獲取原子索引:GetIdx()
  • 獲取原子序號(hào):GetAtomicNum()
  • 獲取原子符號(hào):GetSymbol()
  • 獲取原子連接數(shù)(受H是否隱藏影響):GetDegree()
  • 獲取原子總連接數(shù)(與H是否隱藏?zé)o關(guān)):GetTotalDegree()
  • 獲取原子形式電荷:GetFormalCharge()
  • 獲取原子雜化方式:GetHybridization()
  • 獲取原子顯式化合價(jià):GetExplicitValence()
  • 獲取原子隱式化合價(jià):GetImplicitValence()
  • 獲取原子總的化合價(jià):GetTotalValence()
  • ...
>>> from rdkit import Chem
>>> m = Chem.MolFromSmiles('C1OC1')
>>> print('\t'.join(['id', 'num', 'symbol', 'degree', 'charge', 'hybrid']))
>>> for atom in m.GetAtoms():
>>>     print(atom.GetIdx(), end='\t')
>>>     print(atom.GetAtomicNum(), end='\t')
>>>     print(atom.GetSymbol(), end='\t')
>>>     print(atom.GetDegree(), end='\t')
>>>     print(atom.GetFormalCharge(), end='\t')
>>>     print(atom.GetHybridization())
id  num symbol  degree  charge  hybrid
0   6   C       2       0       SP3
1   8   O       2       0       SP3
2   6   C       2       0       SP3
  • 也可以通過(guò)索引獲取原子:GetAtomWithIdx()
>>> print(m.GetAtomWithIdx(0).GetSymbol())
C
  • 獲取相連的原子:GetNeighbors()
>>> atom = m.GetAtomWithIdx(1)
>>> [x.GetAtomicNum() for x in atom.GetNeighbors()]
[6, 6]

2.鍵操作

同樣尾序,每一個(gè)鍵也都是對(duì)象挠轴,可以通過(guò)屬性和函數(shù)來(lái)獲取鍵的信息。

  • 對(duì)鍵進(jìn)行遍歷:m.GetBonds()
  • 獲取鍵的索引:GetIdx()
  • 獲取鍵的類(lèi)型:GetGetBondType()
  • 以數(shù)字形式顯示鍵的類(lèi)型:GetBondTypeAsDouble()
  • 是否為芳香鍵:GetIsAromatic()
  • 是否為共軛鍵:GetIsConjugated()
  • 是否在環(huán)中:IsInRing()
  • 是否在n元環(huán)中:IsInRingSize(n)
  • 獲取起始原子:GetBeginAtom()
  • 獲取末尾原子:GetEndAtom()
  • ...
>>> m = Chem.MolFromSmiles('C=C-C=C')
>>> print('\t'.join(['id', 'type', 'double', 'aromic', 'conjug', 'ring', 'begin', 'end']))
>>> for bond in m.GetBonds():
>>>     print(bond.GetIdx(), end='\t')
>>>     print(bond.GetBondType(), end='\t')
>>>     print(bond.GetBondTypeAsDouble(), end='\t')
>>>     print(bond.GetIsAromatic(), end='\t')
>>>     print(bond.GetIsConjugated(), end='\t')
>>>     print(bond.IsInRing(), end='\t')
>>>     print(bond.GetBeginAtomIdx(), end='\t')
>>>     print(bond.GetEndAtomIdx())
id  type    double  aromic  conjug  ring    begin   end
0   DOUBLE  2.0     False   True    False   0       1
1   SINGLE  1.0     False   True    False   1       2
2   DOUBLE  2.0     False   True    False   2       3
  • 也可以通過(guò)索引獲取鍵:GetBondWithIdx()
>>> print(m.GetBondWithIdx(0).GetBondType())
DOUBLE

3.環(huán)操作

  • 查看原子的環(huán)信息
>>> m = Chem.MolFromSmiles('OC1C2C1CC2')
>>> print(m.GetAtomWithIdx(0).IsInRing())
False
>>> print(m.GetAtomWithIdx(2).IsInRing())
True
>>> print(m.GetAtomWithIdx(2).IsInRingSize(3))
True
>>> m
atom_bond_ring_1.png
  • 但是要注意翩肌,IsInRingSize()函數(shù)只能判斷是否在最小的環(huán)中
>>> print(m.GetAtomWithIdx(2).IsInRingSize(3))
True
>>> print(m.GetAtomWithIdx(2).IsInRingSize(5))
False
  • 可以查看所有最小環(huán)(smallest set of smallest rings, SSSR)的信息:GetSymmSSSR()
>>> ssr = Chem.GetSymmSSSR(m)
>>> print(len(ssr))
>>> print(list(ssr[0]))
>>> print(list(ssr[1]))
2
[1, 2, 3]
[4, 5, 2, 3]
  • 直接獲取環(huán)的信息:GetRingInfo()
  • 查看一共有幾個(gè)環(huán):NumRings()
  • 查看原子在幾個(gè)環(huán)中:NumAtomRings()
  • 查看id為n的原子是否在n1元環(huán)中.IsAtomInRingOfSize(n, n1)
  • 查看id為n的鍵是否在n1元環(huán)中.IsAtomInRingOfSize(n , n1)
>>> ri = m.GetRingInfo()
>>> print(ri.NumRings())
2
>>> print(ri.NumAtomRings(6))
0
>>> print(ri.IsAtomInRingOfSize(1,3))
True
>>> print(ri.IsBondInRingOfSize(1,3))
True

4.手動(dòng)實(shí)現(xiàn)氧族藥效團(tuán)查找

這里只做一個(gè)簡(jiǎn)單的演示模暗,通過(guò)原子屬性查找目標(biāo)藥效團(tuán),更復(fù)雜的操作類(lèi)似念祭。

  • 假設(shè)要查找的氧族氫供體標(biāo)準(zhǔn):氧或硫原子兑宇,不帶電荷,含有1個(gè)氫粱坤。
  • 氧族氫受體標(biāo)準(zhǔn)(部分):不帶氫原子隶糕,化合價(jià)為2瓷产,且不與氮原子相連。
>>> def pharmacophore(m):
>>>     atomPharma = {}
>>>     # 定義氧族原子
>>>     chalcogen = [8, 16]
>>>     mol = Chem.MolFromSmiles(m)
>>>     mol = Chem.AddHs(mol)
>>>     # 開(kāi)始查找
>>>     for atom in mol.GetAtoms():
>>>         p = []
>>>         if atom.GetAtomicNum() == 1 or atom.GetAtomicNum() not in chalcogen:
>>>             continue
>>>         else:
>>>             # 氫供體
>>>             if atom.GetFormalCharge() == 0:
>>>                 nbrs = [x for x in atom.GetNeighbors()]
>>>                 HDflag = False
>>>                 for nbr in nbrs:
>>>                     if nbr.GetAtomicNum() == 1:
>>>                         HDflag = True
>>>                 if HDflag:
>>>                     p.append('HDonor')
>>>             # 氫受體
>>>             if atom.GetTotalValence() == 2:
>>>                 nbrs = [x for x in atom.GetNeighbors()]
>>>                 HAflag_1 = True
>>>                 HAflag_2 = True
>>>                 if len(nbrs) == 1:
>>>                     nbr = nbrs[0]
>>>                     if nbr.GetAtomicNum() == 7:
>>>                         HAflag_1 = False
>>>                 else:
>>>                     for nbr in nbrs:
>>>                         if nbr.GetAtomicNum() == 1:
>>>                             HAflag_2 = False
>>>                 if HAflag_1 and HAflag_2:
>>>                     p.append('HAcceptor')
>>>         atomPharma[atom.GetIdx()] = [atom.GetAtomicNum(), ' '.join(p)]
>>>     return atomPharma
>>> 
>>> m = 'COC(=O)O'
>>> res = pharmacophore(m)
>>> res
{1: [8, 'HAcceptor'], 3: [8, 'HAcceptor'], 4: [8, 'HDonor']}

更簡(jiǎn)單的操作枚驻,直接寫(xiě)成SMARTS查找就可以了

  • 氫供體:[O,S;H1;+0]
  • 氫受體(部分):[O;H0;v2;!$(O=N-*)]
>>> def pharmacophore_smarts(m):
>>>     # 定義smarts
>>>     HDonorSmarts = '[O,S;H1;+0]'
>>>     HAcceptorSmarts = '[O;H0;v2;!$(O=N-*)]'
>>>     HDonor = Chem.MolFromSmarts(HDonorSmarts)
>>>     HAcceptor = Chem.MolFromSmarts(HAcceptorSmarts)
>>>     atomPharma = {}
>>>     mol = Chem.MolFromSmiles(m)
>>>     # 氫供體
>>>     HDonors = mol.GetSubstructMatches(HDonor)
>>>     for i in HDonors:
>>>         atom = mol.GetAtomWithIdx(i[0])
>>>         atomPharma[atom.GetIdx()] = [atom.GetAtomicNum(), 'HDonor']
>>>     # 氫受體
>>>     HAcceptors = mol.GetSubstructMatches(HAcceptor)
>>>     for i in HAcceptors:
>>>         atom = mol.GetAtomWithIdx(i[0])
>>>         atom_prop = atomPharma.get(atom.GetIdx(), [])
>>>         if atom_prop:
>>>             atom_prop[1] = atom_prop[1] + ' HAcceptor'
>>>             atomPharma.update({atom.GetIdx():atom_prop})
>>>         else:
>>>             atomPharma[atom.GetIdx()] = [atom.GetAtomicNum(), 'HAcceptor']
>>>     return atomPharma
>>> 
>>> res = pharmacophore_smarts(m)
>>> res
{4: [8, 'HDonor'], 1: [8, 'HAcceptor'], 3: [8, 'HAcceptor']}

本文參考自rdkit官方文檔濒旦。
代碼及源文件在這里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末再登,一起剝皮案震驚了整個(gè)濱河市尔邓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锉矢,老刑警劉巖梯嗽,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沽损,居然都是意外死亡灯节,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)绵估,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炎疆,“玉大人,你說(shuō)我怎么就攤上這事国裳⌒稳耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵躏救,是天一觀的道長(zhǎng)唯笙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)盒使,這世上最難降的妖魔是什么崩掘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮少办,結(jié)果婚禮上苞慢,老公的妹妹穿的比我還像新娘。我一直安慰自己英妓,他們只是感情好挽放,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蔓纠,像睡著了一般辑畦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腿倚,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天纯出,我揣著相機(jī)與錄音,去河邊找鬼。 笑死暂筝,一個(gè)胖子當(dāng)著我的面吹牛箩言,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焕襟,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼组力,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竭沫!你這毒婦竟也來(lái)了蔗怠?” 一聲冷哼從身側(cè)響起够话,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滨砍,失蹤者是張志新(化名)和其女友劉穎杯瞻,沒(méi)想到半個(gè)月后柑爸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體让腹,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肾砂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年列赎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐确。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡包吝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出源葫,到底是詐尸還是另有隱情诗越,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布息堂,位于F島的核電站嚷狞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荣堰。R本人自食惡果不足惜床未,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望振坚。 院中可真熱鬧薇搁,春花似錦、人聲如沸渡八。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屎鳍。三九已至宏娄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逮壁,已是汗流浹背孵坚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人十饥。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓窟勃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逗堵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秉氧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345