3. 蛋白质结构数据库与AlphaFold预测结果解读
做药物发现的,天天跟蛋白质结构打交道。
以前拿到一个新靶点,第一反应是去PDB里翻一翻。翻到了,皆大欢喜。翻不到?那就只能做同源模建,或者试试NMR、冷冻电镜——周期长、成本高,还不一定成功。我早年做过一个激酶项目,PDB里只有不完整的apo结构,硬是靠着同源模建凑合了半年,结果AlphaFold一出来,直接把完整的激活态结构预测好了。说实话,当时心情挺复杂的。
3.1 PDB数据库:金标准与局限性
PDB(Protein Data Bank)是目前最权威的实验结构数据库。到2024年,它存了超过20万个结构。这些结构来自X射线晶体学、NMR、冷冻电镜。它们是药物发现的基石——对接、虚拟筛选、结合自由能计算,都依赖它。
但PDB有个现实问题:覆盖率严重不足。
我举几个数字你就明白了:人类蛋白质编码基因大约2万个,PDB里有人类结构的不到1/3。而且,很多结构是截短的、缺失loop的、或者跟小分子共结晶的复合体。你辛辛苦苦找到一个新靶点,大概率在PDB里找不到高质量的结构。
下面这个表格总结了PDB的常见限制:
| PDB结构的常见问题 | 对药物发现的影响 |
|---|---|
| 缺少apo/未结合状态结构 | 无法准确模拟天然构象 |
| 分辨率不够(>3.5 Å) | 侧链位置不准确,影响对接精度 |
| loop区缺失或无序 | 结合口袋完整性受影响 |
| 仅提供截短结构域 | 无法研究全蛋白功能 |
| 有晶体堆积效应 | 构象可能偏离溶液状态 |
我个人习惯的做法是:先用PDB。能找到分辨率2.5 Å以内的同源结构,那就直接用它。找不到?或者目标跟模板序列一致性低于30%?嗯,这时候就该AlphaFold上场了。
3.2 AlphaFold预测结果的核心指标
AlphaFold的预测结果,不只是输出一个3D坐标文件。它附带了两个关键的可信度指标:pLDDT 和 PAE。
很多新入行的朋友只看结构本身,不看置信度。我在项目里踩过这个坑——拿着一个pLDDT很低的预测结构去做对接,结果筛选出来的化合物全是假阳性。
3.2.1 pLDDT:局部置信度
pLDDT(predicted Local Distance Difference Test)是一个0-100的分数。它表示每个残基的预测坐标跟真实结构的偏差程度。
一般来说:
- pLDDT > 90:高度可信。相当于X射线衍射分辨率在2.0-2.5 Å的结构。
- 70 < pLDDT < 90:整体骨架可信,但侧链可能有偏差。
- 50 < pLDDT < 70:只有低层级的拓扑结构可信,不适合做基于结构的药物设计。
- pLDDT < 50:无序区域或预测失败。
我曾经处理过一个GPCR靶点,AlphaFold输出了它所有loop区的pLDDT。结果发现,有一个胞外loop的pLDDT只有45。后来我们用分子动力学模拟跑了一下,那个区域果然是高度柔性的。所以,pLDDT低的地方,就别强行去对接受体了。
3.2.2 PAE:域间置信度
PAE(Predicted Aligned Error),是一个成对残基的误差矩阵。它告诉你,如果你把两个残基叠在一起,它们之间的预测误差有多大。
PAE的关键用途:判断结构域之间的相对位置是否可信。
假如你有一个多结构域的蛋白。pLDDT可能显示每个结构域内部都不错(>85),但PAE显示结构域之间的PAE值很高(>10 Å)。这说明,AlphaFold能准确预测每个结构域的内部折叠,但它不知道这些结构域之间怎么摆放。
这对药物发现很重要。如果一个结合口袋跨越两个结构域,而这两个结构域的PAE很高,那你拿这个全蛋白结构去做对接,很可能得到错误的构象。
result_model_*.pkl 文件,用Python加载PAE矩阵,可以快速判断多结构域蛋白的构象不确定区域。
3.3 从PDB到AlphaFold:知识体系图
下面的SVG图,我看是帮你梳理从PDB到AlphaFold预测结果的应用链条。嗯,对照着看,应该会清晰很多。
3.4 如何解读AlphaFold的预测文件
结构预测文件和置信度文件,是同时产生的。我来带你看看关键文件的内容。
3.4.1 主要输出文件
用AlphaFold2跑完一个单链预测后,你会得到类似这样的目录结构:
alphafold_output/
├── ranked_0.pdb # 最佳模型(按整体pLDDT排序)
├── ranked_1.pdb # 次佳模型
├── ranked_2.pdb #
├── ranked_3.pdb #
├── ranked_4.pdb # 第五名模型
├── unrelaxed_model_*.pdb # 未能量最小化的原始输出
├── result_model_*.pkl # 包含pLDDT和PAE的pickle文件
└── predicted_aligned_error.json # 人类可读的PAE矩阵
我个人习惯,在药物发现项目中,至少保留ranked_0到ranked_2这三个模型。因为AlphaFold的采样会生成多种可能的构象,尤其是柔性loop和结构域相对位置,不同rank之间可能有差异。保留多个模型,可以帮你评估构象多样性。
3.4.2 解析pLDDT分数
pLDDT直接存储在PDB文件的B-factor列里。你可以用任何PDB查看器,按B-factor着色,就能看到每个残基的可信度。
也可以用脚本批量提取:
from Bio import PDB
parser = PDB.PDBParser(QUIET=True)
structure = parser.get_structure("target", "ranked_0.pdb")
plddt_per_residue = {}
for model in structure:
for chain in model:
for residue in chain:
# B-factor列就是pLDDT
plddt = residue["CA"].get_bfactor()
plddt_per_residue[residue.id[1]] = plddt
# 打印平均pLDDT
avg_plddt = sum(plddt_per_residue.values()) / len(plddt_per_residue)
print(f"Mean pLDDT: {avg_plddt:.2f}")
我在做虚拟筛选之前,一定会先算一下结合口袋周围的平均pLDDT。如果低于70,我就不敢用。你想想看,如果口袋本身都是低置信度区域,那筛选结果大概率是噪声。
3.4.3 解析PAE矩阵
PAE是一个N×N的矩阵,N是残基总数。PAE[i][j]表示,如果你把残基i对齐,残基j的预测坐标误差有多大。
我建议关注两点:
- 域内PAE:通常很低(<3 Å)。说明结构域内部折叠稳定。
- 域间PAE:如果>8 Å,说明这些结构域之间的相对位置不可信。
下面是一段解析PAE的代码,你可以快速生成一个热图:
import json
import numpy as np
import matplotlib.pyplot as plt
with open("predicted_aligned_error.json") as f:
data = json.load(f)
pae = np.array(data["predicted_aligned_error"])
# pae.shape: (N, N)
# 打印域间PAE的平均值(比如残基1-100和残基200-300之间)
domain1 = slice(0, 100)
domain2 = slice(200, 300)
inter_domain_pae = pae[domain1, domain2].mean()
print(f"域间平均PAE: {inter_domain_pae:.2f} Å")
3.5 结构化数据读取的技巧
AlphaFold的pickle文件(.pkl)是Python序列化格式,包含了完整的预测数据。你可以用下面的方式加载:
import pickle
with open("result_model_1.pkl", "rb") as f:
data = pickle.load(f)
plddt = data["plddt"] # 形状: (N,)
pae = data["predicted_aligned_error"] # 形状: (N, N)
我项目里的做法是,写一个简单的函数,输出每个结构域的平均pLDDT和域间PAE。这样可以快速决定:这个AlphaFold结构,值不值得花时间做后续处理。
3.6 避坑指南:实战经验总结
- 不要只看整体pLDDT。整体pLDDT可能很高(85),但结合口袋区域的pLDDT可能只有60。一定要检查结合位点附近的局部置信度。
- 多模型对比。AlphaFold的5个模型可能给出不同的构象。我通常把5个模型都保留下来,做聚类分析,找到最可能的构象集合。
- PAE是域间定位的关键。曾经有一个多结构域磷酸酶项目,pLDDT全链80以上,但PAE显示域间误差12 Å。最终我们用了AlphaFold的预测结构做多构象对接,而不是单个结构。
- 不信任低pLDDT区域的侧链。即使主链位置大概正确,低pLDDT区域的侧链方向也经常是错的。做对接时,建议把这些区域的侧链设为柔性,或者用Rotamer库优化。