RDKit|化学反应操作与处理

RDKit在Python中提供了基于SMARTS和rxn文件的化学反应操作功能。通过Chem.ReactionFromSmarts()可以从SMARTS创建反应模式,对反应物进行匹配并合成。rxn文件则用于创建更复杂的反应。在进行反应后,可以通过SanitizeMol()检查产物的正确性,并通过字典去重。本文介绍了具体的操作步骤和示例。
部署运行你感兴趣的模型镜像

化学反应

Rdkit中提供了基于SMARTS的化学反应操作,可以通过SMARTS或rxn反应文件构建反应模式,再对指定的反应物进行匹配,将匹配上的结构按反应模式进行合成。

1.SMARTS创建反应

  • 从SMARTS创建一个反应模式:Chem.ReactionFromSmarts()
    下面这个反应表示一个羧基,与至少带有一个氢的氮原子反应,形成酰胺
  • 定义反应物:reactants
  • 进行一个反应:RunReactants(reactants, maxProducts)
    对反应物依次进行反应,返回结果为一个元组
>>> from rdkit import Chem
>>> from rdkit.Chem import AllChem as Chem
>>> rxn = Chem.ReactionFromSmarts('[C:1](=[O:2])-[OD1].[N!H0:3]>>[C:1](=[O:2])[N:3]')
>>> reactants = (Chem.MolFromSmiles('CC(=O)O'), Chem.MolFromSmiles('NC'))
>>> products = rxn.RunReactants(reactants)
>>> print(len(products))
1
  • 看看反应方程式
>>> Chem.Draw.ReactionToImage(rxn)

1

  • 元组中的每个元素(也是个元组)对应着一个产物。
>>> print(len(products[0]))
1
>>> Chem.Draw.MolToImage(products[0][0])

2

  • 用含两个羧基的化合物与甲胺反应,对应着两种匹配的方式,会产生两个反应结果。
>>> double = Chem.MolFromSmiles('C(COC(=O)O)C(=O)O')
>>> reacts = (double, Chem.MolFromSmiles('NC'))
>>> ps = rxn.RunReactants(reacts)
>>> print(len(ps))
2
>>> Chem.Draw.MolsToGridImage([x[0] for x in ps])

3

2.rxn文件创建反应

  • 通过MDL rxn文件来创建反应
>>> import os
>>> from rdkit.Chem import RDConfig
>>> rxn_file = os.path.join(RDConfig.RDDocsDir, 'Book\data\AmideBond.rxn')
>>> rxn = Chem.ReactionFromRxnFile(rxn_file)
  • 查看反应模版(反应物)数量:GetNumReactantTemplates()
  • 查看产物模版(产物)数量:GetNumProductTemplates()
  • 其他进行反应及查看产物的方法一样
>>> print(rxn.GetNumReactantTemplates())
>>> print(rxn.GetNumProductTemplates())
2
1

3.产物后处理

  • 做个更复杂的反应,例如1,3丁二烯与乙烯加成反应
>>> rxn = Chem.ReactionFromSmarts('[C:1]=[C:2].[C:3]=[*:4][*:5]=[C:6]>>[C:1]1[C:2][C:3][*:4]=[*:5][C:6]1')
>>> ps = rxn.RunReactants((Chem.MolFromSmiles('OC=C'), Chem.MolFromSmiles('C=CC(N)=C')))
>>> len(ps)
4
  • 查看一下产生的所有分子
    反应物在反应模板中可以有多种映射方式,所以产生了多种产物,但有一些是重复的
>>> Chem.Draw.MolsToGridImage([x[0] for x in ps], molsPerRow=4)

在这里插入图片描述

  • 可以通过字典来获得不重复的结构
>>> uniqps = {}
>>> for p in ps:
>>>     smi = Chem.MolToSmiles(p[0])
>>>     uniqps[smi] = p[0]
>>> sorted(uniqps.keys())
['NC1=CCC(O)CC1', 'NC1=CCCC(O)C1']
  • 此外,需要注意的是,通过化学反应产生的分子,是没有经过核对的,可以手动检查一下:SanitizeMol()
>>> rxn = Chem.ReactionFromSmarts('[C:1]=[C:2][C:3]=[C:4].[C:5]=[C:6]>>[C:1]1=[C:2][C:3]=[C:4][C:5]=[C:6]1')
>>> ps = rxn.RunReactants((Chem.MolFromSmiles('C=CC=C'), Chem.MolFromSmiles('C=C')))
>>> Chem.MolToSmiles(ps[0][0])
'C1=CC=CC=C1'

5

>>> Chem.SanitizeMol(ps[0][0])
>>> Chem.MolToSmiles(ps[0][0])
'c1ccccc1'

本文参考自rdkit官方文档
代码及源文件在这里

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值