RDKit|搜索子結(jié)構(gòu)時(shí)對(duì)側(cè)鏈進(jìn)行條件限制

目錄

  • 一、簡(jiǎn)單子結(jié)構(gòu)搜索
    • 1.初始化
    • 2.獲取所有匹配的結(jié)構(gòu)
    • 3.查看匹配的結(jié)構(gòu)
  • 二、帶條件的子結(jié)構(gòu)搜索
    • 1.定義條件
    • 2.對(duì)側(cè)鏈設(shè)置條件
    • 3.使用條件進(jìn)行篩選
    • 4.其他條件舉例

一、簡(jiǎn)單子結(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個(gè)結(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)
    通過(guò)highlightAtoms傳入匹配的子結(jié)構(gòu)
>>> Draw.MolToImage(m, highlightAtoms=matches[0])
  • 搜索結(jié)果之一


    簡(jiǎn)單搜索

二、帶條件的子結(jié)構(gòu)搜索

2020.03版本以后,rdkit提供了一個(gè)可選功能,用于檢查并篩選出符合條件的子結(jié)構(gòu)。使用的時(shí)候 把這段代碼粘過(guò)去,按流程操作 就好了。條件可以在matchers中定義,符合matchers中指定條件的子結(jié)構(gòu)才會(huì)被返回。

1. 定義條件

  • 假設(shè)要尋找一個(gè)側(cè)鏈都帶芳香性的子結(jié)構(gòu)
    只需要修改matchers字典,向matchers中添加一個(gè)鍵值對(duì),鍵為"all_aromatic",值為判斷每個(gè)原子的芳香性。
>>> 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. 對(duì)側(cè)鏈設(shè)置條件

  • 給原子設(shè)置屬性:SetProp(key, values)
    key:屬性名
    values:屬性值
    注:p中第五個(gè)原子(索引為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. 使用條件進(jìn)行篩選

  • 返回側(cè)鏈都帶有芳香性的子結(jié)構(gòu),同樣要 粘過(guò)去按流程操作
  • 再用GetSubstructMatches()搜索
>>> params = Chem.SubstructMatchParameters()
>>> checker = SidechainChecker(p)
>>> params.setExtraFinalCheck(checker)
>>> matches = m.GetSubstructMatches(p, params)
>>> matches
((5, 6, 11, 17, 18),)
  • 現(xiàn)在只剩一個(gè)結(jié)果了,查看一下,匹配的側(cè)鏈為一個(gè)芳香環(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))

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • SMILES SMILES是簡(jiǎn)化分子線性輸入的方法(Simplified molecular input line...
    愛(ài)折騰的大懶豬閱讀 7,020評(píng)論 0 2
  • 作為一個(gè)很有上進(jìn)心的女人,我也想在這短暫的一生里做成一點(diǎn)事,只為了讓這個(gè)世界因?yàn)槲业拇嬖谧兊酶用篮靡稽c(diǎn)點(diǎn)??吹竭@...
    大美的打字機(jī)閱讀 425評(píng)論 0 0
  • 所謂創(chuàng)業(yè),就是把你的想法拿到市場(chǎng)上去檢驗(yàn)。成功了,會(huì)收獲財(cái)富;失敗了,會(huì)收獲經(jīng)驗(yàn)。不論成功或者失敗,都是一種成長(zhǎng)。...
    冷劍書生閱讀 327評(píng)論 0 1
  • 沉重話題之前,先來(lái)點(diǎn)輕松的內(nèi)容吧。 我記得有一部電影,《南方英雄》。有個(gè)美國(guó)人帶著一只寵物兔子,去了蘇格蘭一個(gè)民風(fēng)...
    Graceland閱讀 9,205評(píng)論 39 4
  • 如果那夜你不牽起我的手 我便不會(huì)心若枯木 死氣沉沉 如果那日你不許我一世諾言 我便不會(huì)化作霰雪鳥(niǎo) 今生唯你相伴 是...
    鐘漠閱讀 227評(píng)論 0 0

友情鏈接更多精彩內(nèi)容