蛋白质结构数据资源(PDB)

做口袋识别,第一步就是找结构数据。PDB全称叫Protein Data Bank,说白了就是一个蛋白质结构的“档案馆”。我刚开始做这个方向时,还以为PDB只是个简单的文件仓库,后来才发现——嗯,这里面的门道不少。

你想想看,全球实验测出来的蛋白质结构,绝大部分都存这儿。从X射线衍射到冷冻电镜,再到核磁共振,PDB都收。我们现在要做的,就是知道怎么从里面“捞”出想要的数据。

PDB 到底是个什么库?

PDB 建于 1971 年,最初只有 7 个结构。现在?超过 20 万条记录了。我个人习惯把它当“结构领域的主干数据库”,几乎所有口袋识别任务,数据源都是它。

每条结构记录有一个唯一的 PDB ID,4 位字符。比如 1a1e、4pep、7b3c。你可以通过这些 ID 直接下载结构文件。

核心概念:PDB 里的“结构记录”不等于“一个蛋白质”。一条记录可能包含多个链、配体、水分子甚至核酸。你要找口袋,就要学会拆分和选择。

PDB 数据仓库的“来世今生”

PDB 数据库这些年经历了巨大的增长。我记得当初做药物设计时,手上能用的高分辨率结构就那么几个,现在同一个靶点可能有几十上百个结构可选。下表展示了几个关键里程碑:

年代结构数量(约)主要方法
19717X 射线
1990500+X 射线、NMR
200013,000+X 射线、NMR
201060,000+X 射线、NMR、冷冻电镜起步
2020170,000+冷冻电镜爆发
2024220,000+冷冻电镜 + AI 辅助

看到这个增长曲线,你就能理解——学会在PDB里“淘金”有多重要。

PDB 文件长什么样?

PDB 官方提供了两种常用格式:.pdb 和 .cif(mmCIF)。前者是传统文本格式,每行固定宽度;后者是更现代的键值对格式,信息更完整。

我在项目中遇到过一种情况:用 .pdb 格式读到的配体原子坐标不全,换成 .cif 就好了。所以我建议你尽量用 mmCIF 格式做批处理。

一个典型的 .pdb 文件片段是这样的:

ATOM      1  N   ALA A   1      12.345  45.678  23.901  1.00 15.23           N
ATOM      2  CA  ALA A   1      13.456  46.789  24.012  1.00 14.89           C
ATOM      3  C   ALA A   1      14.567  47.890  24.123  1.00 14.56           C
ATOM      4  O   ALA A   1      14.678  48.901  24.234  1.00 14.23           O
ATOM      5  CB  ALA A   1      12.345  47.123  22.345  1.00 15.01           C

每列都有固定含义:原子序号、原子名称、残基名称、链标识、残基序号、x/y/z 坐标、占有率、温度因子、元素符号。看不懂?没关系。做口袋识别,我们一般用 Biopython 或 ProDy 这类库来解析,不需要手写解析器。

从 PDB 批量下载——避坑指南

我曾经因为手写了一个爬虫去批量下载PDB文件,结果被服务器封了 IP。后来才知道,PDB 官方提供了专门的批量下载工具和 API。

推荐的方法有两种:

  1. 命令行 wget/rsync 同步:PDB 在多个镜像站点开放了 rsync 服务,非常适合全库同步或大范围筛选。
  2. REST API 按 ID 拉取:适合你知道具体 PDB ID 列表的场景。

下面是我常用的拉取方式,先下载一个 mmCIF 文件:

wget https://files.rcsb.org/download/4pep.cif

如果有多个 ID,可以写个简单的 Shell 循环:

for id in 4pep 1a1e 7b3c 2g5r; do
    wget "https://files.rcsb.org/download/${id}.cif"
done

注意:别一次性并发太多请求,我建议加个 sleep 0.5 控制频率,避免触发反爬机制。

数据质量——不是所有结构都能用

你从 PDB 下载一个结构,不等于它“能用”。做口袋识别前,一定要评估结构质量。我总结了几个关键指标:

  • 分辨率:X 射线和冷冻电镜结构的核心指标。一般要求 ≤ 3.0 Å,最好 ≤ 2.5 Å。分辨率太高,摸不到口袋细节。
  • R 因子 / R free:反映实验模型与数据的吻合度。通常 R free ≤ 0.3 算可接受。
  • 完整度:看结构是否有缺失的 loop 或侧链。缺失太多,口袋边界会失真。
  • 配体存在:如果你要研究特定配体结合的口袋,确保结构里有完整的配体分子。
注意:有些 PDB 结构虽然有高分辨率,但是配体位置被解析得一塌糊涂。我遇到过配体坐标与电子密度完全不匹配的坑,后来养成了每次使用前过一遍电子密度的习惯。

用工具看一眼结构

下载了结构,别急着跑计算。我建议你先可视化确认——你看,一个简单的操作能筛掉一半问题结构。

推荐几个轻量级方案:

  • PyMOL:经典,脚本可控,适合批量处理。
  • UCSF ChimeraX:新一代,交互好,适合快速检查。
  • NGL Viewer(网页版):不需要安装,适合临时看结构。
我的习惯:拿到一个新结构的 PDB ID,先通过 rcsb.org 的页面预览图扫一眼,看整体折叠和配体是否存在。确认没问题了,再下载本地做口袋分析。这样能避免无意义的计算。

知识体系总览

PDB 数据获取与质量评估流程 搜索与ID解析 PDB ID / 序列 / 关键词 文件获取 PDB / mmCIF ± 镜像 质量评估 分辨率 / R因子 / 完整度 可视化验证 PyMOL / ChimeraX / NGL 口袋识别 几何 / 能量 / 进化 结构准备 去水 / 补缺失 / 加氢 口袋坐标 + 验证报告 可用于后续虚拟筛选 / 药物设计

从上图能看到整个流程是串联的:拿到 ID 后获取文件,然后做质量筛查,通过可视化和口袋识别两个分支并行推进,最后汇总到结构准备步骤。我建议你严格按照这个顺序来做,能省不少返工时间。

实战:用 Python 批量抓 PDB

说了这么多,来点真家伙。下面这段代码是我在一个化合物筛选项目中用过的,用来从指定 ID 列表批量下载 mmCIF 文件并做简单质量筛选:

import requests
import os

pdb_ids = ["4pep", "1a1e", "7b3c", "2g5r"]
out_dir = "./cif_files"
os.makedirs(out_dir, exist_ok=True)

base_url = "https://files.rcsb.org/download/"
for pid in pdb_ids:
    url = f"{base_url}{pid}.cif"
    r = requests.get(url, timeout=10)
    if r.status_code == 200:
        with open(os.path.join(out_dir, f"{pid}.cif"), "wb") as f:
            f.write(r.content)
        print(f"OK: {pid}")
    else:
        print(f"FAIL: {pid} (status {r.status_code})")
小建议:实际项目中我还会在下载后自动解析 _refine.ls_d_res_high 字段,提取分辨率信息,低于 3.5 Å 的直接标记“待重选”。你看,把质量评估前移,能大幅减少后续计算量的浪费。

到这里,你应该对 PDB 的结构数据获取有了清晰的路线图:哪个格式更可靠、怎么批量拉、质量怎么筛、可视化怎么辅助判断。掌握了这些,后面做口袋识别就不怕“巧妇难为无米之炊”了。