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

使用RDKit提取PDB配体键类型时全部显示为SINGLE的问题排查

RDKit读取PDB配体键全显示为SINGLE?解决办法来了

为啥会出现这个问题?

PDB文件本身不存储键级信息,RDKit读取PDB时是靠原子间距离推断键类型的。但当配体和蛋白共存于同一个分子对象中时,RDKit的默认推断逻辑会优先适配蛋白的单键模式,导致配体里的双键、芳香键全被误判为单键。

怎么解决?

核心思路是把配体从蛋白中单独提取出来,再让RDKit重新为配体推断键级。修改后的代码如下:

from rdkit import Chem
from rdkit.Chem import rdmolops

# Windows路径用双反斜杠,Linux/Mac用单斜杠
pdb_file = "path\\2ghl.pdb"

# 读取PDB时暂不做sanitize,避免配体键被错误初始化
mol = Chem.MolFromPDBFile(pdb_file, sanitize=False, removeHs=False)

# 收集配体(LIB)的原子索引
ligand_atom_indices = []
for atom in mol.GetAtoms():
    res_info = atom.GetPDBResidueInfo()
    # 残基名可能带空格,先去除首尾空格再判断
    if res_info and res_info.GetResidueName().strip() == "LIB":
        ligand_atom_indices.append(atom.GetIdx())

# 从原分子中提取配体,形成独立的配体分子
ligand_mol = Chem.MolFragmentToMol(mol, ligand_atom_indices)

# 对配体做标准化处理:补氢、推断键级、识别芳香环
Chem.SanitizeMol(ligand_mol, Chem.SanitizeFlags.SANITIZE_ALL)
# 基于配体三维结构修正键级,确保键类型准确
rdmolops.AssignBondOrdersFromTemplate(ligand_mol, ligand_mol)

# 打印配体的键信息
for bond in ligand_mol.GetBonds():
    atom1 = ligand_mol.GetAtomWithIdx(bond.GetBeginAtomIdx())
    atom2 = ligand_mol.GetAtomWithIdx(bond.GetEndAtomIdx())
    print(f"{atom1.GetSymbol()} {bond.GetBeginAtomIdx()} {atom2.GetSymbol()} {bond.GetEndAtomIdx()} : {bond.GetBondType()}")

关键步骤说明

  • sanitize=False读取PDB:避免RDKit一开始就对整个蛋白+配体的分子做处理,提前干扰配体键的判断。
  • 单独提取配体:将配体原子从原分子中分离,形成独立的配体分子,让RDKit可以专注处理配体的键类型推断。
  • Sanitize与键级修正:Chem.SanitizeMol会自动补氢、根据分子结构推断键类型;AssignBondOrdersFromTemplate进一步基于配体三维结构优化键级,确保双键、芳香键被正确识别。

备选方案(若有其他格式文件)

如果能获取配体的SDF或PDBQT文件(这类格式原生存储键级信息),可以直接读取配体文件,省去键类型推断步骤:

ligand_mol = Chem.MolFromMolFile("lib_ligand.sdf")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:27:43