PyMOL对象与文件格式:PDB、SDF、MOL2等导入导出

老实说,刚开始用PyMOL那会儿,我最大的困惑不是复杂的脚本怎么写,而是文件捣鼓来捣鼓去总出问题。PDB、SDF、MOL2,这么多格式,到底什么时候用哪个?怎么导入?怎么导出?

这章,我就把这些问题一个一个拆开讲清楚。咱们不搞花架子,只讲我这些年踩过的坑和总结出来的经验。

1. PyMOL的对象模型——先搞懂这个概念

在讲文件格式之前,我得先给你讲清楚PyMOL里的“对象”是什么。这概念搞明白了,后面所有操作都顺了。

我总结一下:

  • 对象:你打开一个文件,PyMOL会把它当作一个“对象”加载进来。比如 1ubq.pdb 加载后就成了一个对象,名字叫 1ubq。
  • 状态:一个对象可以有多帧,比如NMR结构或者动力学轨迹。每一帧就是一个“状态”。
  • 选择:这不是实际的文件单元,而是临时选中的一部分原子。比如 select my_sel, chain A 选择了A链的所有原子。

嗯,这里要注意:PyMOL里对文件的操作,本质上就是“创建对象”、“修改对象”、“删除对象”的过程。

提示: 我个人习惯在命名对象时加上前缀,比如 mol_1ubq,这样在复杂场景下不会搞混。特别是在同时加载几十个结构时,命名规范能救你命。

2. 常见的文件格式——我画了张表让你一眼看懂

你想想看,不同的文件格式就像不同的语言。PDB是“通用语言”,SDF是“化学语言”,MOL2是“药物设计语言”。

格式 扩展名 主要用途 优点 缺点
PDB .pdb 蛋白质、核酸结构 标准化程度高,通用性强 原子连接性信息不全
SDF .sdf / .mol 小分子、药物数据库 包含原子类型和键型,支持多分子 大文件时效率低
MOL2 .mol2 药物设计、对接结果 携带原子电荷和形式电荷 兼容性不如PDB
CIF/mmCIF .cif X射线晶体学 信息完整,承载量大 文件体积大
XYZ .xyz 简单分子、轨迹 格式简单,可读性好 不含键和原子类型信息

我在项目里遇到过这种情况:一个同事把对接结果文件存成了PDB格式,结果原子的电荷信息全丢了。后来我用MOL2重新导出才解决。所以,选对格式比什么都重要。

3. 文件导入——学会用 load 和 fetch

导入文件,说到底是给PyMOL塞数据。我最常用的命令有俩:load 和 fetch。

3.1 从本地加载文件

# 加载PDB文件
load /path/to/1ubq.pdb

# 加载SDF文件
load /path/to/ligand.sdf

# 加载MOL2文件
load /path/to/ligand.mol2

# 加载CIF文件
load /path/to/1ubq.cif

说白了,你给PyMOL一个文件路径,它就能自动识别格式。不过,我建议你手动指定文件类型,以防出问题:

# 显式指定格式
load /path/to/ligand.mol2, format=mol2
注意: PyMOL对文件扩展名很敏感。如果你的文件明明是个SDF,但扩展名是 .txt,PyMOL可能会认不出来。我曾经一个多小时都在纠结为什么文件加载不出来——最后发现就是改了个扩展名。

3.2 从网上下载PDB结构

fetch 命令可以直接从PDB数据库拉结构,省得你手动去网站下载。

# 从PDB下载结构
fetch 1ubq

# 下载后自动加载为对象

你还可以指定下载哪种格式:

# 下载PDB格式(默认)
fetch 1ubq, type=pdb

# 下载CIF格式(信息更完整)
fetch 1ubq, type=cif

我个人习惯用 type=cif,因为CIF文件里包含的元数据更多。不过,如果你只是简单展示结构,PDB完全够用。

3.3 多文件导入与合并

有时候你手里有多个PDB文件,想一次性搞定:

# 导入多个文件
load 1ubq.pdb, obj=protein
load ligand.pdb, obj=ligand

如果你想把多个对象合并成一个:

# 合并蛋白和配体对象
create complex, protein or ligand

这就是PyMOL的“捏合”操作。我经常在拼接对接结果时用,又快又直观。

4. 文件导出——保存你的成果

导出和导入有点像,但更讲究。保存成什么格式,要看你下一步干什么。

4.1 保存为PDB

最通用的导出方式:

# 保存当前选中的对象为PDB
save output.pdb, my_object

# 只保存选中的原子
save selection.pdb, my_selection

注意,PDB格式不会保存键的类型和原子电荷。如果你后续要跑分子动力学,最好别用PDB。

