3、AlphaFold 输出文件结构:JSON、PDB、PAE 等归纳总结

好,咱们直接切入正题。

你跑完一次 AlphaFold,会吐出一堆文件。新手看了容易懵。“我到底该看哪个?”

我记得第一次跑完的时候,盯着文件夹里那十几个文件,确实有点发愣。后来做得多了,发现其实核心的就那么几类。搞清楚它们各自管什么,再用什么工具打开,后续分析就顺了。

输出文件夹长什么样

假设你的目标蛋白质序列叫 test.fasta。跑完后,AlphaFold 会生成一个以 test 命名的文件夹。里面大致包括:

  • ranked_0.pdb 到 ranked_4.pdb:5 个预测模型,按 pLDDT 分数排序
  • unrelaxed_model_*.pdb:未经能量优化的原始模型
  • result_model_*.pkl:Python 序列化文件,存了一堆内部数据
  • pae_model_*.json:预测对齐误差(PAE),JSON 格式
  • plddt_model_*.json:每个残基的 pLDDT 值,JSON 格式

嗯,看着挺多。但咱们一个一个拆开讲,其实没那么复杂。

我个人的习惯: 直接先看 ranked_0.pdb 和 pae_model_*.json。这两个基本能告诉你 80% 的信息。

PDB 文件:看得见的结构

PDB 是蛋白质数据银行的通用格式。说白了,就是一个记录原子坐标的文本文件。

你随便打开一个 ranked_0.pdb,看到的会是这样的内容:

ATOM      1  N   MET A   1       2.346   1.284   0.000  1.00  0.00           N
ATOM      2  CA  MET A   1       2.572   2.738   0.000  1.00  0.00           C
ATOM      3  C   MET A   1       3.688   3.218   0.000  1.00  0.00           C
ATOM      4  O   MET A   1       4.719   2.523   0.000  1.00  0.00           O
ATOM      5  CB  MET A   1       1.349   3.528   0.000  1.00  0.00           C
...
END

每一行代表一个原子。列的含义依次是:记录类型、原子序号、原子名称、残基名称、链 ID、残基序号、X/Y/Z 坐标、占有率、温度因子(B-factor)、元素符号。

这里有一个关键点:AlphaFold 把 pLDDT 值塞到了 B-factor 那一列。你看上面代码里那个“1.00”就是 B-factor 项。正常情况下它表示原子振动幅度,但在这里它被替换成了 pLDDT 分数。

这意味着:你用 PyMOL 或者 ChimeraX 打开 PDB 文件,直接按 B-factor 染色,就能看到模型的可信度分布。高 B-factor 是蓝色(可信),低 B-factor 是红色(不可信)。我项目中经常用这招快速定位哪些区域需要谨慎对待。

JSON 文件:藏在结构背后的数字

先说说 plddt_model_*.json。这玩意结构很简单,就是一个键值对:

{
    "plddt": [0.95, 0.93, 0.91, 0.88, 0.85, ...]
}

一个数组,每个元素对应一个残基的 pLDDT 分数。0 到 1 之间的浮点数。数字越大表示模型对这个残基的预测越自信。

那 pae_model_*.json 就更有意思了。它记录的是预测对齐误差(PAE),本质是一个矩阵:

{
    "predicted_aligned_error": [
        [0.0, 1.2, 3.5, 5.1, ...],
        [1.2, 0.0, 2.8, 4.3, ...],
        [3.5, 2.8, 0.0, 1.9, ...],
        ...
    ],
    "max_predicted_aligned_error": 31.8
}

这个矩阵的尺寸是 N×N,N 是残基总数。第 i 行第 j 列的值,表示如果以第 i 个残基为基准做结构对齐,第 j 个残基的位置偏差期望值(单位是 Ångström)。

为什么会这样?因为 PAE 能告诉你两个结构域之间的相对位置是否可靠。如果你看到一个区域内部 PAE 很低(比如小于 5),但跨区域的 PAE 很高(大于 15),说明 域内结构可靠,域间相对位置不可靠。这在多结构域蛋白分析中尤其重要。

曾经有个学生问我:“PAE 和 pLDDT 不是差不多的东西吗?” 还真不是。pLDDT 是局部的自信度,每个残基一个分。PAE 是成对的误差估计,描述了残基对之间的相对位置精度。两者配合看,才能全面评判一个模型。

知识结构表:一目了然

我习惯把这几种输出文件做个对比,用起来心里踏实:

文件类型 核心内容 维度 用途 我一般怎么用
ranked_0.pdb 原子坐标 + B-factor(pLDDT) 三维坐标,L 个残基 可视化和结构分析 直接扔进 PyMOL,按 B-factor 上色
plddt_model_*.json 每个残基的 pLDDT 分数 L 维向量 定量评估局部可信度 画线图看整体趋势,找低分区域
pae_model_*.json 残基对之间的预测对齐误差 L×L 矩阵 判断域间相对位置可靠性 画热力图,看棋盘格纹理
result_model_*.pkl Python 对象的完整转储 复杂嵌套结构 高级编程分析或可视化 用 Python 直接读取,做批量统计

核心逻辑图

下面这个 SVG 图,把 AlphaFold 输出文件的组织方式和核心分析路径画清楚了。你看懂了它,以后处理结果就不迷路。

AlphaFold 输出文件核心结构图 AlphaFold 输出 ranked_*.pdb B-factor = pLDDT PyMOL 染色 plddt_*.json 每个残基 0~1 分 画线图 pae_*.json L×L 矩阵 热力图 综合判断:pLDDT + PAE + 可视化 三者缺一不可

避坑指南

  • PKL 文件怎么读? 用 Python 的 pickle 模块。但我提醒你,跨版本可能不兼容。如果你在 Colab 上跑的结果,下载到本机可能打不开。这时候用 AlphaFold 自带的 relaxation.py 或者干脆忽略 PKL,只看 JSON 和 PDB。
  • 别被文件名误导。 ranked_0.pdb 不一定是“最好”的模型——它只是 pLDDT 最高的那个。实际上 ranking 是基于 pLDDT 和 PAE 的某种加权。我见过一个多结构域蛋白,ranked_0 的 PAE 反而比 ranked_1 高不少,域间定位错误。
  • PAE 值不是可互换的。 不同模型之间的 PAE 矩阵不能直接取平均。它们是基于不同构象空间做的估算。

一个小实操

如果你有 Python 环境,跑下面几行代码,就能把 PAE 矩阵画成热力图:

import json
import matplotlib.pyplot as plt
import numpy as np

with open('pae_model_0.json', 'r') as f:
    data = json.load(f)

pae_matrix = np.array(data['predicted_aligned_error'])
plt.imshow(pae_matrix, cmap='viridis', vmin=0, vmax=data['max_predicted_aligned_error'])
plt.colorbar(label='Predicted Aligned Error (Å)')
plt.xlabel('Residue index')
plt.ylabel('Residue index')
plt.title('PAE Heatmap')
plt.show()

嗯,运行完你会看到一个热力图。如果图里面有清晰的“棋盘格”纹理,说明你的蛋白有多个结构域,而且域间的相对位置可能不太确定。如果整张图都是深紫色(低 PAE),那恭喜你,整个模型都挺靠谱的。

我经常这么干:把 ranked_0 到 ranked_4 的 PAE 都画出来对比。有时候 ranked_3 虽然 pLDDT 低一点,但 PAE 却更规整。这时候我会更偏向用 ranked_3 做后续对接或分子动力学模拟。

好了,AlphaFold 的输出文件就这些。你只要记住:PDB 管看,JSON 管算,PAE 管信。后面的章节里,我们会深入看每一类数据的具体用法。