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
.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")
这个脚本帮我省了至少半天的手动操作时间。
6. 核心知识框架
我把这章的内容画成了一幅图。你看一眼就能明白整个逻辑:
load yourfile, format=mol2。99%的情况都能搞定。
7. 实战案例:从PDB导入到导出高质量图片
好了,咱们来走一遍完整的流程。假设你刚在PDB数据库里看到一个感兴趣的蛋白结构。
- 加载结构:
fetch 1ubq, type=pdb→ 自动下载并加载 - 查看对象:
show_as cartoon→ 展示蛋白质的二级结构 - 选择配体:
select ligand, resn LIG→ 选中配体分子 - 导出配体为MOL2:
save ligand.mol2, ligand→ 保留电荷信息 - 导出配体为SDF:
save ligand.sdf, ligand→ 方便药物筛选 - 导出整张图:
png result.png, dpi=300→ 高清成品
我在一次结构生物学合作项目中就是这么干的。对方需要一个配体的MOL2文件做MD模拟,我花了一分钟不到就把事办完了。他自己鼓捣了一上午没搞明白文件格式的事。
load 命令会加载所有分子。建议用 load 配合 state=1 只加载第一帧。否则你的电脑可能会“卡死”。我亲眼见过同事因此重启了五次软件。
8. 小结
文件格式这件事,说白了就是“选对格式,用对命令”。PDB适合日常分享,SDF适合多分子,MOL2适合计算,CIF适合完整数据。用PyMOL做中转站,你能把任何格式转换成你需要的格式。
嗯,我个人推荐新手上路多练练 load 和 fetch,再配合 save,很快就能搞定文件捣鼓这件事。