RDKit | 操作与实践

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

2020-05-13  本文已影响0人  最会设计的科研狗

最大公共子结构

最大公共子结构

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

1.搜索方法

如果没有找到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
>>> res = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrderExact).smartsString
>>> print(res) # 结果为空

>>> 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参数类似,可用设置如下:

>>> 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官方文档
代码及源文件在这里

上一篇下一篇

猜你喜欢

热点阅读