目录
- 一、简单子结构搜索
- 1.初始化
- 2.获取所有匹配的结构
- 3.查看匹配的结构
- 二、带条件的子结构搜索
- 1.定义条件
- 2.对侧链设置条件
- 3.使用条件进行筛选
- 4.其他条件举例
一、简单子结构搜索
1. 初始化
- m表示待搜索的原始分子
- p表示带侧链的四元环结构
>>> from rdkit import Chem
>>> from rdkit.Chem import Draw
>>> m = Chem.MolFromSmiles('C2NCC2CC1C(CCCC)C(OCCCC)C1c2ccccc2')
>>> p = Chem.MolFromSmarts('C1CCC1*')
2. 获取所有匹配的结构
- 获取所有子结构:GetSubstructMatches()
返回值是原分子中与子结构匹配的原子索引。本例中一共返回4个结果
>>> matches = m.GetSubstructMatches(p)
>>> matches
((5, 6, 11, 17, 18), (5, 17, 11, 6, 7), (6, 5, 17, 11, 12), (6, 11, 17, 5, 4))
3. 查看匹配的结构
- 直接展示图片:MolToImage(m, highlightAtoms)
通过highlightAtoms传入匹配的子结构
>>> Draw.MolToImage(m, highlightAtoms=matches[0])
-
搜索结果之一
简单搜索
二、带条件的子结构搜索
2020.03版本以后,rdkit提供了一个可选功能,用于检查并筛选出符合条件的子结构。使用的时候 把这段代码粘过去,按流程操作 就好了。条件可以在matchers中定义,符合matchers中指定条件的子结构才会被返回。
1. 定义条件
- 假设要寻找一个侧链都带芳香性的子结构
只需要修改matchers字典,向matchers中添加一个键值对,键为"all_aromatic",值为判断每个原子的芳香性。
>>> class SidechainChecker(object):
>>> # 在这里添加条件
>>> matchers = {'all_carbon':lambda at: at.GetAtomicNum() == 6,
>>> 'all_aromatic':lambda at: at.GetIsAromatic()}
>>>
>>> def __init__(self, query, pName='queryType'):
>>> # atom: [(idx, prop), ()]
>>> self._atsToExamin = [(x.GetIdx(), x.GetProp(pName)) for x in query.GetAtoms() if x.HasProp(pName)]
>>> self._pName = pName
>>>
>>> def __call__(self, mol, vect):
>>> seen = [0] * mol.GetNumAtoms()
>>> for idx in vect:
>>> seen[idx] = 1
>>> for idx, qtyp in self._atsToExamin:
>>> midx = vect[idx]
>>> stack = [midx]
>>> atom = mol.GetAtomWithIdx(midx)
>>> stack = [atom]
>>> while stack:
>>> atom = stack.pop(0)
>>> if not self.matchers[qtyp](atom):
>>> return False
>>> seen[atom.GetIdx()] = 1
>>> for nbr in atom.GetNeighbors():
>>> if not seen[nbr.GetIdx()]:
>>> stack.append(nbr)
>>> return True
2. 对侧链设置条件
- 给原子设置属性:SetProp(key, values)
key:属性名
values:属性值
注:p中第五个原子(索引为4),即"*",表示与p连接的侧链。 - 这里需要侧链带有芳香性的子结构
>>> atom = p.GetAtomWithIdx(4)
>>> atom.SetProp("queryType", "all_aromatic")
- 查看所有属性:GetPropNames()
- 查看属性值:GetProp(key)
>>> print(list(atom.GetPropNames()))
>>> atom.GetProp('queryType')
['queryType']
'all_aromatic'
3. 使用条件进行筛选
- 返回侧链都带有芳香性的子结构,同样要 粘过去按流程操作
- 再用GetSubstructMatches()搜索
>>> params = Chem.SubstructMatchParameters()
>>> checker = SidechainChecker(p)
>>> params.setExtraFinalCheck(checker)
>>> matches = m.GetSubstructMatches(p, params)
>>> matches
((5, 6, 11, 17, 18),)
- 现在只剩一个结果了,查看一下,匹配的侧链为一个芳香环
>>> Draw.MolToImage(m, highlightAtoms=matches[0])
带条件的搜索
4. 其他条件举例
- 返回侧链只含有碳的子结构,重新设置属性:SetProp("queryType", "all_carbon")
注:all_carbon需要提前在matchers中定义好
>>> atom = p.GetAtomWithIdx(4)
>>> atom.SetProp("queryType", "all_carbon")
>>> params = Chem.SubstructMatchParameters()
>>> checker = SidechainChecker(p)
>>> params.setExtraFinalCheck(checker)
>>> matches = m.GetSubstructMatches(p, params)
>>> matches
((5, 6, 11, 17, 18), (5, 17, 11, 6, 7))
网友评论