AlphaFold / 结果解读

AlphaFold 结果怎么看:pLDDT、PAE、pTM 与 ipTM 的含义和判断阈值

本文按 AlphaFold 3 官方输出文档、AF2 与 AF3 论文、ColabFold 1.6.3 源码和 GitHub issue 中开发者的回复,整理每个置信度指标的判断线、各输出文件该看哪个字段、判断蛋白互作的步骤,并给出读 JSON 画 PAE 图的 Python 脚本和 PyMOL、ChimeraX 命令。

直接答案

pLDDT 衡量局部结构,范围 0–100:>90 主链和侧链都较准确,70–90 主链基本正确,<50 的长片段应读作无序。PAE 是两个残基相对位置的预期误差(Å,越低越好),链间区块决定能否讨论界面。pTM 衡量整体折叠,>0.5 表示整体折叠可能接近真实结构。ipTM 衡量链间界面:>0.8 高置信,<0.6 多为失败,0.6–0.8 是灰区。AlphaFold 3 用 ranking_score = 0.8·ipTM + 0.2·pTM + 0.5·fraction_disordered − 100·has_clash 选最佳模型;判断某一对链是否互作时看 chain_pair_iptm 和 chain_pair_pae_min。链上有长无序区或伙伴是短肽时 ipTM 偏低,改看 ipSAE 等只统计界面的指标。

指标速查

表中判断线均来自官方文档或原始论文。标为“无”的指标没有官方阈值,不要套用其他指标的阈值。

pLDDT 分段的依据:在近期 PDB 测试集上,pLDDT>90 的残基 χ1 侧链角约 80% 正确;pLDDT>70 对应主链基本正确。把 1 − 0.01×pLDDT 当作无序预测器,在 CAID 基准上 AUC 为 0.897(Tunyasuvunakool 等,2021)。

AF3 的 pLDDT 按原子计算。配体原子只计算它与聚合物之间的距离误差;蛋白使用 15 Å 半径,DNA/RNA 使用 30 Å 半径。因此配体 pLDDT 与蛋白残基 pLDDT 不能放在同一尺度上比较。

AF3 的总 iptm 是所有界面的平均。开发者在 GitHub issue #565 中确认:只关心一个界面时,应看 chain_pair_iptm 中对应的元素。

指标衡量什么取值判断线出处
pLDDT残基(AF3 为原子)周围局部距离的预测准确度,基于 lDDT-Cα0–100,越高越好>90 主链和侧链较准确;70–90 主链基本正确;50–70 低;<50 很低,长片段读作无序AF2 人类蛋白组论文;EBI 课程;AF3 output.md
PAE用残基 i 的局部框架对齐后,残基 j 位置的预期误差Å,越低越好;矩阵不对称无统一阈值;链间区块成片低值表示相对位置可信AF3 output.md;EBI 课程
pTM整个结构的预测 TM-score0–1>0.5 表示整体折叠可能接近真实结构;少于 20 个 token 时被压到 <0.05AF3 output.md
ipTM链间相对位置的预测 TM-score,对所有界面取平均0–1>0.8 高置信;<0.6 多为失败;0.6–0.8 灰区AF3 output.md;issue #565
ranking_scoreAF3 的排序分−100 到 1.5无;只用于同一任务内排序AF3 output.md
chain_pair_iptm只统计链 i 与链 j 的 ipTM;对角线为单链 pTM0–1 矩阵沿用 ipTM 判断线;已知两链互作时用它给该界面排序AF3 output.md
chain_iptm某条链与其余所有链界面的平均 ipTM0–1无;配体或不知道结合哪条链时用它排序AF3 output.md;issue #418
chain_pair_pae_min链 i 的行与链 j 的列范围内的最小 PAEÅ无;官方称其与两链是否互作相关,部分情况下能区分结合与不结合AF3 output.md
fraction_disordered按可及表面积估计的无序比例0–1无;在 ranking_score 中权重为 +0.5AF3 output.md
has_clash冲突原子超过某条链的 50%,或某条链冲突原子超过 100 个0 或 1为 1 时 ranking_score 减 100,该模型弃用AF3 output.md
contact_probs两个 token 代表原子距离 <8 Å 的预测概率0–1 矩阵无AF3 output.md

输出文件

四种常用工具的文件名和“最佳模型”的排序规则各不相同。拿到结果先确认自己看的是不是排名第一的模型。

ColabFold 的 scores JSON 中 iptm、ptm 只保留两位小数。需要更多位数时,log.txt 中给出三位有效数字,或加 --save-all 保存原始 pickle。

