第4章 文件格式解析与互转:支持格式一览与互转命令详解

说起 Open Babel 最核心的功能,你一定绕不开文件格式的读写与互转。我刚开始用这个工具时,光是搞明白它能读哪些格式就花了半天。后来才意识到,搞懂格式互转,其实就是搞懂了 Open Babel 的基础。

本章我会带你过一遍最常见的格式,再手把手演示怎么在不同格式之间来回转换。

4.1 支持格式一览

Open Babel 支持的格式超过 110 种,但日常配体处理常用的也就下面这几种。我给你列了个对照表,方便你快速查阅。

格式扩展名 全称 典型用途 存储内容
SDF Structure-Data File 分子数据库、虚拟筛选结果 原子坐标+键信息+性质字段
MOL2 Tripos Mol2 对接软件(如 Sybyl)的原始输入 原子坐标+键级+形式电荷+原子类型
PDB Protein Data Bank 蛋白质-配体复合物、晶体结构 原子坐标+残基信息+温度因子
SMI SMILES 一维分子编码、快速检索 线性字符串,无坐标
XYZ XYZ 坐标文件 量子化学计算结果、轨迹 原子符号+坐标(无键信息)
MOL MDL Molfile 单个分子的输入输出 原子坐标+键信息(无性质字段)

我个人的经验是:SDF 是「配体交换」的首选格式,因为它可以同时存多个分子和自定义性质字段。想想看,你做一个虚拟筛选,SDF 里既能保留打分值,又能保留原始构象,非常方便。

4.2 常见格式怎么选?

不同的场景,配体格式的选择差别很大。我按使用场景给你整理了一下思路。

  • 对接前的准备:从数据库下载的配体多是 SDF,但很多对接软件偏爱 MOL2。为啥?因为 MOL2 自带形式电荷和原子类型,省去你手动分配的麻烦。
  • 与蛋白质共存:如果你需要把配体和蛋白质放一起分析,PDB 是标准。不过要小心,PDB 里的配体有时会被截断或丢失氢原子。
  • 快速测试与搜索:想验证一个分子是否存在?直接用 SMILES,一行字符串解决问题,不需要三维坐标。
  • 量子化学计算:做完 Gaussian 或 ORCA 的计算,输出通常是 XYZ 格式。它只存坐标和原子符号,非常简洁。

↗ 我在项目中遇到过一种情况:从 NCBI 下载的 SDF 文件里有几十万个分子,但里面混了一些「空分子」。直接用 obabel 转换时会报错。我的经验是:先跑个空分子检测脚本,过滤掉后再做后续处理。

4.3 格式互转命令与参数详解

格式互转是 Open Babel 最拿手的活。说白了,就是一条命令在不同格式之间切换。下面我带你操作几个典型案例。

4.3.1 SDF → MOL2 转换

从 ChEMBL 或 ZINC 下载的数据集通常是 SDF,要把它们转成对接软件能认的 MOL2,运行这条命令就可以了。

obabel ligands.sdf -O ligands.mol2

但这样转换出来的 MOL2 可能缺失原子类型(如 C.3、N.ar 等)。为了获得更准确的结果,我建议加上 --genatomtype 参数,让 Open Babel 自动猜测原子类型。

obabel ligands.sdf -O ligands.mol2 --genatomtype

⚠️ 我曾经因为偷懒没加这个参数,结果对接程序报了一堆原子类型错误。后来排查才意识到,默认转换不生成 Tripos 原子类型。记得一定要加 --genatomtype。

4.3.2 PDB → SDF 转换

从蛋白质数据库下载的 PDB 文件里,配体有时被当作 HETATM 记录。要把它们单独提取出来并转成 SDF,可以这么做。

obabel 4s1q_ligand.pdb -O 4s1q_ligand.sdf

如果 PDB 文件里同时含蛋白质和多条配体链,需要先用 -x 参数过滤出特定的链或残基。举个例子,只提取残基 ID 为 LIG 的配体:

obabel complex.pdb -O ligand.sdf -xr LIG

我个人习惯在做 PDB→SDF 转换时,顺手加上 --addhydrogen 参数。因为晶体结构里的氢原子经常是缺失的,而你做后续计算时需要完整的氢原子构型。

obabel complex.pdb -O ligand.sdf -xr LIG --addhydrogen

4.3.3 SMI → SDF 转换

SMILES 是线性字符串,没有三维坐标。如果你需要把它转成 SDF,Open Babel 会自动生成一个三维构象。

obabel "CC(C)C(=O)O" -O ibuprofen.sdf --gen3d

这里 --gen3d 是关键参数,它告诉 Open Babel 使用内置的构象生成算法。你想想看,一个只有一维字符串的分子,不靠算法怎么得到三维坐标?

