1. SDF 文件格式详解

SDF(Structure Data File),说白了就是化学信息学领域里最通用的"结构+数据"打包格式。我第一次接触 SDF 是在做高通量虚拟筛选项目时——数据量一大,你会发现几乎所有的分子对接、构象搜索、药效团建模工具都把 SDF 当作首选输入格式。

嗯,这里要注意:SDF 并不是一个独立的格式,它其实是 MDL Molfile 的扩展版本。我习惯把 SDF 理解为"Molfile + 数据表"。你想想看,一个分子结构需要存原子坐标、键信息、还有一些实验属性(比如 LogP、IC₅₀),SDF 正好把这两部分塞进了一个文件里。

2.1 SDF 文件的结构

每个 SDF 分子记录由三个主要部分组成,我用下面这张图帮你理清脉络:

SDF 文件结构剖析 文件头(3 行) 序号标识 程序名/日期 空行/注释 原子块(原子块 + 键块) 计数值 原子列表 键列表 属性数据 > <字段名> 属性值 空行结束 记录结束符:$$$$ 注意事项 • 文件头、原子块、属性数据三者缺一不可,顺序不能乱。 • 每个分子记录必须以 $$$$ 结束,后跟一个空行。 • 属性字段行以 > 开头,<字段名> 中间不能有空格。

SDF 最常见的版本是 V2000 格式。下面我拿一个实际的分子记录片段来演示:

  Mrv231 10252215332D         0   0.00000     0.00000     0
  6  5  0  0  0  0  0  0  0  0999 V2000
    1.2345    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    1.2345    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.2345    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000   -1.2345    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.4690    0.0000    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0
   -2.4690    0.0000    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0  0  0  0
  2  3  2  0  0  0  0
  3  4  1  0  0  0  0
  4  1  1  0  0  0  0
  1  5  1  0  0  0  0
M  END
> <PCID>
CHEMBL123456

> <LOGP>
2.45

$$$$

核心要点:文件头第 4 行是关键——它定义了原子计数和键计数。我曾经因为文件头格式错误(比如少了个空格)导致整个虚拟筛选流程崩溃,排查了大半天才发现是计数行多了一个制表符。所以,解析 SDF 时,文件头的空格和列宽一定要严格对待。

2.2 数据字段

SDF 比普通 Molfile 多出的核心能力,就是属性数据区。每一行都以 > <字段名> 开始,后面跟着具体的属性值,空行表示该字段结束。

我个人习惯把属性字段分为三类:

  • 标识型字段:比如 PCID、SMILES、IUPAC_NAME
  • 数值型字段:比如 MW、LOGP、TPSA、HBOND_DONOR
  • 自定义字段:你在项目里需要的任何额外信息,比如 PURITY、SCORE

我踩过的坑:> <字段名> 那一行必须以四个大于号开始,字段名要放在尖括号里。我曾经遇到一个供应商提供的 SDF 文件,字段名里多了一个空格(比如 < LOGP>),解析器直接报错。这种问题在批量处理时尤其隐蔽,你想想看,一万个分子里有三个这样的错误,定位起来非常头疼。

2.3 常见变体

SDF 主要有两种格式变体,我整理了一个对比表格:

特性 V2000 V3000
行数限制 原子数 ≤ 999,键数 ≤ 999 无限制,适合大分子、聚合物
原子块格式 固定列宽,依赖空格对齐 自由格式,使用 M V30 结构化书写
保留字 原子类型最多 3 字符 支持同位素、电荷、自由基、R/S 立体化学等
兼容性 几乎所有工具都支持 部分老工具不支持,需要转换
可读性 简单直观,但空格容易出错 冗长,但更容错

说实话,V2000 目前还是主流。但如果你处理的是大分子(比如蛋白质配体复合物),或者数据量超大,我建议你默认用 V3000。我在一次协同处理 50 万个虚拟筛选结果时,V2000 的列宽解析成了性能瓶颈,换成 V3000 后问题迎刃而解。

2.4 原子与键的表示方式

每个原子的格式是固定的,我拆开给你看:

  1.2345    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  ↑坐标 X  ↑坐标 Y  ↑坐标 Z  ↑元素符号  ↑同位素  ↑电荷  ↑立体化学标识...

这里要注意的是:

  • 坐标单位是埃(Å)。我在项目中发现过坐标值超出合理范围(比如 ±1e6)的 SDF,那些多半是计算软件崩溃后的产物。
  • 元素符号必须大写开头,小写结尾(比如 C、Na、Br)。
  • 电荷字段:0 表示中性,1 表示正一价,-1 是负一价。

键的格式相对简单:

  1  2  1  0  0  0  0
  ↑起点  ↑终点  ↑键类型  ↑立体化学  ↑键拓扑

键类型常用的有:1(单键)、2(双键)、3(三键)、4(芳香键)。

小技巧:如果你在解析时遇到芳香键(类型 4),我推荐把它当作单双交替处理。许多对接工具(包括 ADT 和 Open Babel)在转换 PDBQT 时,芳香键需要被识别为可旋转或不可旋转。我曾经在构象搜索时发现键类型信息缺失导致搜索算法无法正确判断旋转键,后来都是通过 SDF 的芳香键标记来校准的。