python 化学_rdkit 化学反应分子式高级功能
一、引入所需庫
#! /usr/bin/python
# coding: utf-8
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import Draw
from rdkit.Chem import Recap
from rdkit.Chem import BRICS
二、保護原子
以酰胺反應為例 , 反應物分子1中含有一個 - COOH , 另一個分子中含有兩個 - NH 。 之后定義反應模板 , 然后讓其反應 。
acid = Chem.MolFromSmiles('CC(=O)O')
base = Chem.MolFromSmiles('CC(=O)NCCN')
mols = [acid, base]
img = Draw.MolsToGridImage(
mols,
molsPerRow=2,
subImgSize=(200, 200),
legends=['acid', 'base']
)
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol33.jpg')
反應物如下圖所示:
rxn = AllChem.ReactionFromSmarts('')
rxn = AllChem.ReactionFromRxnFile(
'/Users/zeoy/st/drug_development/st_rdcit/2d.rxn')
ps = rxn.RunReactants(acid, base)
print('the num of reactions', len(ps))
for reaction in ps:
reactions_smi = Chem.MolToSimiles(reaction)
print('this reaction is', reactions_smi)
三、把分子切成片段
3.1 Recap方法
Recap方法通過模擬實驗室中常用的化學反應,將反應分子分解成功合理的片段
Recap 方法返回的是類似于node tree結構的數據。
注:分子片段的Smiles前面通常會加一個* 如 ‘*c1ccccc1’
m = Chem.MolFromSmiles('c1ccccc1OCCOC(=O)CC')
hierarch = Recap.RecapDecompose(m)
type(hierarch)
# 層次結構的原始分子
print('smi=', hierarch.smiles) # smi= CCC(=O)OCCOc1ccccc1
# 每個節點使用smiles鍵控的字典跟蹤其子節點
ks = hierarch.children.keys()
print(sorted(ks))
# ['*C(=O)CC', '*CCOC(=O)CC', '*CCOc1ccccc1', '*OCCOc1ccccc1', '*c1ccccc1']
3.2 BRICS方法
RDKit 還提供了另一種把分子切成片段的方法——BRICS方法。 BRICS方法主要是根據可合成的的鍵對分子進行切斷,因此其返回的數據結構是來自于該分子的不同分子片段, 虛擬原子(*)是告訴我們是如何切斷的。
對下圖中的分子進行BRICS分解
smi = 'C=CC(=O)N1CCC(CC1)C2CCNC3=C(C(=NN23)C4=CC=C(C=C4)OC5=CC=CC=C5)C(=O)N'
m = Chem.MolFromSmiles(smi)
Draw.MolToImageFile(
m,
"/Users/zeoy/st/drug_development/st_rdcit/img/mol34.jpg",
size=(600, 400),
legend='zanubrutinib(C=CC(=O)N1CCC(CC1)C2CCNC3=C(C(=NN23)C4=CC=C(C=C4)OC5=CC=CC=C5)C(=O)N)'
)
frags = (BRICS.BRICSDecompose(m))
print(frags)
mols = []
for fsmi in frags:
mols.append(Chem.MolFromSmiles(fsmi))
img = Draw.MolsToGridImage(
mols,
molsPerRow=3,
subImgSize=(200, 200),
legends=['' for x in mols]
)
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol35.jpg')
四、組合分子片段–BRICS方法
以上述片段進行BRICS組合產生分子
newms = BRICS.BRICSBuild(mols)
newms = list(newms)
print('新分子數:', len(newms)) # 新分子數: 76(含少量化學結構不合理的結構)
mols = [newms[0], newms[1], newms[2]]
img = Draw.MolsToGridImage(
mols,
molsPerRow=3,
subImgSize=(200, 200),
legends=['' for x in mols]
)
可視化前3個結構
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol36.jpg')
五、自定義片段生成方法
除了上面提到的自動片段分解方法,RDKit提供了更靈活的函數可根據用戶定義的鍵進行切斷產生片段。
比如對所有環上的原子和非環上的原子組成的鍵進行進行切斷。
smi = 'C=CC(=O)N1CCC(CC1)C2CCNC3=C(C(=NN23)C4=CC=C(C=C4)OC5=CC=CC=C5)C(=O)N'
m = Chem.MolFromSmiles(smi)
submol = m.GetSubstructMatches(Chem.MolFromSmarts('[!R][R]'))
print(submol) # ((2, 4), (25, 22), (25, 26), (32, 15))
bonds_id = [m.GetBondBetweenAtoms(x, y).GetIdx() for x, y in submol]
frags = Chem.FragmentOnBonds(m, bonds_id)
print('type=', type(frags)) # type=
Draw.MolToImageFile(
m,
"/Users/zeoy/st/drug_development/st_rdcit/img/mol36.jpg",
)
smis = Chem.MolToSmiles(frags)
smis = smis.split('.')
mols = []
for smi in smis:
mols.append(Chem.MolFromSmiles(smi))
img = Draw.MolsToGridImage(
mols,
molsPerRow=3,
subImgSize=(200, 200),
legends=['' for x in mols]
)
img.save("/Users/zeoy/st/drug_development/st_rdcit/img/mol37.jpg")
本文地址:https://blog.csdn.net/qq_36801966/article/details/107053474
如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!
總結
以上是生活随笔為你收集整理的python 化学_rdkit 化学反应分子式高级功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯单片机设计与开发_标准模板
- 下一篇: Android之scheme使用