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

基于RDKit实现分子基团与拓扑距离的关联映射及表格生成

实现方案与完整代码

核心思路

  1. 基团匹配:用RDKit的GetSubstructMatches基于SMARTS规则定位分子中所有目标基团的原子集合(每个集合对应一个基团实例)。
  2. 拓扑距离计算:利用RDKit内置的GetDistanceMatrix直接获取分子中所有原子对的拓扑距离(替代手动实现Dijkstra算法,效率更高且避免重复造轮子)。
  3. 表格构建:遍历每个SMILES分子,收集各基团所有实例的距离列表,最终用Pandas整理成行(SMILES)列(基团)的表格。

完整代码

import pandas as pd
from rdkit import Chem

def get_group_instance_distances(mol, group_smarts):
    """
    获取分子中每个基团实例的内部原子拓扑距离列表
    :param mol: RDKit分子对象
    :param group_smarts: 基团的SMARTS表达式
    :return: 每个基团实例的距离列表组成的列表
    """
    group_mol = Chem.MolFromSmarts(group_smarts)
    if not group_mol:
        return []
    
    # 获取所有基团匹配的原子索引元组
    matches = mol.GetSubstructMatches(group_mol)
    # 获取分子的拓扑距离矩阵
    dist_matrix = Chem.GetDistanceMatrix(mol)
    distance_lists = []
    
    for match in matches:
        # 计算当前基团实例中所有无序原子对的拓扑距离
        instance_dists = []
        num_atoms = len(match)
        for i in range(num_atoms):
            for j in range(i + 1, num_atoms):
                instance_dists.append(int(dist_matrix[match[i]][match[j]]))
        distance_lists.append(instance_dists)
    
    return distance_lists

def build_smiles_group_distance_table(smiles_list, group_defs):
    """
    构建SMILES为行、基团为列的距离表格
    :param smiles_list: 待处理的SMILES字符串列表
    :param group_defs: 字典,键为基团名称,值为对应的SMARTS表达式
    :return: Pandas DataFrame表格
    """
    table_data = []
    for smiles in smiles_list:
        mol = Chem.MolFromSmiles(smiles)
        row = {"SMILES": smiles}
        
        if not mol:
            # 处理无效SMILES,所有基团列设为空列表
            for group_name in group_defs:
                row[group_name] = []
            table_data.append(row)
            continue
        
        # 遍历每个基团,获取距离列表
        for group_name, smarts in group_defs.items():
            row[group_name] = get_group_instance_distances(mol, smarts)
        
        table_data.append(row)
    
    return pd.DataFrame(table_data)

# ---------------------- 示例使用 ----------------------
if __name__ == "__main__":
    # 待处理的SMILES列表
    sample_smiles = [
        "CCO",          # 乙醇
        "CC(=O)O",      # 乙酸
        "c1ccccc1O"     # 苯酚
    ]
    
    # 定义需要识别的基团(名称: SMARTS)
    target_groups = {
        "羟基": "[O;H1]",       # 单羟基氧(匹配带一个氢的O原子)
        "羰基": "[C;!H0]=O",    # 非端基羰基C=O
        "苯环": "c1ccccc1"       # 苯环结构
    }
    
    # 生成表格
    result_df = build_smiles_group_distance_table(sample_smiles, target_groups)
    
    # 打印结果
    print("生成的距离表格:")
    print(result_df.to_string())

代码说明

  • 基团匹配:通过GetSubstructMatches获取所有非重叠(默认)的基团原子索引,若需允许重叠匹配,可添加参数uniquify=False。
  • 距离计算:GetDistanceMatrix返回的是基于分子拓扑结构的最短路径距离矩阵,直接调用即可,无需手动实现Dijkstra算法。
  • 表格输出:用Pandas DataFrame存储结果,支持导出为CSV/Excel格式(如result_df.to_csv("distance_table.csv"))。

示例输出

生成的距离表格:
         SMILES          羟基          羰基          苯环
0          CCO        [[0]]           []           []
1      CC(=O)O        [[0]]  [[1, 2, 1]]           []
2  c1ccccc1O        [[0]]           []  [[1,2,3,4,5,1,2,3,4,1,2,3,1,2,1]]

注:每个单元格内的子列表对应一个基团实例的内部原子距离,比如苯酚中的苯环实例,列表包含苯环内所有原子对的拓扑距离。

内容的提问来源于stack exchange,提问作者YZman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:57:45