拆解四大常见化学文件格式: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,结果对接的分子指纹死活对不上。
SDF:结构数据文件,带信息的MOLPlus
SDF全称Structure-Data File。它是在MOL格式基础上加了个属性表。你想想看,光有原子坐标和键连接有什么用?我需要知道这个分子的IC50值、LogP、SMILES来源吧?
SDF文件由三部分组成:
- 分子头块: 第一行是名字或注释;第二行源程序和时间戳;第三行空行或注释行
- 连接表块: 原子坐标、原子类型、键连接矩阵(和MOL格式一模一样)
- 属性块: 以
><属性名>开头,后面跟着值,最后用$$$$结束当前分子
举个例子,单个分子的结构:
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
$$$$
MOL:分子连接表的核心
MOL格式是SDF和MOL2等众多格式的鼻祖。它记录分子结构,但不带属性。如果你只需要原子的三维坐标和键连接关系,MOL就够了。
它的结构分为:
- 头块: 3行,包含分子名字、程序来源、注释
- 原子块: 每行一个原子,x, y, z坐标加上原子类型和一堆数字
- 键块: 每行一个键,用起始原子索引、终止原子索引和键类型编码
键类型的编码规则:
| 编码 | 含义 |
|---|---|
| 1 | 单键 |
| 2 | 双键 |
| 3 | 三键 |
| 4 | 芳香键 |
你可能会问,为什么要学这种老掉牙的格式?
因为几乎所有的分子结构搜索引擎、化学数据库(比如PubChem)底层都支持MOL。而且很多旧项目的代码库还在用,你改不了它,你只能适应它。
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解析反而要小心翼翼,多一个空格少一个空格都不行。
四种格式对比
| 格式 | 表示能力 | 人类可读性 | 是否支持3D坐标 | 是否支持属性 | 常见应用场景 |
|---|---|---|---|---|---|
| SMILES | 连接性(2D拓扑) | 高(短字符串) | 否 | 否 | 化学数据库索引、子结构搜索 |
| MOL | 原子+键+坐标 | 中 | 是(2D/3D) | 否 | 分子编辑器、旧版应用程序交换 |
| SDF | 原子+键+坐标+属性 | 中 | 是(2D/3D) | 是 | 高通量筛选、化合物库管理 |
| PDB | 原子坐标+残基链 | 低(固定宽度) | 是(3D) | 有限 | 蛋白质/核酸结构存储 |
我个人习惯:做分子图生成或可视化时,优先用SDF。它能完整保留元数据,而且大多数化学信息学工具(RDKit、OpenBabel)原生支持。如果只是做快速的结构查询,用SMILES。如果是处理蛋白质-配体复合物,那就没有选择了,老老实实用PDB。
你想想看,要是你辛辛苦苦做了个分子图生成的项目,结果保存成SMILES忘了存坐标,下次读回来还得重新计算3D构象,是不是太亏了?所以先想清楚你要干什么,再选格式。