AlphaFold 结果落地实战:从 ranked_0.pdb 到置信度报告
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
预测跑完,output/<fasta_name>/里躺着ranked_0.pdb到ranked_4.pdb、几个unrelaxed_model_*.pdb和一堆confidence_*.json。用 PyMOL 打开 PDB 能看到结构,但"这个结构能不能用、哪一段可信",文件里没写。这篇讲怎么把 AlphaFold 输出文件里的置信度和结构信息取出来用起来,20 分钟:先打开正确的文件,再用三行代码读出一个数,最后输出一句能写进实验记录的置信度结论。
⚡ 最短路径:30 秒打开正确的 PDB
默认只需要看一个文件:ranked_0.pdb,即置信度最高的模型。
# 代码不在本地时先拉取 git clone https://gitcode.com/GitHub_Trending/al/alphafold # 结果目录名 = FASTA 文件基名 ls output/<fasta_name>/ head -3 output/<fasta_name>/ranked_0.pdb输出前三行是MODEL 1加两条 ATOM 行,文件有效。丢进 PyMOL 或 ChimeraX,30 秒完成一次正反馈。后面各节回答"这个结构哪部分可信"。
🔍 核心机制:结果目录为什么长这样
为什么 pLDDT 藏在 B 因子列里
PDB 是定长列的文本格式,标准结构文件里 B 因子列(61-66 列)存热运动参数,预测结构里这个参数没有实际意义。AlphaFold 把它当"备用插槽":逐残基 pLDDT(逐残基预测置信度,0-100)直接写进 B 因子列,并复制到该残基每个原子上。所有现成查看器的"B 因子着色"功能因此自动变成置信度着色,零改造成本。[1]
# run_alphafold.py:把逐残基 pLDDT 广播到该残基全部原子的 B 因子 plddt_b_factors = np.repeat(plddt[:, None], residue_constants.atom_type_num, axis=-1)副作用要知道:这一列的数值是置信度,不是温度因子。直接交给期待真实 B 因子的下游工具(比如分子动力学初始化)属于误用。
📎 此处建议放置:PyMOL 按 B 因子着色的 ranked_0.pdb 截图(cartoon 表示,低置信蓝 → 高置信红)
为什么有 unrelaxed、relaxed、ranked 三套文件名
网络直接产出的是unrelaxed_model_X.pdb:只有重原子、没有氢、可能有立体冲突。松弛阶段(Amber 力场最小化)加氢并去除冲突,产出relaxed_model_X.pdb。默认只松弛置信度最高的一个模型(--models_to_relax=best),其余保持 unrelaxed。
ranked_<idx>.pdb是按 ranking_confidence 重排序后的拷贝:
# ranked_<idx>.pdb:松弛过就取松弛版,没松弛就取 unrelaxed 版 if model_name in relaxed_pdbs: f.write(relaxed_pdbs[model_name])实践含义:结构工作用ranked_0.pdb,比较松弛前后差异才去碰unrelaxed_*。松弛后代码会把原始 pLDDT 重新写回 B 因子列,置信度不会丢失。
三种 JSON 各管什么
confidence_model_X.json:每个残基的编号、pLDDT 分数、类别三元组。类别固定四档:D <50、L 50-70、M 70-90、H ≥90,分界定义见 confidence.py 源码。pae_model_X.json:n×n 的 PAE(Predicted Aligned Error,残基间对齐偏差的期望值)矩阵加最大值,PAE 热图的数据源。[2]ranking_debug.json:各模型排序分数(plddts 或 iptm+ptm)与最终名次,"ranked_0 到底是谁"不透明时先查它。
另有result_model_X.pkl(模型原始输出)和timings.json(各阶段耗时),一般只在排错时需要。
🛠 递进式动手:从一个数到一句结论
以下代码基于 monomer 预设的输出;multimer 的模型名带后缀,以目录实际文件名为准。
三行从 PDB 读出 pLDDT 均值
# pip install biopython numpy matplotlib from Bio.PDB import PDBParser struct = PDBParser(QUIET=True).get_structure('af', 'output/<fasta_name>/ranked_0.pdb') # 取 CA 原子作为残基代表,B 因子列即 pLDDT bfactors = [res[atom].get_bfactor() for model in struct for chain in model for res in chain for atom in res if atom == 'CA'] print(f'残基数: {len(bfactors)}, pLDDT 均值: {sum(bfactors)/len(bfactors):.1f}')核心就是取 CA 的 B 因子再求平均。均值高于 80 通常说明整体高置信;低于 70 时逐残基曲线更有信息量,直接进下一级。
画一张 pLDDT 轮廓曲线
import matplotlib matplotlib.use('Agg') # 服务器无显示环境 import matplotlib.pyplot as plt from Bio.PDB import PDBParser struct = PDBParser(QUIET=True).get_structure('af', 'output/<fasta_name>/ranked_0.pdb') bfactors = [res[atom].get_bfactor() for model in struct for chain in model for res in chain for atom in res if atom == 'CA'] plt.figure(figsize=(10, 4)) plt.plot(bfactors, lw=1) for y in (90, 70, 50): # pLDDT 类别分界线 plt.axhline(y, ls=':', color='gray', lw=0.8) plt.xlabel('Residue'); plt.ylabel('pLDDT'); plt.ylim(0, 100) plt.title('ranked_0.pdb per-residue confidence'); plt.tight_layout() plt.savefig('plddt_profile.png', dpi=120)📎 此处建议放置:上面代码生成的 pLDDT 轮廓曲线(蓝线一条 + 50/70/90 三条灰点线,低置信区段明显下探)
曲线上"塌下去"的位置,就是"哪里不可信"的答案。整段落在 D 区的长尾常是无序区,对接或表位分析时那段坐标要谨慎使用。
一句话写出能进实验记录的置信度结论
能进记录的 QC 不该是一个均值,而是类别占比 + PAE。我第一版脚本只算了均值,被它坑过:均值 81,但尾端有一段 60 个残基的 D 区,那段恰好是结合区。
import json from collections import Counter with open('output/<fasta_name>/confidence_model_5.json') as f: conf = json.load(f) cats = Counter(conf['confidenceCategory']) n = len(conf['residueNumber']) try: # PAE json 并非每个预设都有 with open('output/<fasta_name>/pae_model_5.json') as f: pae = json.load(f)[0]['predicted_aligned_error'] diag = sum(p[i][i] for i in range(len(pae))) / n extra = f', PAE 对角线均值 {diag:.1f} A' except FileNotFoundError: print('Warning: 未找到 pae json,仅按 pLDDT 判定') extra = '' level = 'high' if cats['H']/n > 0.9 else 'medium' if cats['H']/n > 0.7 else 'low' print(f'结论: H {cats["H"]/n:.0%} / M {cats["M"]/n:.0%} / L {cats["L"]/n:.0%} / D {cats["D"]/n:.0%}{extra}, 整体可信度: {level}')输出行可直接抄进实验记录,例如"H 92% / M 6% / L 1% / D 1%, PAE 对角线均值 2.1 Å, 整体可信度: high"。注意文件名里的模型号和 ranked_0 的来源模型未必一致:ranking_debug.json的order字段第一个元素才是 ranked_0 的出处,把文件名里的模型号替换成它。
⚠️ 高频踩坑:打开 PDB 时的 5 个常见现象
- 你看到:目录里只有一个 relaxed 文件,却有 5 个 PDB。默认
--models_to_relax=best只松弛置信度最高的模型,其余全是 unrelaxed。重跑加--models_to_relax=all,或者接受只有 ranked_0 带氢。 - 你看到:某个工具的元数据解析直接报错或提示缺少标题。AlphaFold 的 unrelaxed PDB 只有 MODEL/ATOM/TER/ENDMDL/END 五类行,没有 HEADER;relaxed 文件由 Amber 写出,是完整 PDB。依赖 HEADER 的工具请换用 relaxed 文件,或自行补写。
- 你看到:B 因子列全是 0-100 的数,下游抱怨数值越界。那一列是 pLDDT 不是温度因子。需要真实 B 因子的工具先把该列清零,或改用别的置信度来源。
- 你看到:自己解析含修饰残基的 PDB 时残基悄悄变成 UNK、原子数对不上。仓库内解析器会把非标准残基转为 UNK、忽略非标准原子(见 protein.py 源码 的
from_pdb_string文档)。分析前先统计并排除 UNK。 - 你看到:relaxed 文件上跑通的脚本,换 unrelaxed 就 KeyError 氢原子。unrelaxed 没有氢,氢是松弛阶段加上的。结构脚本统一用 relaxed/ranked 文件,unrelaxed 只做重原子分析。
📐 决策与延伸:什么下游用哪个文件
这张表回答"结构从哪里取、置信度从哪里取":
| 文件 | 内容 | 适合 | 备注 |
|---|---|---|---|
ranked_0.pdb | 置信度最高模型(松弛过则含松弛版) | 可视化、对接准备 | 默认选择,带氢 |
unrelaxed_model_X.pdb | 网络原始输出 | 对比松弛前后差异 | 无氢 |
confidence_model_X.json | 逐残基 pLDDT + D/L/M/H | 自动化 QC | 纯 JSON 免解析器 |
pae_model_X.json | n×n PAE 矩阵 | 域间/界面判断 | multimer 的主文件 |
relax_metrics.json | 剩余立体冲突统计 | 检查松弛质量 | 只有做了松弛才有 |
一句话决策:只做 QC 就读 confidence json;做结构工作拿 ranked_0.pdb;分析 multimer 界面加读 pae json。解析库用 biopython 读 PDB 足够;同名的 .cif 文件(MMCIF 格式,PDB 的继任标准格式)[3] 只在下游工具不认 PDB、或需要实体级元数据时用。
今晚就能做:用上一节第 2 级代码对你自己的ranked_0.pdb跑一遍,保存plddt_profile.png,再把均值和一句"H 区占比 XX%,整体可信度高/中/低"写进记录。
脚注:
[1] Jumper J, et al. Highly accurate protein structure prediction with AlphaFold. Nature 596, 583-589 (2021).
[2] Varadi M, et al. AlphaFold Protein Structure Database: massively expanding the structural coverage of protein-sequence space with high-accuracy models. Nucleic Acids Res 50, D439-D444 (2022).
[3] wwPDB. The mmCIF (Macromolecular Crystallographic Information File) format, 蛋白质数据库标准存档格式。
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考