RDKit优化分子时显式氢丢失问题求助
解决RDKit优化SDF分子时显式氢丢失与警告问题
核心问题根源
RDKit默认读取SDF文件时会自动移除显式氢(removeHs=True是默认参数),这就是你明明SDF有氢但读取后丢失、调用AddHs()也没解决警告的原因——默认读取已经把氢删了,后续加的氢可能因无有效坐标或未被正确识别,无法满足MMFF优化的要求。
分步解决方案
读取SDF时强制保留显式氢
读取SDF必须指定removeHs=False,确保原文件中的显式氢被完整保留:from rdkit import Chem from rdkit.Chem import AllChem # 读取SDF,保留所有显式氢 suppl = Chem.SDMolSupplier("input.sdf", removeHs=False)添加氢时同步生成坐标
若原SDF氢的坐标缺失或需要补充隐式氢,调用AddHs()时需加上addCoords=True,保证MMFF优化能获取有效原子坐标:for mol in suppl: if mol is None: continue # 添加氢并生成对应坐标 mol = Chem.AddHs(mol, addCoords=True) # 执行MMFF优化 AllChem.MMFFOptimizeMolecule(mol)写入SDF时禁止自动删氢
输出新SDF时,设置SetRemoveHs(False),避免RDKit再次自动删除显式氢:writer = Chem.SDWriter("output.sdf") writer.SetRemoveHs(False) writer.write(mol) writer.close()
完整修正代码示例
from rdkit import Chem from rdkit.Chem import AllChem # 读取源SDF,保留显式氢 suppl = Chem.SDMolSupplier("input.sdf", removeHs=False) # 初始化写入器,设置保留氢 writer = Chem.SDWriter("optimized_output.sdf") writer.SetRemoveHs(False) for mol in suppl: if mol is None: continue # 补全氢并生成坐标 mol_with_h = Chem.AddHs(mol, addCoords=True) # 执行MMFF优化 opt_status = AllChem.MMFFOptimizeMolecule(mol_with_h) print(f"分子优化状态:{'成功' if opt_status == 0 else '失败'}") # 写入优化后分子 writer.write(mol_with_h) writer.close()
额外排查点
- 检查你的SDF片段中氢的格式:确保氢原子符号为
H且带有完整坐标信息,RDKit对格式不规范的氢可能无法正确识别。 - 可通过
mol_with_h.GetNumAtoms()和mol_with_h.GetNumHeavyAtoms()对比,确认氢原子数量是否符合预期,排查是否存在部分氢未被正确添加的情况。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

