使用RDKit的rdMolAlign.AlignMol()时出现Bad Conformer Id错误
问题:RDKit运行分子对接时出现
ValueError: Bad Conformer Id 尝试使用RDKit进行分子对接模拟,运行代码时触发ValueError: Bad Conformer Id错误,错误出现在rdMolAlign.AlignMol调用行。使用的蛋白文件为4POJ.pdb,代码如下:
from rdkit import Chem from rdkit.Chem import AllChem from rdkit.Chem import rdMolAlign receptor= Chem.MolFromPDBFile('4POJ.pdb') ligand= Chem.MolFromSmiles('CC(C(=O)O)N') rdMolAlign.AlignMol(ligand,receptor) ff=AllChem.MMFFGetMoleculeForceField(ligand,AllChem.MMFFGetMoleculeProperties(ligand),mmffvariant='MMFF94') binding_energy= ff.Calcenergy() print('binding energy:',binding_energy, 'kcal/mol')
错误原因与解决方法
核心错误原因
- 配体无3D构象:从SMILES创建的
ligand只有2D结构,未生成3D构象,而rdMolAlign.AlignMol要求两个输入分子都必须包含至少一个3D构象才能执行对齐操作,因此触发错误。 - 对接逻辑错误:
rdMolAlign.AlignMol是构象对齐工具,并非分子对接工具,直接将配体与整个受体蛋白对齐不符合分子对接逻辑,通常需将配体对齐到受体中原有的参考配体。 - 结合能计算错误:原代码仅计算了配体自身的能量,并非配体与受体的结合能,结合能需通过复合物总能量减去单独受体和配体的能量得到。
修正后的代码
from rdkit import Chem from rdkit.Chem import AllChem from rdkit.Chem import rdMolAlign # 处理受体:读取PDB文件,保留原有氢并补全缺失氢 receptor = Chem.MolFromPDBFile('4POJ.pdb', removeHs=False) receptor = Chem.AddHs(receptor) # 处理配体:从SMILES创建分子,补氢后生成并优化3D构象 ligand = Chem.MolFromSmiles('CC(C(=O)O)N') ligand = Chem.AddHs(ligand) # 生成初始3D构象 AllChem.EmbedMolecule(ligand) # 用MMFF力场优化构象 AllChem.MMFFOptimizeMolecule(ligand) # (可选)若需对齐到受体中的原有配体,需先从4POJ.pdb中提取带3D构象的reference_ligand # rdMolAlign.AlignMol(ligand, reference_ligand) # 构建复合物分子 complex_mol = Chem.CombineMols(receptor, ligand) complex_mol = Chem.AddHs(complex_mol) # 分别计算受体、配体、复合物的能量 receptor_prop = AllChem.MMFFGetMoleculeProperties(receptor) receptor_ff = AllChem.MMFFGetMoleculeForceField(receptor, receptor_prop) receptor_energy = receptor_ff.CalcEnergy() ligand_prop = AllChem.MMFFGetMoleculeProperties(ligand) ligand_ff = AllChem.MMFFGetMoleculeForceField(ligand, ligand_prop) ligand_energy = ligand_ff.CalcEnergy() complex_prop = AllChem.MMFFGetMoleculeProperties(complex_mol) complex_ff = AllChem.MMFFGetMoleculeForceField(complex_mol, complex_prop) complex_energy = complex_ff.CalcEnergy() # 计算结合能:复合物总能量 - 受体能量 - 配体能量 binding_energy = complex_energy - receptor_energy - ligand_energy print('binding energy:', binding_energy, 'kcal/mol')
关键修正点说明
- 给配体生成3D构象:通过
AllChem.EmbedMolecule生成初始3D构象,再用MMFFOptimizeMolecule优化,确保配体有可用的3D坐标。 - 正确处理受体:读取PDB时保留原有氢原子,再补全缺失的氢,保证力场计算的准确性。
- 结合能计算逻辑:通过复合物与单独组分的能量差得到结合能,这是计算分子间结合能的标准方式。
内容的提问来源于stack exchange,提问作者Sundharesan
相关产品推荐
相关产品推荐

