使用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
相关产品推荐
相关产品推荐

