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

RDKit优化分子时显式氢丢失问题求助

解决RDKit优化SDF分子时显式氢丢失与警告问题

核心问题根源

RDKit默认读取SDF文件时会自动移除显式氢(removeHs=True是默认参数),这就是你明明SDF有氢但读取后丢失、调用AddHs()也没解决警告的原因——默认读取已经把氢删了,后续加的氢可能因无有效坐标或未被正确识别,无法满足MMFF优化的要求。

分步解决方案

  1. 读取SDF时强制保留显式氢
    读取SDF必须指定removeHs=False,确保原文件中的显式氢被完整保留:

    from rdkit import Chem
    from rdkit.Chem import AllChem
    
    # 读取SDF,保留所有显式氢
    suppl = Chem.SDMolSupplier("input.sdf", removeHs=False)
    
  2. 添加氢时同步生成坐标
    若原SDF氢的坐标缺失或需要补充隐式氢,调用AddHs()时需加上addCoords=True,保证MMFF优化能获取有效原子坐标:

    for mol in suppl:
        if mol is None:
            continue
        # 添加氢并生成对应坐标
        mol = Chem.AddHs(mol, addCoords=True)
        # 执行MMFF优化
        AllChem.MMFFOptimizeMolecule(mol)
    
  3. 写入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:08