↗ 如果生成的构象不合理,可以试试 --best 参数,它会尝试更多构象搜索步骤,虽然耗时但质量更高。

4.3.4 XYZ → MOL2 转换

量子化学计算出来的 XYZ 文件没有键信息,也没有原子类型。转换时需要 Open Babel 自己计算键连接性和原子类型。

obabel output.xyz -O output.mol2 --genatomtype

这里要注意:如果 XYZ 里的分子有自由基或过渡态,Open Babel 自动加氢可能会出错。我建议你在转换前先检查一下分子的电子结构。

4.4 批量转换与筛选

做虚拟筛选时,你往往要处理几百个甚至几万个文件。手动一个一个转换肯定不现实。Open Babel 支持批量处理,也支持按条件筛选。

4.4.1 批量转换所有 SDF 到 MOL2

for f in *.sdf; do obabel "$f" -O "${f%.sdf}.mol2" --genatomtype; done

这个小脚本会遍历当前目录下所有 .sdf 文件,逐个转成 .mol2。我在项目中用它处理过上万个小分子,跑了一夜,第二天早上结果全出来了。

4.4.2 筛选并转换

Open Babel 可以用 -at 或 -an 参数按原子数或原子类型筛选。比如只想转换分子量在 300-500 之间的分子:

obabel ligands.sdf -O filtered.sdf -at 20-40 --weight 300-500

这里 -at 20-40 表示原子数在 20 到 40 之间,--weight 300-500 表示分子量在 300 到 500 之间。两个条件同时满足的分子才会被写入新文件。

⚠️ 我曾经在筛选时忘记加单位,结果 --weight 的实际值和我的预期差了一倍。后来才发现 Open Babel 的 --weight 默认单位是 g/mol,和计算软件一致,但和某些数据库里的道尔顿(Da)数值是相等的,不用额外换算。

4.5 转换参数速查表

做格式互转时,我经常要用到下面这几个参数。为了方便你查阅,我整理成了一个表格。

参数 全拼/说明 适用场景
--genatomtype Generate atom types 从 SDF 或 XYZ 转 MOL2 时加
--addhydrogen Add hydrogen atoms 从 PDB 或 XYZ 转其他格式时加
--gen3d Generate 3D coordinates 从 SMILES 转 SDF 或 MOL2 时加
--best Use best 3D generation algorithm 需要高质量构象时加
-xr Extract specific residue 从 PDB 中提取特定配体时加
-at Filter by number of atoms 批量筛选时用
--weight Filter by molecular weight 批量筛选时用

嗯,这里再强调一下:--genatomtype 和 --addhydrogen 这两个参数,在实际项目中几乎每次都会用到。我建议你把它们列为转换命令的「默认套餐」。

4.6 常见坑与避坑指南

做格式转换时,踩坑在所难免。我把自己踩过的坑分享给你,省得你走弯路。

  • 坑一:MOL2 的原子类型与对接软件不兼容

    我用 Open Babel 转出来的 MOL2,导入到 Autodock 时发现原子类型错误。原因是 Autodock 使用的原子类型表与 Open Babel 的默认类型不一致。解决方法是手动指定输出格式为 pdbqt,或者使用专门的对接格式转换参数。

  • 坑二:SDF 中的性质字段丢失

    SDF 文件里存储的 logP、MW 等字段,在转成 MOL2 或 PDB 时会丢失。因为 MOL2 和 PDB 的文件格式不支持这些自定义字段。如果你需要保留这些性质数据,建议先转成 SDF 格式,或者用 Python 读取字段后单独存储。

  • 坑三:XYZ 文件与 SDF 混用出错

    XYZ 文件没有键信息,你把它转成 SDF 后,Open Babel 会靠距离判断键型。对于大环或过渡态分子,这种判断很容易出错。我曾经用 XYZ 转 SDF 后,发现环戊二烯被当成五个离散的 CH 基团。后来我改成先用 MOPAC 做一次几何优化,再转格式,问题就解决了。

↗ 总结一下:做格式互转时,先问自己三个问题——1)原文件里有什么信息?2)目标文件需要什么信息?3)这些信息在转换过程中会不会丢失?想清楚后再执行命令,能省很多排查时间。

4.7 本章知识框架

我把本章的关键知识画成了一张框架图,你看看。

格式互转知识框架 Open Babel 格式互转 SDF 输入 MOL2 输入 PDB 输入 SMI/XYZ 输入 SDF 输出 MOL2 输出 PDB 输出 SMI/XYZ 输出 核心参数: --genatomtype (原子类型) --addhydrogen (加氢) --gen3d (三维构象) --weight / -at (筛选过滤)

图上展示的逻辑很简单:左侧是输入格式,中间是互转命令层,右侧是输出格式。关键在于你在转换前要想清楚需要保留哪些信息,然后选择合适的参数组合。