Open Babel 是化学信息学的「格式瑞士军刀」,支持一百多种化学文件格式的相互转换,同时提供构象生成、加氢、pH 处理、指纹计算等功能。在实际项目里,它出场的时刻通常是:某个工具只吃 MOL2,而你手上是 SDF。
安装
mamba install -c conda-forge openbabel
obabel -L formats | head -20 # 查看支持的格式
obabel -V
最常用的命令
# 基本转换
obabel input.sdf -O output.mol2
# SMILES → 3D 结构(含构象生成)
obabel -:"CC(=O)Oc1ccccc1C(=O)O" -O aspirin.sdf --gen3d
# 按 pH 加氢(对接前常用)
obabel input.sdf -O output.sdf -p 7.4
# 批量拆分多分子文件
obabel library.sdf -O mol_.sdf -m
# 能量最小化
obabel input.sdf -O min.sdf --minimize --ff MMFF94 --steps 500
# 构象搜索
obabel input.sdf -O confs.sdf --conformer --nconf 20 --score rmsd
# 加过滤条件(转换时顺手筛选)
obabel library.sdf -O filtered.sdf --filter "MW<500 and logP<5"
几个实用参数
| 参数 | 作用 |
|---|---|
--gen3d |
生成 3D 坐标,可加 --best 提高质量(更慢) |
-p <pH> |
按 pH 决定质子化态并加氢 |
-h / -d |
加氢 / 去氢 |
-r |
只保留最大片段(去盐) |
--unique |
按 InChI 去重 |
-m |
拆分成多个文件 |
--append |
把计算的属性写进输出 |
-r 去盐和 --unique 去重经常被用于快速清洗采购库,一条命令能省不少事。
Python 接口
from openbabel import pybel
for mol in pybel.readfile("sdf", "library.sdf"):
mol.addh()
mol.make3D(forcefield="mmff94", steps=100)
print(mol.title, mol.molwt, mol.calcdesc(["logP", "TPSA"]))
mol.write("mol2", f"out/{mol.title}.mol2", overwrite=True)
什么时候该用 RDKit 而不是它
这是使用 Open Babel 时最该有的判断。两者功能重叠,但可靠性不同:
- 芳香性与键级感知:Open Babel 从 PDB 等无键级信息的格式推断键级时,芳香环、羧酸、硝基等容易判错。需要化学正确性的场合优先用 RDKit(见 171《RDKit》)。
- 标准化与去盐:RDKit 的
MolStandardize行为更明确、更可控,正经的数据清洗管线应该用它。 - 构象生成:RDKit 的 ETKDG 通常质量更好,是当前推荐做法。
- 指纹与描述符:RDKit 的实现更主流,与文献可比性更好。
- Open Babel 真正不可替代的:格式覆盖面。需要读写 RDKit 不支持的冷门格式(如某些量化程序的输入输出、CIF 变体)时,它是唯一选择。
务实结论:把 Open Babel 当格式转换器用,把化学逻辑交给 RDKit。
注意事项
- 转换会丢信息:PDBQT、XYZ 等格式不含键级,转回来时靠推断,可能出错。链路上保留一份权威的 SDF/SMILES 作为真相来源。
--gen3d有随机性:需要可复现时记录参数,或改用 RDKit 并固定随机种子。- 大文件慢:几十万分子的转换较慢,考虑分块并行。
- 版本行为差异:不同版本的 pH 模型与芳香性感知有变化,管线中要锁定版本。
上手提示
- 它的核心价值是格式覆盖面,化学逻辑交给 RDKit 更可靠;
-p 7.4、-r去盐、--unique去重是最实用的三个开关;- 从 PDB 推断键级容易出错,重要分子要用 SDF/SMILES 校验;
- 管线中锁定版本,不同版本行为有差异。
延伸资源
- 化学信息学主力:171《RDKit》、218《Datamol》;
- 对接文件准备:214《Meeko》;结构修复:215《PDBFixer》。