RDKit|分子基础操作与药效团查找

分子基础操作与药效团查找

文章目录

  • 1.原子操作
  • 2.键操作
  • 3.环操作
  • 4.手动实现氧族药效团查找

1.原子操作

在rdkit中,分子中的每一个原子都是对象,可以通过原子对象的属性和函数来获取各种信息。

  • 对原子进行遍历:m.GetAtoms()
  • 获取原子索引:GetIdx()
  • 获取原子序号:GetAtomicNum()
  • 获取原子符号:GetSymbol()
  • 获取原子连接数(受H是否隐藏影响):GetDegree()
  • 获取原子总连接数(与H是否隐藏无关):GetTotalDegree()
  • 获取原子形式电荷:GetFormalCharge()
  • 获取原子杂化方式:GetHybridization()
  • 获取原子显式化合价:GetExplicitValence()
  • 获取原子隐式化合价:GetImplicitValence()
  • 获取原子总的化合价: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
  • 也可以通过索引获取原子:GetAtomWithIdx()
>>> print(m.GetAtomWithIdx(0).GetSymbol())
C
  • 获取相连的原子:GetNeighbors()
>>> atom = m.GetAtomWithIdx(1)
>>> [x.GetAtomicNum() for x in atom.GetNeighbors()]
[6, 6]

2.键操作

同样,每一个键也都是对象,可以通过属性和函数来获取键的信息。

  • 对键进行遍历:m.GetBonds()
  • 获取键的索引:GetIdx()
  • 获取键的类型:GetGetBondType()
  • 以数字形式显示键的类型:GetBondTypeAsDouble()
  • 是否为芳香键:GetIsAromatic()
  • 是否为共轭键:GetIsConjugated()
  • 是否在环中:IsInRing()
  • 是否在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
  • 也可以通过索引获取键:GetBondWithIdx()
>>> print(m.GetBondWithIdx(0).GetBondType())
DOUBLE

3.环操作

  • 查看原子的环信息
>>> 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()函数只能判断是否在最小的环中
>>> print(m.GetAtomWithIdx(2).IsInRingSize(3))
True
>>> print(m.GetAtomWithIdx(2).IsInRingSize(5))
False
  • 可以查看所有最小环(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]
  • 直接获取环的信息:GetRingInfo()
  • 查看一共有几个环:NumRings()
  • 查看原子在几个环中:NumAtomRings()
  • 查看id为n的原子是否在n1元环中.IsAtomInRingOfSize(n, n1)
  • 查看id为n的键是否在n1元环中.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.手动实现氧族药效团查找

这里只做一个简单的演示,通过原子属性查找目标药效团,更复杂的操作类似。

  • 假设要查找的氧族氢供体标准:氧或硫原子,不带电荷,含有1个氢。
  • 氧族氢受体标准(部分):不带氢原子,化合价为2,且不与氮原子相连。
>>> def pharmacophore(m):
>>>     atomPharma = {}
>>>     # 定义氧族原子
>>>     chalcogen = [8, 16]
>>>     mol = Chem.MolFromSmiles(m)
>>>     mol = Chem.AddHs(mol)
>>>     # 开始查找
>>>     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']}

更简单的操作,直接写成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官方文档
代码及源文件在这里

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342