AF2 单体的 ranked_0.pdb 按平均 pLDDT 排序,不按 pTM。ColabFold 单体同样按 pLDDT 排序。比较“最佳模型”之前,先确认几个工具用的是同一个排序指标。

工具文件内容说明
AF3 本地版<job>_model.cif排名第一的结构,B-factor 列为每个原子的 pLDDT所有 seed × sample 中 ranking_score 最高者
AF3 本地版<job>_summary_confidences.jsonptm、iptm、ranking_score、chain_pair_iptm、chain_pair_pae_min、chain_iptm、chain_ptm、fraction_disordered、has_clash、chain_ids判断与排序看这个文件。本页实测(AF3 仓库 2026-10-09 版本):chain_ids 是逐 token 的链 ID 列表,长度等于 token 数;Server 下载包的 summary 中没有 chain_ids
AF3 本地版<job>_confidences.jsonpae、atom_plddts、contact_probs、token_chain_ids、token_res_ids、atom_chain_ids画 PAE 图用
AF3 本地版<job>_ranking_scores.csv每个 seed、sample 的 ranking_score看 seed 之间差多少
AF3 本地版seed-<s>_sample-<n>/每个样本一套 cif 与两个 JSON默认每个 seed 5 个样本
AF3 本地版<job>_data.json加入 MSA 与模板后的输入加 --run_data_pipeline=false 可直接复用,换 seed 时跳过 MSA 搜索
AlphaFold Serverfold_<job>_model_<N>.cifN=0–4,0 为排名第一每个任务 1 个 seed、5 个模型
AlphaFold Serverfold_<job>_summary_confidences_<N>.json / fold_<job>_full_data_<N>.json字段同本地版 summary_confidences / confidencesfull_data 含 PAE 矩阵
AlphaFold Serverfold_<job>_job_request.json提交参数可改 seed 后重新提交
AF2 官方ranked_0.pdb最佳模型单体按平均 pLDDT 排序;multimer 按 0.8·ipTM + 0.2·pTM 排序
AF2 官方ranking_debug.json排序分与模型名对应键名为 plddts(单体)或 iptm+ptm(multimer)
AF2 官方result_model_*.pklplddt、ptm、iptm、predicted_aligned_error 等原始输出multimer 默认每个模型 5 个 seed,共 25 个预测
ColabFold 1.6.3<job>_unrelaxed_rank_001_alphafold2_multimer_v3_model_<m>_seed_<s>.pdbrank_001 为最佳;B-factor 列为 pLDDT复合物默认按 80·ipTM + 20·pTM 排序,单体按 pLDDT
ColabFold 1.6.3<job>_relaxed_rank_001_….pdbAmber 优化后的结构只在加 --amber 时生成
ColabFold 1.6.3<job>_scores_rank_00X_….jsonplddt、pae、max_pae、ptm、iptm;复合物另有 ipsae、pdockq、pdockq2,三者按链对存成字典,例如 "ipsae": {"A-B": 0.78, "B-A": 0.87},A-B 表示以 A 链对齐、评估 B 链,log.txt 中显示两个方向的较大值加 --calc-extra-ptm 时另有 actifptm、pairwise_iptm、pairwise_actifptm、per_chain_ptm
ColabFold 1.6.3<job>_predicted_aligned_error_v1.json排名第一模型的 PAE,AlphaFold DB 格式可直接被 ChimeraX 读取
ColabFold 1.6.3log.txt、<job>_pae.png、<job>_plddt.png、<job>_coverage.png、config.json、<job>.a3m、<job>_ext_metrics.png(加 --calc-extra-ptm 时)每个模型的指标、前 5 个模型的图、MSA 覆盖度、运行参数、MSAipTM 偏低时先看 coverage.png 的 MSA 深度

PAE 图

  1. 01

    确认坐标含义

    AF3 的定义:矩阵元素 (i, j) 是用 token i 的局部框架对齐后,token j 的位置误差。行是对齐所用的残基,列是被评估的残基。矩阵不对称,A→B 和 B→A 两个链间区块要分别看。

  2. 02

    忽略对角线

    对角线是残基与自身对齐,恒为低值,不提供信息。

  3. 03

    看链内区块

    一条链内出现两个低值方块、方块之间为高值,说明两个结构域各自可信,但相对朝向不可信。此时即使每个结构域的 pLDDT 都高于 90,也不能讨论结构域之间的相对位置。

  4. 04

    看链间区块

    界面所在的行和列出现成片低值,说明模型对这部分界面的相对位置有把握。整个链间区块都是高值时,链间相对位置基本没有约束,结构图上两条链贴在一起也不能当作互作证据。

  5. 05

    与 pLDDT 对照

    低 pLDDT 的无序片段通常 PAE 也高。界面两侧残基 pLDDT 高、且链间 PAE 低时,才值得逐个分析界面残基。

