You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于RDKit的MCS结果实现分子间原子映射?

从RDKit的MCS结果提取原子索引映射的方法

要拿到两个分子间的原子对应关系,核心思路是用MCS生成的公共子结构SMARTS,分别在两个分子上做子结构匹配,再把匹配到的原子索引一一对应起来。下面是完整的实操代码和解释:

完整示例代码

from rdkit import Chem
from rdkit.Chem import rdFMCS

# 构造测试分子(替换成你自己的mol_1和mol_2即可)
mol_1 = Chem.MolFromSmiles('c1ccccc1CO')
mol_2 = Chem.MolFromSmiles('c1ccccc1CCO')

# 计算最大公共子结构
mcs_result = rdFMCS.FindMCS([mol_1, mol_2])

# 处理MCS未找到的情况
if not mcs_result.smartsString:
    print("未找到公共子结构")
else:
    # 将MCS的SMARTS转换为可匹配的分子模板
    mcs_template = Chem.MolFromSmarts(mcs_result.smartsString)
    
    # 在两个分子中分别匹配MCS模板,获取原子索引
    # 返回的是匹配结果的列表,每个元素是一个原子索引元组
    matches_mol1 = mol_1.GetSubstructMatches(mcs_template)
    matches_mol2 = mol_2.GetSubstructMatches(mcs_template)
    
    # 取第一个匹配结果(MCS通常是唯一的最大匹配,若有多个可按需筛选)
    if matches_mol1 and matches_mol2:
        atom_mapping = list(zip(matches_mol1[0], matches_mol2[0]))
        print("原子索引映射列表:")
        print(atom_mapping)
    else:
        print("MCS模板匹配失败")

关键步骤解释

  • MCS结果转模板:rdFMCS.FindMCS返回的结果里,smartsString是公共子结构的SMARTS表达式,需要用Chem.MolFromSmarts转成RDKit分子对象,才能用于子结构匹配。
  • 子结构匹配:GetSubstructMatches会返回所有符合模板的子结构原子索引,每个元素是一个元组,元组里的顺序和模板的原子顺序一一对应。
  • 生成映射:因为两个分子匹配的是同一个MCS模板,所以两个匹配结果的原子顺序完全对应,直接用zip把它们的索引配对即可。

注意事项

  • 如果分子有多个符合MCS的子结构匹配,matches_mol1和matches_mol2会包含多个元素,这时候需要根据需求选择合适的匹配对(比如优先匹配原子顺序一致的)。
  • 确保你的分子对象已正确加载,可先用Chem.SanitizeMol(mol)做结构清洗,避免氢原子缺失或结构错误导致匹配失败。

内容的提问来源于stack exchange,提问作者Nigel W. Moriarty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:52:06