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

最大公共子结构

  • 1.搜索方法
  • 2.bondCompare参数
  • 3.atomCompare参数
  • 4.maximizeBonds参数
  • 5.matchValences参数
  • 6.ringMatchesRingOnly参数
  • 7.completeRingsOnly参数
  • 8.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
>>> 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官方文档
代码及源文件在这里

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容