互作判断

  1. 01

    排除冲突模型

    AF3 先看 has_clash,为 1 直接弃用。AF2 和 ColabFold 没有这个字段,需要在结构中检查链是否相互穿插。

  2. 02

    看目标链对的 chain_pair_iptm

    二聚体看 ipTM,多链复合物看 chain_pair_iptm 中对应的元素。>0.8 进入下一步;<0.6 视为没有预测出互作;0.6–0.8 需要后面几步的证据补充。

  3. 03

    看链间 PAE

    chain_pair_pae_min 只反映最好的那一对残基。还要统计链间 PAE 低于 10 Å 的残基对数量(下文脚本输出的 pairs<10A 列),只有少数几对低值时,界面证据很弱。

  4. 04

    看界面残基 pLDDT

    界面两侧残基 pLDDT ≥70 才讨论哪些残基接触;讨论盐桥、氢键等侧链相互作用需要 pLDDT>90。

  5. 05

    检查多个 seed 是否一致

    至少跑 5 个 seed:AF3 本地在 modelSeeds 中写 5 个值;AlphaFold Server 每个任务只有 1 个 seed,需改 seed 后多次提交;ColabFold 加 --num-seeds 5。比较排名靠前的模型结合位点是否相同,可用 DockQ 以一个模型为参考评估另一个模型。

  6. 06

    补充非聚合物上下文

    天然复合物中有金属离子、辅因子或配体时,把它们加进 AF3 输入。AF3 开发者在 issue #142 和 #474 中说明置信度依赖这些上下文,缺少时可能整体偏低。

  7. 07

    做阴性对照

    用相同参数预测目标蛋白与一个已知不互作的蛋白,或与打乱顺序(氨基酸组成不变)的肽。对照组的分数就是本体系的背景。Dunbrack 2025 的基准中,真、假二聚体的 ipTM 与 ipSAE 分布在 0.3–0.7 之间重叠,只看单个分数无法区分。

ipTM 的局限

长无序区或附加结构域:ipTM 对整条链取平均,d0 按全部链长计算,不参与结合的残基会拉低分数。Dunbrack 2025 的 KRAS–RAF1 RBD 例子中,只含结构域时 ipTM 为 0.9;两条链各加 120 个无序残基后,AF2 的 ipTM 降到 0.59,界面本身没有变化,ipSAE 为 0.8。截短到结构域能提高 ipTM,但截短后的高分只说明截短构建体的界面。

短链和短肽:少于 20 个 token 时 pTM 被压到 0.05 以下,官方建议改看 PAE 和 pLDDT。肽两端的柔性侧翼同样会拉低 ipTM,actifpTM 就是为这种情形设计的。

大复合物:总 iptm 混合了所有界面,某一对链的好坏会被其他链稀释或掩盖。看单个界面用 chain_pair_iptm,看配体用 chain_iptm。

