目錄
- 一吆玖、簡單子結(jié)構(gòu)搜索
- 1.初始化
- 2.獲取所有匹配的結(jié)構(gòu)
- 3.查看匹配的結(jié)構(gòu)
- 二桨醋、帶條件的子結(jié)構(gòu)搜索
- 1.定義條件
- 2.對側(cè)鏈設(shè)置條件
- 3.使用條件進行篩選
- 4.其他條件舉例
一袜硫、簡單子結(jié)構(gòu)搜索
1. 初始化
- m表示待搜索的原始分子
- p表示帶側(cè)鏈的四元環(huán)結(jié)構(gòu)
>>> from rdkit import Chem
>>> from rdkit.Chem import Draw
>>> m = Chem.MolFromSmiles('C2NCC2CC1C(CCCC)C(OCCCC)C1c2ccccc2')
>>> p = Chem.MolFromSmarts('C1CCC1*')
2. 獲取所有匹配的結(jié)構(gòu)
- 獲取所有子結(jié)構(gòu):GetSubstructMatches()
返回值是原分子中與子結(jié)構(gòu)匹配的原子索引箭阶。本例中一共返回4個結(jié)果
>>> 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. 查看匹配的結(jié)構(gòu)
- 直接展示圖片:MolToImage(m, highlightAtoms)
通過highlightAtoms傳入匹配的子結(jié)構(gòu)
>>> Draw.MolToImage(m, highlightAtoms=matches[0])
-
搜索結(jié)果之一
簡單搜索
二挤安、帶條件的子結(jié)構(gòu)搜索
2020.03版本以后谚殊,rdkit提供了一個可選功能,用于檢查并篩選出符合條件的子結(jié)構(gòu)蛤铜。使用的時候 把這段代碼粘過去嫩絮,按流程操作 就好了。條件可以在matchers中定義围肥,符合matchers中指定條件的子結(jié)構(gòu)才會被返回剿干。
1. 定義條件
- 假設(shè)要尋找一個側(cè)鏈都帶芳香性的子結(jié)構(gòu)
只需要修改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. 對側(cè)鏈設(shè)置條件
- 給原子設(shè)置屬性:SetProp(key, values)
key:屬性名
values:屬性值
注:p中第五個原子(索引為4)蛹批,即"*"撰洗,表示與p連接的側(cè)鏈篮愉。 - 這里需要側(cè)鏈帶有芳香性的子結(jié)構(gòu)
>>> atom = p.GetAtomWithIdx(4)
>>> atom.SetProp("queryType", "all_aromatic")
- 查看所有屬性:GetPropNames()
- 查看屬性值:GetProp(key)
>>> print(list(atom.GetPropNames()))
>>> atom.GetProp('queryType')
['queryType']
'all_aromatic'
3. 使用條件進行篩選
- 返回側(cè)鏈都帶有芳香性的子結(jié)構(gòu),同樣要 粘過去按流程操作
- 再用GetSubstructMatches()搜索
>>> params = Chem.SubstructMatchParameters()
>>> checker = SidechainChecker(p)
>>> params.setExtraFinalCheck(checker)
>>> matches = m.GetSubstructMatches(p, params)
>>> matches
((5, 6, 11, 17, 18),)
- 現(xiàn)在只剩一個結(jié)果了差导,查看一下试躏,匹配的側(cè)鏈為一個芳香環(huán)
>>> Draw.MolToImage(m, highlightAtoms=matches[0])
帶條件的搜索
4. 其他條件舉例
- 返回側(cè)鏈只含有碳的子結(jié)構(gòu),重新設(shè)置屬性: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))