4.2 保存为SDF

保存小分子或药物库时用SDF:

# 保存为SDF
save ligand.sdf, ligand

# 设定保存键类型和电荷
save ligand.sdf, ligand, format=sdf

4.3 保存为MOL2

MOL2适合保存对接结果或配体:

# 保存为MOL2
save ligand.mol2, ligand

# 显式指定格式
save ligand.mol2, ligand, format=mol2

我曾经把一个对接结果保存成PDB,结果在另一个程序里打开时键类型全乱了。后来改用MOL2,问题迎刃而解。MOL2对键和电荷的描述非常精准。

4.4 保存为图像

虽然和文件格式没直接关系,但我还是想提一嘴:

# 保存为PNG图像
png output.png, dpi=300, width=800, height=600

导出图片时,分辨率设成300 dpi以上,这样放在文章里才清晰。

导出格式 场景 注意事项
PDB 结构分享、ICM/Chimera等通用工具 不含键型、电荷
SDF 小分子库、药物筛选、分子属性 支持多分子
MOL2 对接结果、电荷信息保留 文件体积略大
CIF 晶体学、完整元数据 复杂场景首选
PNG/SVG 论文、报告、PPT 分辨率设高一些

5. 文件格式之间的转换——一条命令搞定

有时候你手里只有一个SDF文件,但下游工具只认MOL2。怎么办?我告诉你一个捷径:用PyMOL作为中转站。

# 加载SDF
load ligand.sdf, ligand

# 保存为MOL2
save ligand.mol2, ligand

# 或者保存为PDB
save ligand.pdb, ligand

说白了,PyMOL就是你的格式翻译官。我曾经在项目中拿到一个只有SDF格式的配体库,但对接程序只吃MOL2,我一个批量脚本就搞定了上百个文件的转换:

# 批处理脚本示例
import glob
for sdf_path in glob.glob("ligands/*.sdf"):
    pdb_name = os.path.basename(sdf_path).replace(".sdf", ".mol2")
    cmd.load(sdf_path)
    cmd.save(f"mol2_output/{pdb_name}", "all")
    cmd.delete("all")

这个脚本帮我省了至少半天的手动操作时间。

关键点: 当你的工具链里要传递分子结构时,优先选择MOL2(保留电荷)或SDF(保留键型)。PDB适合快速分享,但不适合做计算。

6. 核心知识框架

我把这章的内容画成了一幅图。你看一眼就能明白整个逻辑:

PyMOL 文件导入导出核心流程 输入文件 PDB / SDF / MOL2 PyMOL 对象模型 对象 → 状态 → 选择 输出文件 PDB / SDF / MOL2 工具命令:load / fetch / save / create 实际场景:结构展示 / 对接结果 / 批量转换 格式选择建议 • 通用展示 → PDB • 药物设计 → MOL2 • 多分子库 → SDF 避坑指南 • 检查文件扩展名 • 使用显式格式参数 • 确认电荷信息完整
技巧: 如果你在文件导入时遇到“unknown file format”错误,别急着暴躁。先检查文件扩展名,然后手动指定格式参数:load yourfile, format=mol2。99%的情况都能搞定。

7. 实战案例:从PDB导入到导出高质量图片

好了,咱们来走一遍完整的流程。假设你刚在PDB数据库里看到一个感兴趣的蛋白结构。

  1. 加载结构: fetch 1ubq, type=pdb → 自动下载并加载
  2. 查看对象: show_as cartoon → 展示蛋白质的二级结构
  3. 选择配体: select ligand, resn LIG → 选中配体分子
  4. 导出配体为MOL2: save ligand.mol2, ligand → 保留电荷信息
  5. 导出配体为SDF: save ligand.sdf, ligand → 方便药物筛选
  6. 导出整张图: png result.png, dpi=300 → 高清成品

我在一次结构生物学合作项目中就是这么干的。对方需要一个配体的MOL2文件做MD模拟,我花了一分钟不到就把事办完了。他自己鼓捣了一上午没搞明白文件格式的事。

警告: 如果文件太大,比如几万个小分子的SDF,load 命令会加载所有分子。建议用 load 配合 state=1 只加载第一帧。否则你的电脑可能会“卡死”。我亲眼见过同事因此重启了五次软件。

8. 小结

文件格式这件事,说白了就是“选对格式,用对命令”。PDB适合日常分享,SDF适合多分子,MOL2适合计算,CIF适合完整数据。用PyMOL做中转站,你能把任何格式转换成你需要的格式。

嗯,我个人推荐新手上路多练练 load 和 fetch,再配合 save,很快就能搞定文件捣鼓这件事。