AlphaFold PDB/MMCIF 输出文件解读指南:3 步从 ranked_0.pdb 拿到坐标、pLDDT 并交付下游
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
蛋白质结构预测任务跑完,输出目录里躺着十几个名字相近的文件:哪个才是最终结构,哪个该交给对接软件,置信度又写在哪?这篇指南基于 AlphaFold 开源仓库的真实代码,带你解读并处理它的 PDB/MMCIF 输出文件——先判断预测可不可信,再提取坐标与 pLDDT,最后把结构文件交给下游工具。
📁 先看哪个文件:输出目录速查
预测完成后,每条序列的结果存放在--output_dir下以 FASTA 文件名命名的子目录里。单体预设会跑 5 个模型(model_1 到 model_5),多聚体预设的模型名会带上_multimer_v3和_pred_i后缀。不管落在哪种情况,对着这张表选文件就行:
| 文件 | 什么时候打开它 |
|---|---|
ranked_0.pdb/ranked_0.cif | 绝大多数场景的最终答案:置信度最高的模型,坐标加 pLDDT 直接可用 |
ranked_1~4.pdb | 想看不同模型之间是否一致、稳不稳 |
relaxed_model_X.pdb/.cif | 想要某个指定模型经 Amber 最小化并加氢后的版本 |
unrelaxed_model_X.pdb/.cif | 想看模型直接输出的"原始"结构 |
confidence_model_X.json | 要按残基取 pLDDT 数值时 |
pae_model_X.json | 多聚体、判断结构域间关系稳定与否时 |
ranking_debug.json | 想知道 ranked_0 为什么排第一 |
features.pkl/result_model_X.pkl | 要复用中间特征、复算或重跑下游 |
timings.json/relax_metrics.json | 排查各步骤耗时和最小化质量 |
有个细节会影响你后续的选择:ranked_*按ranking_confidence排序,多聚体预设下这个值由 iPTM 和 pTM 组成,单体预设下则是 pLDDT。默认参数下只有排名第一的模型会做 Amber 最小化(--models_to_relax=best),所以ranked_0.pdb正是它的最小化版本,ranked_1~4则是未松弛的。打开任何一个文件前,先记住一件事:pLDDT 分数就藏在"温度因子(B 因子)"那一列里。
🎯 预测结果能不能用:pLDDT 与 PAE 质量门禁
上图是 AlphaFold 在 CASP14 中的预测与实验结构对比——任何预测的终极目标就是这种吻合度,而你跑完任务要做的第一件事,是快速判断这次离它有多远。
pLDDT 是逐残基的置信度分数,范围 0–100。仓库在 confidence.py 里把它分成四档:低于 50 为 very low,50–70 为 low,70–90 为 confident,90 以上为 very confident。PDB 文件里,这个分数被重复写到该残基每个重原子的 B 因子列中,所以可视化时"按 B 因子着色"其实就是在按 pLDDT 着色。PAE 是一个残基 × 残基的矩阵,给出对齐后的期望距离误差(Å),只有带 PAE 头的模型才会写出它(多聚体预设是典型情况):看对角块能判断结构域内部的可靠程度,多聚体的话,非对角块就是链间关系的置信度。
检查顺序建议"先看图、再取数":用 PyMOL 打开ranked_0.pdb按 B 因子着色,整体偏红黄说明整体质量不错,出现大片蓝色就说明要重点审视那段低置信区。视觉上过了关,再用 json 把数字落到报告里:
import json, numpy as np conf = json.load(open('model_1/confidence_model_1.json')) scores = np.array(conf['confidenceScore']) print(f"平均 pLDDT {scores.mean():.1f},≥90 占比 {(scores >= 90).mean():.0%}") for cat in ('very low', 'low', 'confident', 'very confident'): print(f" {cat}: {sum(c == cat for c in conf['confidenceCategory'])}") pae = np.array(json.load(open('model_1/pae_model_1.json'))[0]['predicted_aligned_error']) print(f"PAE 整体均值 {pae.mean():.1f} Å,对角(域内)均值 {np.diagonal(pae).mean():.1f} Å")其中confidenceScore就是逐残基 pLDDT(残基号从 1 开始);输出目录里没有 PAE json 时,说明当前预设的模型不带 PAE 头,属于正常现象而不是出错。
🔬 怎么取坐标和 pLDDT:PDB 与 MMCIF 两个最小示例
两种格式装的是同一份结构,差别只在容器:PDB 是定宽列,ATOM 记录里依次有原子名、残基三字母码、链 ID、残基序号、xyz 坐标、占有率、B 因子;MMCIF 是键值对,原子信息集中在_atom_site类别,label_asym_id是链、label_seq_id是残基序号、B_iso_or_equiv是 B 因子(在 AlphaFold 输出里即 pLDDT)。抓住这几个字段,文件就能读,用代码解析更省事。
这段代码用 Biopython 从 PDB 里抽出 Cα 轨迹和 pLDDT,一次循环同时拿坐标和分数:
from Bio.PDB import PDBParser import numpy as np struct = PDBParser(QUIET=True).get_structure('af', 'model_1/ranked_0.pdb') ca, plddt = [], [] for res in struct.get_residues(): if 'CA' in res: ca.append(res['CA'].get_coord()) plddt.append(res['CA'].get_bfactor()) # B 因子列即 pLDDT print('Chains:', sorted({ch.id for ch in struct})) np.savez('af_model.npz', ca=np.array(ca), plddt=np.array(plddt))get_bfactor()取到的正是藏在温度因子列里的 pLDDT,ca按残基顺序排列,和 plddt 一一对应。换 MMCIF 只是换个解析器:
from Bio.PDB import MMCIFParser import numpy as np struct = MMCIFParser(QUIET=True).get_structure('af', 'model_1/ranked_0.cif') ca, plddt = [], [] for res in struct.get_residues(): if 'CA' in res: ca.append(res['CA'].get_coord()) plddt.append(res['CA'].get_bfactor()) # 对应 B_iso_or_equiv 列 print('Chains:', sorted({ch.id for ch in struct})) print('Mean pLDDT', float(np.mean(plddt)))两种格式取出的结果完全一致,下游工具喜欢哪个就给哪个;QUIET=True只是关掉解析器的告警刷屏。
🚀 下一步要干什么:交付下游的三条路
需要 MMCIF?用仓库自己的代码三行转换
有些下游流程或数据库提交只认 mmCIF,不必自己逐列拼,仓库的 protein.py 已经实现了 PDB 文本 → Protein 对象 → MMCIF 的完整回路:
from alphafold.common import protein pdb_str = open('model_1/ranked_0.pdb').read() prot = protein.from_pdb_string(pdb_str) open('model_1/ranked_0.cif', 'w').write( protein.to_mmcif(prot, file_id='ranked_0', model_type='Monomer'))file_id会被写进 CIF 的数据块名(正式场合传 PDB ID 或自定义编号),model_type取Monomer或Multimer,影响写入的实体信息;转换过程中 B 因子列里的 pLDDT 也会原样带过去。
想看看结构?PyMOL 加载并按 pLDDT 着色
from pymol import cmd cmd.load('model_1/ranked_0.pdb', 'af') cmd.show('cartoon', 'af') cmd.spectrum('b', 'rainbow', 'af', minimum=0, maximum=100) cmd.zoom('af', 10)spectrum('b', ...)里的b表示按 B 因子通道取色,也就是 pLDDT:蓝是低置信、红是高置信,minimum和maximum锁死色标范围,避免不同文件间颜色漂移。
准备对接?先把结构收拾干净
结构交给对接程序前通常要三样东西:有氢、几何干净、只留目标链。默认做过的ranked_0.pdb已经由 Amber 最小化补上氢原子;如果你是--models_to_relax=none跑的,文件里没有氢,得先用 PyMOL 的h_add或 pdb2pqr 补上。多聚体时记得用chain A之类的选择器挑出要对接的子基,把其余链删掉,避免把整个复合物塞进盒子;文件里还剩多少几何问题,查relax_metrics.json的remaining_violations_count,非零的话可以顺藤摸瓜看是哪些残基在闹脾气。
⚠️ 卡住了吗:5 个高频问题的踩坑速查
relaxed 和 unrelaxed 到底该选哪个?多数下游直接用ranked_*(默认就是最小化后的最优模型):加了氢、立体化学违规也被压低了。unrelaxed_*留给两个场景——想看模型原始输出,或者你要单独调试最小化这一步。
B 因子列为什么不是温度因子?它真的不是温度因子。AlphaFold 特意复用了这一列存放逐残基 pLDDT,unrelaxed 和 relaxed 文件里的 B 因子同源;做经典分子动力学式的"热运动"分析时别把它当真。
多聚体的多条链怎么区分?FASTA 里各序列的顺序对应 PDB 链 ID A、B、C……(完整字符集是 A–Z、a–z、0–9,最多 62 条链,见 protein.py 中的PDB_CHAIN_IDS),链与链之间用 TER 记录分隔,Biopython 里直接取chain.id即可。
ranked_0.pdb 的 B 因子为什么和 unrelaxed_model_1.pdb 一样?坐标变了、B 因子没变:最小化流程结束后会把 pLDDT 重新写回 B 因子列,见 relax.py 里的overwrite_b_factors调用。
输出目录里为什么没有 pae_*.json?PAE 只在模型输出包含predicted_aligned_error时写出,单体预设(model_1 到 model_5)不带这个头,只有confidence_*.json是正常的。
➡️ 接下来去哪:从仓库模块继续深入
这套流程——pLDDT/PAE 定可信度、按格式取坐标和置信度、把结构文件交给下游——可以作为处理任何 AlphaFold 输出目录的标准动作。想弄清楚文件为什么这样命名、转换在内部是怎么做的,按仓库里的这几处往下读:run_alphafold.py 的输出命名与排序逻辑、alphafold/common/protein.py 的to_pdb/to_mmcif/from_pdb_string实现、alphafold/common/confidence.py 的 pLDDT 与 PAE json 生成,以及 alphafold/relax/relax.py 的 Amber 最小化流程。再往后一步,afdb/README.md 解释了预测结构在数据库层面如何被标注和发布。
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考