RDKit|最大公共子结构搜索与参数介绍

本文介绍了RDKit库在Python中查找多个分子的最大公共子结构(MCS)的功能,及其应用场景如骨架搜索、分子库分析。讨论了搜索方法FindMCS,以及bondCompare、atomCompare、maximizeBonds、matchValences、ringMatchesRingOnly、completeRingsOnly和timeout等关键参数的用法,这些参数可以进行精确或模糊匹配,并控制环的匹配方式和搜索超时时间。
部署运行你感兴趣的模型镜像

最大公共子结构

rdkit中提供了在多个分子间查找最大公共子结构(Maximum Common Substructure, MCS)的功能。该功能可以应用在相同骨架搜索、分子库分析、寻找药效团等场景中。

1.搜索方法

  • FindMCS(mols)
    mols:待搜索的分子集
    在多个结构中寻找最大公共子结构。该函数返回一个MCSResult实例,实例含有以下属性:
  • 搜索到结构的mol对象:MCSResult.queryMol
  • 搜索到结构的原子数:MCSResult.numAtoms
  • 搜索到结构的键数量:MCSResult.numBonds
  • 搜索到结构的smarts:MCSResult.smartsString
  • 搜索是否超时:MCSResult.canceled

如果没有找到MCS,原子和键会记录为0,SMARTS为空。

>>> from rdkit import Chem
>>> from rdkit.Chem import Draw
>>> from rdkit.Chem import rdFMCS
>>> mol1 = Chem.MolFromSmiles("CCCCC(=O)NCC1=CC(=C(C=C1)O)OC")
>>> mol2 = Chem.MolFromSmiles("c1(C=O)cc(OC)c(O)cc1")
>>> mols = [mol1, mol2]
>>> res = rdFMCS.FindMCS(mols)
>>> print(res.numAtoms)
10
>>> print(res.numBonds)
10
>>> print(res.canceled)
False
>>> print(res.smartsString)
'[#6]1(-[#6]):[#6]:[#6](-[#8]-[#6]):[#6](:[#6]:[#6]:1)-[#8]'
>>> mols.append(res.queryMol)
>>> Draw.MolsToGridImage(mols)

1

2.bondCompare参数

默认情况下,当两个分子中对应的原子和键完全一样时,才认为它们是一致的。可以通过修改atomCompare和bondCompare参数,来进行模糊匹配。以模糊匹配键为例。

  • 初始化两个分子
>>> mols = [Chem.MolFromSmiles('c1ccccc1'),Chem.MolFromSmiles('C1CCCC=C1')]
>>> Draw.MolsToGridImage(mols)

2

  • CompareOrderExact:默认值为该方法。当且仅当键的类型完全一致才相等(芳香键和双键是不相等的)。
>>> res = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrderExact).smartsString
>>> print(res) # 结果为空

  • CompareAny:任意键之间都可以匹配
>>> res = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareAny).smartsString
>>> print(res)
>>> m = Chem.MolFromSmarts(res)
>>> Draw.MolToImage(m, size=(150,150))

3

  • CompareOrder:允许单键和芳香键相互匹配。
>>> res = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrder).smartsString
>>> print(res)
'[#6](:,-[#6]:,-[#6]:,-[#6]):,-[#6]:,-[#6]'

3.atomCompare参数

与bondCompare参数类似,可用设置如下:

  • CompareElements:默认值,原子类型一样才算匹配。
  • CompareIsotopes:同位素一样才算匹配(根据同位素标签的值。这个值可以由用户自己定义)。
  • CompareAny:表示任意原子之间都能匹配(找公共骨架)。
>>> mols = (Chem.MolFromSmiles('NCC'),Chem.MolFromSmiles('OC=C'))
>>> res = rdFMCS.FindMCS(mols, atomCompare=rdFMCS.AtomCompare.CompareAny, bondCompare=rdFMCS.BondCompare.CompareAny).smartsString
>>> print(res)
'[#7,#8]-[#6]-,=[#6]'

4.maximizeBonds参数

一个结构由原子和键组成。默认情况下,MCS查找的目标是让键的数量最大化,相当于让环的数量最大化。最大化键的数量时,会使环的数量最大化,但也可能出现两个小环键的数量不如一个大环多的情况。可以通过将maximizeBonds参数设为False来取消设置。

5.matchValences参数

默认False,即忽略化合价信息。假设要考虑化合价信息,例如不想让一个3价氮与一个5价氮匹配上,那就可以将该参数改为True

>>> mols = (Chem.MolFromSmiles('NC1OC1'),Chem.MolFromSmiles('C1OC1[N+](=O)[O-]'))
>>> print(rdFMCS.FindMCS(mols).numAtoms)
4
>>> print(rdFMCS.FindMCS(mols, matchValences=True).numBonds)
3
>>> Draw.MolsToGridImage(mols)

4

6.ringMatchesRingOnly参数

默认为False,这种情况下,线性的碳链可能会匹配上一个环。如果只想让环相互匹配,可以将该参数设置为True。

>>> mols = [Chem.MolFromSmiles("C1CCC1CCC"), Chem.MolFromSmiles("C1CCCCCC1")]
>>> res1 = rdFMCS.FindMCS(mols)
>>> print(res1.numAtoms)
7
>>> res2 = rdFMCS.FindMCS(mols, ringMatchesRingOnly=True)
>>> print(res2.numAtoms)
4
>>> mols += [res1.queryMol, res2.queryMol]
>>> Draw.MolsToGridImage(mols)

5

7.completeRingsOnly参数

默认为False。如果只想要能够完整匹配上的环,而不想要匹配一半的环,可以将该参数设置为True。

>>> mols = [Chem.MolFromSmiles("CCC1CC2C1CN2"), Chem.MolFromSmiles("C1CC2C1CC2")]
>>> res = rdFMCS.FindMCS(mols, completeRingsOnly=True).smartsString
>>> print(res)
'[#6]1-&@[#6]-&@[#6]-&@[#6]-&@1'
  • 以上参数都可以组合叠加使用

8.timeout参数

MCS算法会穷尽每一种可能,寻找到一个最大的公共子结构。一般情况下说,该算法几秒内就能完成,但是有时也会花很长时间甚至花几分钟。这时,可以使用timeout参数来规定最大搜索时长,到达指定时长仍没有搜索完时,会返回现有的最优结果,并将canceled属性设置为True。该参数单位为秒。

>>> mols = [Chem.MolFromSmiles("Nc1ccccc1"*10), Chem.MolFromSmiles("Nc1ccccccccc1"*10)]
>>> rdFMCS.FindMCS(mols, timeout=1).canceled
True

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

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

Python3.10

Python3.10

Conda
Python

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值