rdkit 子結構搜索

一、引入所需庫

#! /usr/bin/python
# coding: utf-8
# rdkit 子結構搜索

from rdkit import Chem

二、子結構搜索

子結構搜索可以通過SMARTS匹配符完成。

2.1 判斷是否有子結構

首先創建分子對象,然後定義匹配模式,最後判斷是否有子結構。
匹配模式:支持Chem.MolFromSmarts() 和 Chem.MolFromSmiles() 兩種形式。 Smarts的表現形式更加豐富。

mol = Chem.MolFromSmiles('c1ccccc1OC')
patt = Chem.MolFromSmarts('OC')
flag = mol.HasSubstructMatch(patt)
if flag:
    print('分子中包含基團 -OCH3')
else:
    print('分子中不包含基團 -OCH3')    
# 分子中包含基團 -OCH3

2.2 獲取第一個子結構對應的原子編號

m = Chem.MolFromSmiles('c1ccccc1OC')
patt = Chem.MolFromSmarts('OC')
flag = m.HasSubstructMatch(patt)
if flag:
    atomids = m.GetSubstructMatch(patt)
    print("匹配到的原子id:",atomids)
else:
    print("分子中不包含基團 -OCH3")
# 匹配到的原子id: (6, 7)

根據輸出結果可知,6號原子對應的是甲氧基原子的O原子,7號原子對應的是甲氧基原子的C原子

2.3 獲取對應所有子結構

m = Chem.MolFromSmiles('c1ccc(OC)cc1OC')
patt = Chem.MolFromSmarts('OC')
flag = m.HasSubstructMatch(patt)
if flag:
    atomids = m.GetSubstructMatches(patt)
    print("匹配到的原子id:",atomids)
else:
    print('分子中不包含基團 -OCH3')

# 匹配到的原子id: ((4, 5), (8, 9))

2.4 子結構搜索考慮手性

不考慮手性的時候,有手性的分子可以匹配無手性的模式和錯誤手性的模式

考慮手性的時候,有手性信息的分子可以匹配無手性的模式
無手性信息的分子不能匹配有手性的模式。

2.4.1 不考慮手性

m = Chem.MolFromSmiles('CC[C@H](F)Cl')
print(m.HasSubstructMatch(Chem.MolFromSmiles('C[C@H](F)Cl')))
print(m.HasSubstructMatch(Chem.MolFromSmiles('C[C@@H](F)Cl')))
print(m.HasSubstructMatch(Chem.MolFromSmiles('CC(F)Cl')))
# True
# True
# True

2.4.2 考慮手性

m = Chem.MolFromSmiles('CC[C@H](F)Cl')
print(m.HasSubstructMatch(Chem.MolFromSmiles('C[C@H](F)Cl'), useChirality=True))
print(m.HasSubstructMatch(Chem.MolFromSmiles('C[C@@H](F)Cl'), useChirality=True))
print(m.HasSubstructMatch(Chem.MolFromSmiles('CC(F)Cl'), useChirality=True))
# True
# False
# True

三、smarts

smarts在子結構匹配、化學反應等方面發揮着重要的作用

  1. C c 大寫小寫C是不一樣的,大寫代表脂肪碳;小寫代表芳香碳
  2. 冒號後面的數字爲atom map id
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章