拆解四大常见化学文件格式:SMILES、SDF、MOL、PDB

做分子图结构生成,绕不开文件格式。说实话,很多初学者上来就怼着代码写解析器,结果被各种格式的细节坑得头皮发麻。我见过最夸张的案例是有人把SDF文件里空行当数据缺失丢掉,导致对接失败,整整查了两天bug。

这一章,我们就来彻底弄清楚四种最常见格式:SMILES、SDF、MOL、PDB。我会告诉你它们各自适合干什么,不适合干什么,以及我曾经踩过的坑。

SMILES:一句话描述一个分子

SMILES,全称Simplified Molecular-Input Line-Entry System。说白了就是一条字符串。它把分子结构和连接关系编码成人类能读懂的文本。比如乙醇:

CCO

就这么简单。C代表碳,O代表氧,单键直接相邻。但SMILES的威力远不止此。

核心规则:

  • 原子用元素符号表示,B、C、N、O、F、P、S、Cl、Br、I直接写
  • 单键不写符号,双键用=,三键用#
  • 分支用小括号()
  • 环用数字标记起始和终止原子
  • 方括号[]表示非标准价态或同位素

举个例子,苯:

c1ccccc1

嗯,这里要注意,小写c表示芳香碳。这是SMILES里最容易搞混的地方。我在早期项目中曾经把芳香环写成大写的C,结果对接的分子指纹死活对不上。

我的经验: SMILES是结构搜索和数据库索引的利器。但千万别用它存大分子或配体-受体复合物。我用过一次,字符串长得像天文数字,自己都看懵了。

SDF:结构数据文件,带信息的MOLPlus

SDF全称Structure-Data File。它是在MOL格式基础上加了个属性表。你想想看,光有原子坐标和键连接有什么用?我需要知道这个分子的IC50值、LogP、SMILES来源吧?

SDF文件由三部分组成:

  1. 分子头块: 第一行是名字或注释;第二行源程序和时间戳;第三行空行或注释行
  2. 连接表块: 原子坐标、原子类型、键连接矩阵(和MOL格式一模一样)
  3. 属性块: 以><属性名>开头,后面跟着值,最后用$$$$结束当前分子

举个例子,单个分子的结构:

benzene  
  Mrv2317 11132414562D  

  6  6  0  0  0  0  0  0  0  0  0 V2000
    0.0000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.8660    0.5000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.8660    1.5000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.0000    2.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.8660    1.5000    0.0000 C   0  0  0  0  0  0  0  0  0 0  0  0
    0.8660    0.5000    0.0000 C   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  5  2  0  0  0  0
  5  6  1  0  0  0  0
  6  1  2  0  0  0  0
M  END
><SMILES>
c1ccccc1
$$$$
我曾经踩过的坑: SDF文件每行的列宽是固定的。在V2000格式里,原子坐标、原子符号都有固定列位。如果你用文本编辑器手动编辑,不小心多打了一个空格,解析器就会把坐标和原子类型识别错位。所以切记,别手改SDF。

MOL:分子连接表的核心

MOL格式是SDF和MOL2等众多格式的鼻祖。它记录分子结构,但不带属性。如果你只需要原子的三维坐标和键连接关系,MOL就够了。

它的结构分为:

  • 头块: 3行,包含分子名字、程序来源、注释
  • 原子块: 每行一个原子,x, y, z坐标加上原子类型和一堆数字
  • 键块: 每行一个键,用起始原子索引、终止原子索引和键类型编码

键类型的编码规则:

编码 含义
1 单键
2 双键
3 三键
4 芳香键

你可能会问,为什么要学这种老掉牙的格式?

因为几乎所有的分子结构搜索引擎、化学数据库(比如PubChem)底层都支持MOL。而且很多旧项目的代码库还在用,你改不了它,你只能适应它。

小技巧: MOL V2000格式最多支持999个原子和999个键。随着分子变大,出现了V3000扩展格式。如果你的分子很大(比如蛋白质片段),直接用V3000,别卡在V2000的限制上白费力气。

PDB:蛋白质的身份证

PDB全称Protein Data Bank。它不像MOL那样用坐标加连接表的二进制友好格式,而是纯文本、固定宽度。每行以记录名开头(ATOM、HETATM、CONECT等),然后后面是固定列位的数据。

最核心的记录类型:

  • ATOM: 标准氨基酸残基的原子坐标
  • HETATM: 非标准残基或配体/水分子
  • CONECT: 键连接信息(可选)
  • REMARK: 注释
  • TER: 链终止

一个ATOM记录的列位布局:

ATOM      1  N   ALA A   1      11.608   10.295    8.661  1.00  0.00           N
|          |  |   |   |   |      |         |         |      |    |              |
col 1-6    7-11 13-16 18-20 22 23-27 31-38 39-46 47-54 55-60 61-66 77-78
记录名    序号 原子名 残基名 链 残基号 X坐标  Y坐标  Z坐标  占有度 温度因子 元素

注意没有?从第1列开始,空一格,再到序号,再到原子名。这种固定宽度的格式,在早期计算机内存有限时是对的,现在用Python解析反而要小心翼翼,多一个空格少一个空格都不行。

我的经验: PDB里CONECT记录经常缺失,特别是那些老旧的结构。我建议你解析时如果无CONECT,可以用距离判断法(原子间距阈值)生成键连接,但阈值要控制在2.5Å以内,否则容易生成假键。

四种格式对比

格式 表示能力 人类可读性 是否支持3D坐标 是否支持属性 常见应用场景
SMILES 连接性(2D拓扑) 高(短字符串) 否 否 化学数据库索引、子结构搜索
MOL 原子+键+坐标 中 是(2D/3D) 否 分子编辑器、旧版应用程序交换
SDF 原子+键+坐标+属性 中 是(2D/3D) 是 高通量筛选、化合物库管理
PDB 原子坐标+残基链 低(固定宽度) 是(3D) 有限 蛋白质/核酸结构存储

我个人习惯:做分子图生成或可视化时,优先用SDF。它能完整保留元数据,而且大多数化学信息学工具(RDKit、OpenBabel)原生支持。如果只是做快速的结构查询,用SMILES。如果是处理蛋白质-配体复合物,那就没有选择了,老老实实用PDB。

你想想看,要是你辛辛苦苦做了个分子图生成的项目,结果保存成SMILES忘了存坐标,下次读回来还得重新计算3D构象,是不是太亏了?所以先想清楚你要干什么,再选格式。