☰
AlphaFold 结果落地实战:从 ranked_0.pdb 到置信度报告
2026/9/27 13:16:51 网站建设 项目流程

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 个常见现象

  1. 你看到:目录里只有一个 relaxed 文件,却有 5 个 PDB。默认--models_to_relax=best只松弛置信度最高的模型,其余全是 unrelaxed。重跑加--models_to_relax=all,或者接受只有 ranked_0 带氢。
  2. 你看到:某个工具的元数据解析直接报错或提示缺少标题。AlphaFold 的 unrelaxed PDB 只有 MODEL/ATOM/TER/ENDMDL/END 五类行,没有 HEADER;relaxed 文件由 Amber 写出,是完整 PDB。依赖 HEADER 的工具请换用 relaxed 文件,或自行补写。
  3. 你看到:B 因子列全是 0-100 的数,下游抱怨数值越界。那一列是 pLDDT 不是温度因子。需要真实 B 因子的工具先把该列清零,或改用别的置信度来源。
  4. 你看到:自己解析含修饰残基的 PDB 时残基悄悄变成 UNK、原子数对不上。仓库内解析器会把非标准残基转为 UNK、忽略非标准原子(见 protein.py 源码 的from_pdb_string文档)。分析前先统计并排除 UNK。
  5. 你看到: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.jsonn×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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询