pTM、ipTM 由 PAE 的概率分布计算,JSON 里保存的 PAE 只是期望值,不能据此精确重算 ipTM(ColabFold issue #194)。下表的替代指标都是基于 PAE 期望值或 pLDDT 的近似。

指标计算方式适用情形判断线来源
ipSAE只统计链间 PAE 低于阈值的残基对,d0 按这些残基数计算,按方向取最大值有无序区或附加结构域的蛋白互作、结构域–肽互作论文未给通用阈值;建议 PAE 阈值 10 或 15 ÅDunbrack 2025;ColabFold 1.6.3 内置
pDockQ界面平均 pLDDT × log10(界面接触数) 经 sigmoid 映射为预测 DockQ;接触为 Cβ 距离 ≤8 ÅAF2 异源二聚体区分可接受模型(DockQ≥0.23)的 AUC 为 0.95;SpeedPPI 默认以 0.5 作为保存结构的阈值;不适用于同源多聚体等链重叠情形Bryant 2022;FoldDock、SpeedPPI
pDockQ2结合界面 pLDDT 与界面 PAE,逐链对计算多链复合物中的单个界面本文未核实通用阈值Zhu 2023;ColabFold 1.6.3 内置
actifpTM只对实际参与界面的残基计算 ipTM肽、带柔性侧翼的基序介导互作无Varga 2025;ColabFold --calc-extra-ptm
LIS / iLIS链间 PAE ≤12 Å 区域的平均置信度;iLIS 再加 Cβ ≤8 Å 接触过滤大规模 PPI 筛选、柔性互作iLIS ≥0.223;或 LIS ≥0.203 且 LIA ≥3432Kim 2024、2026;AFM-LIS

常见误读

把 pLDDT 或 ipTM 当作结合强度

这些指标的训练目标是结构误差(lDDT、TM-score),不含亲和力信息。Pak 等 2023 发现 AlphaFold 输出指标与单点突变引起的稳定性变化几乎不相关。比较结合强弱需要对接打分、自由能计算或实验测定。

低 pLDDT 区域就是预测错了

pLDDT<50 的长片段在 AF2 中呈带状,含义是“单独存在时可能无序”。人类蛋白组论文还发现,低 pLDDT 集中在与其他链接触比例高的区域:把结合伙伴加入预测后,这些区域的 pLDDT 可能上升。

高 pLDDT 就一定有稳定结构

只在结合时折叠的无序区,AF2 倾向于以高 pLDDT 预测成折叠态(EBI 课程)。AF3 是扩散模型,会在无序区生成规则结构;这些区域通常 pLDDT 很低,但不像 AF2 那样呈带状,看结构图时容易误认为有结构。

pTM 高说明界面对

pTM 对全部残基计算,大蛋白预测准确时会主导分数,小伙伴放错位置 pTM 仍可能较高。界面看 ipTM 或 chain_pair_iptm。

跨任务比较 ranking_score

ranking_score 含 +0.5·fraction_disordered 和 −100·has_clash 两项,官方说明它只用于排序。不同构建体、不同伙伴之间比较应使用 chain_pair_iptm 等指标。

多个 seed 结果不一致时挑最好的报告

不同 seed 给出不同结合位点,说明模型对界面没有把握。AF3 论文中,抗体–抗原复合物的预测随 seed 数增加持续改善(到 1000 个 seed),其他类别一般没有这种提升。抗体体系可以多跑 seed 再按 ipTM 排序;其他体系 seed 之间不一致时,应报告为不确定。seed 之间一致也只说明结果稳定:开发者在 issue #142 中强调置信度与准确度是相关关系。

代码

同一个脚本支持 AF3 本地版、AlphaFold Server 和 ColabFold,只依赖 numpy 和 matplotlib。脚本输出每条链的平均 pLDDT、各链对的最小与平均 PAE、PAE 低于阈值的残基对数,以及 summary 中的指标。

热图中的黑线是链边界。行是对齐所用的 token,列是被评估的 token,与 AF3 文档对 pae[i][j] 的定义一致。AF3 中配体的每个原子是一个 token,所以配体在图上占的行数等于重原子数。

af_pae.pypython
#!/usr/bin/env python3
"""读取 AlphaFold 3 / AlphaFold Server / ColabFold 的置信度 JSON,输出链对指标并画 PAE 热图。

AlphaFold 3 本地版:  python af_pae.py job_confidences.json --summary job_summary_confidences.json
AlphaFold Server:    python af_pae.py fold_job_full_data_0.json --summary fold_job_summary_confidences_0.json
ColabFold:           python af_pae.py job_scores_rank_001_xxx.json --lengths 110,89
"""
import argparse
import json

import matplotlib

matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np


def segments(ids):
    """把逐 token 的链 ID 切成 [(链, 起点, 终点)],终点不含。"""
    segs, start = [], 0
    for i in range(1, len(ids) + 1):
        if i == len(ids) or ids[i] != ids[start]:
            segs.append((ids[start], start, i))
            start = i
    return segs


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("conf", help="含 pae 矩阵的 JSON")
    ap.add_argument("--summary", help="AF3 的 summary_confidences JSON")
    ap.add_argument("--lengths", help="ColabFold 用:各链长度,逗号分隔")
    ap.add_argument("--cutoff", type=float, default=10.0, help="统计界面用的 PAE 阈值 (Å)")
    ap.add_argument("--out", default="pae.png")
    args = ap.parse_args()

    with open(args.conf) as f:
        d = json.load(f)
    pae = np.asarray(d.get("pae", d.get("predicted_aligned_error")), dtype=float)
    n = pae.shape[0]

    if "token_chain_ids" in d:  # AF3 本地版与 AlphaFold Server
        chain_of_token = d["token_chain_ids"]
    elif args.lengths:  # ColabFold:scores JSON 不含链 ID
        lens = [int(x) for x in args.lengths.split(",")]
        if sum(lens) != n:
            raise SystemExit(f"--lengths 之和 {sum(lens)} 与 PAE 维度 {n} 不一致")
        chain_of_token = [chr(65 + k) for k, m in enumerate(lens) for _ in range(m)]
    else:
        chain_of_token = ["A"] * n
    segs = segments(chain_of_token)

    # 每条链的平均 pLDDT
    if "atom_plddts" in d and "atom_chain_ids" in d:  # AF3:逐原子
        pl = np.asarray(d["atom_plddts"])
        ids = np.asarray(d["atom_chain_ids"])
        for c in dict.fromkeys(d["atom_chain_ids"]):
            print(f"chain {c}: mean pLDDT (atoms) = {pl[ids == c].mean():.1f}")
    elif "plddt" in d:  # ColabFold:逐残基
        pl = np.asarray(d["plddt"])
        for c, s, e in segs:
            print(f"chain {c}: mean pLDDT (residues) = {pl[s:e].mean():.1f}")

    # 链对 PAE 统计:行 = 对齐所用的链,列 = 被评估的链
    print(f"\naligned scored  min_PAE  mean_PAE  pairs<{args.cutoff:g}A")
    for ci, si, ei in segs:
        for cj, sj, ej in segs:
            if ci == cj:
                continue
            b = pae[si:ei, sj:ej]
            print(f"{ci:>7} {cj:>6} {b.min():8.2f} {b.mean():9.2f} {int((b < args.cutoff).sum()):10d}")

    # 汇总指标
    for key in ("ptm", "iptm", "ipsae", "pdockq", "pdockq2", "actifptm"):
        if key in d:
            print(f"{key}: {d[key]}")
    if args.summary:
        with open(args.summary) as f:
            s = json.load(f)
        for key in ("ptm", "iptm", "ranking_score", "fraction_disordered", "has_clash"):
            print(f"{key}: {s.get(key)}")
        # AF3 本地版的 chain_ids 是逐 token 的列表,Server 版没有该字段;去重后得到链顺序
        cids = list(dict.fromkeys(s.get("chain_ids") or [])) or [c for c, _, _ in segs]
        for key in ("chain_pair_iptm", "chain_pair_pae_min"):
            if key in s:
                print(f"\n{key} (rows/cols = {cids})")
                for c, row in zip(cids, s[key]):
                    print(c, " ".join("  nan" if v is None else f"{v:5.2f}" for v in row))

    # PAE 热图
    fig, ax = plt.subplots(figsize=(6, 5), dpi=200)
    im = ax.imshow(pae, cmap="Greens_r", vmin=0, vmax=30)
    for _, s, _ in segs[1:]:
        ax.axhline(s - 0.5, color="black", lw=0.8)
        ax.axvline(s - 0.5, color="black", lw=0.8)
    ax.set_xlabel("Scored token")
    ax.set_ylabel("Aligned token")
    fig.colorbar(im, ax=ax, label="Expected position error (A)")
    fig.tight_layout()
    fig.savefig(args.out)
    print(f"\nsaved {args.out}")


if __name__ == "__main__":
    main()
用法bash
# 只需要 numpy 和 matplotlib
pip install numpy matplotlib

# AlphaFold 3 本地版(排名第一的模型)
python af_pae.py myjob/myjob_confidences.json --summary myjob/myjob_summary_confidences.json --out myjob_pae.png

# AlphaFold Server(解压后,N=0 为排名第一)
python af_pae.py fold_myjob_full_data_0.json --summary fold_myjob_summary_confidences_0.json --out pae_0.png

# ColabFold:scores JSON 不含链信息,用 --lengths 按顺序给出各链长度
python af_pae.py out/barnase_barstar_scores_rank_001_*.json --lengths 110,89 --out pae_rank1.png

可视化

AF2、ColabFold 的 PDB 文件和 AF3 的 mmCIF 文件都把 pLDDT 写在 B-factor 列,AF3 为逐原子数值。pLDDT 越高越可信,与晶体学 B 因子的方向相反,用模型做分子置换前要先转换。

ChimeraX 默认使用连续配色,与 AlphaFold DB 的四段配色不同。ChimeraX 文档不推荐四段配色,因为 pLDDT 为 71 和 69 的残基会显示成差别很大的颜色。

PyMOL:pLDDT 着色与界面残基pymol
load fold_myjob_model_0.cif, m
hide everything, m
show cartoon, m
# B-factor 列即 pLDDT。按 AlphaFold DB 的四段配色:<=50 橙、50-70 黄、70-90 浅蓝、>90 深蓝
color 0xFF7D45, m
color 0xFFDB13, m and b > 50
color 0x65CBF3, m and b > 70
color 0x0053D6, m and b > 90
# 连续配色(可选):50 以下全红,90 以上全蓝
# spectrum b, red_yellow_green_cyan_blue, m, minimum=50, maximum=90
# 界面残基:与对方链任意原子距离 5 A 以内
select ifA, byres ((m and chain A) within 5 of (m and chain B))
select ifB, byres ((m and chain B) within 5 of (m and chain A))
select iface, ifA or ifB
show sticks, iface and not name N+C+O
# 打印界面残基的 pLDDT(取 CA 原子)
iterate iface and name CA, print(chain, resi, resn, round(b, 1))
# 另存为 PDB
save model_0.pdb, m
ChimeraX:pLDDT 着色、PAE 图与界面 PAE 伪键chimerax
open fold_myjob_model_0.cif
# ChimeraX 默认的 pLDDT 连续配色
color bfactor #1 palette alphafold
# 读入 PAE:AF3 的 full_data / confidences JSON、ColabFold 的 scores JSON 都可直接读
alphafold pae #1 file fold_myjob_full_data_0.json plot true
# 把 A、B 链之间距离 <=4 A 且 PAE <=5 A 的残基对画成伪键
alphafold contacts #1/A toAtoms #1/B distance 4 maxPae 5
# 按 PAE 聚类出刚性结构域并着色(默认 connectMaxPae 5 A)
alphafold pae #1 colorDomains true
mmCIF 转 PDBbash
pip install gemmi
# --shorten 把链名缩到 1-2 个字符;配体用了 5 字符单体名时再加 --shorten-tlc
gemmi convert --shorten fold_myjob_model_0.cif model_0.pdb

示例

选有实验结构的体系,可以用 DockQ 把置信度指标与真实误差放在一起看,校准自己对阈值的判断。barnase–barstar 的实验结构为 PDB 1BRS。

1BRS 的一个不对称单元含 3 套复合物(A–D、B–E、C–F),barstar 为 C40A/C82A 突变体,上面的序列与 1BRS 一致。--mapping AB:AD 指定模型 A、B 链分别对应 1BRS 的 A、D 链。

DockQ 分级:<0.23 错误,0.23–0.49 可接受,0.49–0.80 中等,≥0.80 高质量。把 25 个模型的 ipTM、ipSAE 与 DockQ 列成一张表,可以直接看到高 ipTM 的模型 DockQ 是否也高。再检查 barnase Arg59、His102 是否出现在模型界面上。

ColabFold 默认把序列发送到公共 MMseqs2 服务器生成 MSA。复合物默认 --pair-mode unpaired_paired,同时使用配对和未配对的 MSA;来自不同物种、缺少共进化信号的蛋白对,配对 MSA 很浅,ipTM 往往偏低,可先看 coverage.png。

本页实测(2026-10-10):ColabFold 1.6.3,macOS arm64 8 核 CPU(无 GPU),公共 MMseqs2 服务器生成 MSA,参数为 --num-models 5 --num-seeds 1 --calc-extra-ptm(只跑 5 个模型,未加 --amber)。每个模型在第 1 次 recycle 后即达到提前停止条件(tol 0.285 < 0.5),单个模型约 10–12 分钟(运行时本机还有其他任务占用 CPU;第一个模型含 JAX 编译,用时约 59 分钟),5 个模型共约 105 分钟。DockQ 2 用上面的 --mapping AB:AD 命令计算。

5 个模型都是高质量(DockQ ≥ 0.80),ipTM 只相差 0.004,排名第一的模型 DockQ 反而最低、排名第五的最高。分数都很高、差值很小时,排名先后不代表结构准确度的先后。PyMOL 按上一节命令选出的界面包含 barnase Arg59(pLDDT 97.1)和 His102(pLDDT 98.8)。scores JSON 中排名第一模型的 iptm 存为 0.92,log.txt 中为 0.919。

作为对照,本页用同一份 ColabFold MSA 在本机以 AF3 本地版(CPU 后端,1 个 seed × 5 个样本)预测同一复合物:ipTM 0.93–0.94,chain_pair_pae_min 0.78–0.79 Å,DockQ 0.97–0.98,5 个样本都高于 ColabFold 的最好模型。

预测、汇总与对比bash
cat > barnase_barstar.fasta <<'EOF'
>barnase_barstar
AQVINTFDGVADYLQTYHKLPDNYITKSEAQALGWVASKGNLADVAPGKSIGGDIFSNREGKLPGKSGRTWREADINYTSGFRNSDRILYSSDWLIYKTTDHYQTFTKIR:KKAVINGEQIRSISDLHQTLKKELALPEYYGENLDALWDALTGWVEYPLVLEWRQFEQSKQLTENGAESVLQVFREAKAEGADITIILS
EOF

# 5 个模型 x 5 个 seed = 25 个预测;复合物默认按 80*ipTM + 20*pTM 排序
colabfold_batch --num-models 5 --num-seeds 5 --calc-extra-ptm \
  --amber --num-relax 1 --use-gpu-relax \
  barnase_barstar.fasta out/

# 汇总 25 个模型的 ipTM、pTM、ipSAE、pDockQ2(1.6.3 起 scores JSON 自带后两项)
# ipsae、pdockq2 按链对存成字典(A-B、B-A),这里取较大值,与 log.txt 一致
python - <<'PY'
import glob, json
for f in sorted(glob.glob("out/barnase_barstar_scores_rank_*.json")):
    s = json.load(open(f))
    rank = f.split("_scores_")[1].split("_alphafold2")[0]
    mx = lambda v: max(v.values()) if isinstance(v, dict) and v else v
    print(rank, s.get("iptm"), s.get("ptm"), mx(s.get("ipsae")), mx(s.get("pdockq2")))
PY

# 与实验结构 1BRS 对比:模型 A、B 链对应 1BRS 的 A(barnase)、D(barstar)链
wget https://files.rcsb.org/download/1BRS.pdb
pip install DockQ
for f in out/barnase_barstar_unrelaxed_rank_*.pdb; do
  DockQ "$f" 1BRS.pdb --mapping AB:AD --short | tail -1
done
排名模型ipTMpTMipSAE(较大方向)pDockQpDockQ2(较大方向)DockQ(对 1BRS A/D)
rank_001model_30.9190.9300.8690.4620.9250.845
rank_002model_40.9170.9300.8660.4810.9150.875
rank_003model_10.9170.9290.8650.4880.9110.883
rank_004model_20.9150.9290.8630.4900.9150.877
rank_005model_50.9150.9280.8620.4770.9080.901
本页实测:barnase–barstar,ColabFold 1.6.3,5 个模型 × 1 个 seed,CPU 运行;ipTM、ipSAE、pDockQ2 取自 log.txt,pDockQ 取自 scores JSON

中文教程

以下问题在多篇中文教程中出现,按官方文档给出更正。

配色方向与 AlphaFold DB 相反

常见写法 spectrum b, blue_white_red,以及 color_b.py 的 gradient=bgr(作者注明 pLDDT 从低到高依次为蓝、绿、红),都把高 pLDDT 显示为红色。这沿用的是晶体学 B 因子“红色表示柔性”的习惯,与 AlphaFold DB 的“深蓝表示高置信”相反,读者会把最可信的区域看成最不可信的区域。color_b.py 的 mode=ramp 让每个颜色段包含相同数目的原子,分段边界随结构变化,不同模型中的同一颜色对应不同的 pLDDT。论文图用固定阈值着色(“可视化”一节的四段配色,或 spectrum 加 minimum=50, maximum=90)并附色标。

按 pLDDT 选原子要写 b

PyMOL 中 pLDDT 存在 B 因子列,没有单独的 pLDDT 属性。选出低置信区域写 select low, m and b < 50;写成 plddt < 50 之类的表达式会报选择语法错误。

Server 下载包里没有 ranked_0.cif

有教程写“解压后找 ranked_0.cif”。ranked_0 是 AF2 本地版的文件名;AlphaFold Server 下载包中排名第一的结构是 fold_<job>_model_0.cif,AF3 本地版是 <job>_model.cif。

chain_ptm 不反映界面

有教程把 chain_ptm 解释为某条链与其他链界面的置信度,并认为 chain_pair_iptm 与 chain_pair_pae_min 含义相近。AF3 output.md 的定义是:chain_ptm 为限定在第 i 条链内的 pTM,只反映该链自身折叠;界面看 chain_iptm 或 chain_pair_iptm;chain_pair_pae_min 是 PAE 的最小值,单位为 Å,与 ipTM 不在同一尺度上。

两种界面 PAE 过滤值的算法不同

蛋白 binder 设计论文常用两种值。pae_interaction 取两个链间区块(A→B、B→A)各自均值,再求平均;Bennett 等 2023 以 AF2 的 pae_interaction < 10 作为筛选条件。min PAE interaction 取两个链间区块最小值中的较小者,AF3 summary_confidences.json 中 chain_pair_pae_min 的非对角元素就是各区块最小值,可直接读取(中文经验帖示例 [[0.76, 1.29], [1.4, 0.76]] 取 1.29)。这些阈值是在从头设计的 binder 上标定的,用于天然蛋白互作前没有同样的校准,仍按“互作判断”一节的多指标流程判断。

交给 Agent

指令示例:“用 ColabFold 预测 barnase–barstar 复合物,5 个模型 × 5 个 seed,与 PDB 1BRS 对比,报告每个模型的 ipTM、pTM、ipSAE、pDockQ2、链间 PAE 和 DockQ,检查 barnase Arg59、His102 是否在界面上。”

  1. 01

    准备环境

    租用 GPU,选择生物信息环境并运行环境自检。

  2. 02

    运行预测

    写出 FASTA 和运行脚本,执行 colabfold_batch,保留 log.txt 与 config.json。

  3. 03

    汇总与对比

    用本文脚本统计每个模型的指标并画 PAE 图,下载 1BRS 运行 DockQ,生成指标汇总表。

  4. 04

    对抗审阅

    检查 25 个模型是否都被评估、DockQ 的链映射是否正确、报告中的数值是否与 JSON 一致,然后释放算力。

  • 产出:FASTA、运行命令、全部模型、scores JSON、PAE 与 pLDDT 图、指标汇总表、DockQ 结果、分析报告
  • 仍需自己核对:链与实验结构的对应关系
  • 仍需自己核对:界面残基是否与文献报道一致
  • 仍需自己核对:报告中把预测写成结论的措辞

写论文

审稿人能据此复现并判断可信度的最小信息如下。

  • 方法:软件与版本(如 ColabFold 1.6.3、AlphaFold 3 v3.0.1)、模型权重(如 alphafold2_multimer_v3)、MSA 来源(MMseqs2 服务器或本地数据库及版本)、是否使用模板、seed 数 × 模型或样本数、recycle 数、是否 Amber 优化、排序指标
  • 选用的模型及理由:rank_001 或 ranking_score 最高,还是按 chain_pair_iptm 重新排序
  • 数值表:每个报告模型的 pTM、ipTM(多链给目标链对的 chain_pair_iptm)、各链平均 pLDDT、界面残基平均 pLDDT;有无序区时加 ipSAE(注明 PAE 阈值)或 pDockQ2
  • 多 seed 分布:全部模型 ipTM 的中位数和范围,或排名前 5 的模型之间结合位点是否一致
  • 图:按 pLDDT 着色的结构(附色标);PAE 热图,标出链边界,色标单位为 Å,色标范围在各图之间保持一致
  • 有实验结构时:DockQ 或界面 RMSD
  • 数据:模型坐标与置信度 JSON 放入补充材料,或提交到 ModelArchive,每个模型会获得可在论文中引用的 DOI

参考资料

常见问题

ipTM 和 pTM 有什么区别,判断复合物看哪个?

pTM 衡量整个结构的折叠,对全部残基计算;ipTM 只衡量链与链之间的相对位置。判断复合物界面看 ipTM,多链时看 chain_pair_iptm 中目标链对的值。AlphaFold 3 的 ranking_score 和 ColabFold 的复合物排序中,ipTM 的权重都是 0.8,pTM 是 0.2。

AlphaFold3 预测蛋白互作,ipTM 0.7 算可信吗?

0.6–0.8 是官方定义的灰区,可能对也可能错。需要继续看链间 PAE 低值残基对的数量、界面残基 pLDDT、多个 seed 的结合位点是否一致;链上有长无序区时再算 ipSAE。

pLDDT 低于 50 的区域要删掉吗?

展示结构时可以隐藏,人类蛋白组论文的图中就隐藏了 pLDDT<50 的区域。做对接或分子动力学前,远离结合位点的长无序末端通常截掉,并在方法中说明截掉的范围。这些区域的构象不能用于结构解释。

AlphaFold3 的结果怎么转成 PDB?

用 gemmi convert --shorten model.cif model.pdb,或在 PyMOL 中 load 后 save 为 .pdb。B-factor 列中的 pLDDT 会保留。只用于 PyMOL 或 ChimeraX 查看时,直接打开 CIF 即可。

为什么同一个复合物在 AlphaFold Server 和本地运行的 ipTM 差很多?

最常见的原因是 MSA 不同。AF3 issue #492 中,MSA 只差 12 条序列,ipTM 就从 0.86 变为 0.1。先比较两边的 MSA 深度,再用相同 MSA 和多个 seed 重跑。AlphaFold 3 与 ColabFold(AlphaFold-Multimer v3)是不同模型,二者的 ipTM 不能直接比较。

多个 seed 的结果不一致怎么办?

先确认不一致的是结合位点还是只有分数。结合位点在 seed 之间改变时,报告为界面不确定,并给出所有模型 ipTM 的分布。抗体–抗原体系可增加 seed 数后按 ipTM 排序,AF3 论文中这类体系在 1000 个 seed 内持续改善。

把结构预测和结果核对交给 Scientify

写下要预测的复合物和需要报告的指标。智能体在云端租用 GPU 运行 ColabFold 1.6.3,汇总 ipTM、ipSAE 与 PAE 图,并对结果做对抗审阅;代码、日志和模型都保留在工作区。新注册用户免费获得 5 美元等值额度。