096

Binding Pose:如何判断一个对接构象是否可信

判断一个对接构象是否可信,比看分数更重要。这篇给出系统的姿势验证方法与判据。

对接给出的姿势可能是对的,也可能完全错误。而所有基于该姿势的后续分析(相互作用解读、设计决策)都建立在它之上——因此判断姿势可信度是对接流程中最关键的一步。

第一道关:重对接验证

# 这是使用任何对接方法前的必做步骤
#
# 做法:
#   把共晶结构中的原配体取出,用同样的流程重新对接回去,
#   看能否复现晶体姿势
#
# 判据:
#   重原子 RMSD ≤ 2.0 Å  → 成功
#   RMSD 2~3 Å           → 边缘
#   RMSD > 3 Å           → 失败
#
# 如果重对接失败:
#   说明结构准备、盒子设置、或参数有问题
#   → 在解决之前,对新分子的所有结果都不可信
#
# 常见的失败原因:
#   - 结构未正确加氢或质子化态错误(见 105)
#   - 盒子中心/尺寸不当
#   - 删掉了必要的辅因子或金属
#   - 删掉了参与结合的关键水分子
#   - 配体的互变异构体或立体化学错误

from rdkit import Chem
from rdkit.Chem import rdMolAlign

def redock_rmsd(docked_sdf, reference_sdf):
    docked = Chem.RemoveHs(Chem.SDMolSupplier(docked_sdf)[0])
    ref = Chem.RemoveHs(Chem.SDMolSupplier(reference_sdf)[0])
    return rdMolAlign.CalcRMS(docked, ref)

# 建议对该靶点家族的 3~5 个共晶结构都做重对接
# → 得到该体系上的成功率,而非单个案例

物理有效性检查

# PoseBusters:系统检查姿势的物理合理性
pip install posebusters

from posebusters import PoseBusters

buster = PoseBusters(config="dock")
df = buster.bust(["docked.sdf"], None, "receptor.pdb")
print(df.T)

# 检查项包括:
#   分子层面:
#     - SMILES 是否合法
#     - 键长、键角是否在合理范围
#     - 芳环平面性
#     - 立体化学是否保持
#     - 内部空间冲突
#   复合物层面:
#     - 与蛋白的空间冲突
#     - 配体是否在口袋内(而非悬在外面)
#     - 体积重叠
#
# 任何一项不通过 → 该姿势不应用于设计决策
#
# 重要性:
#   深度学习对接方法(DiffDock 等)生成的姿势
#   有相当比例通不过这些基本检查(见 101)
#   → 这一步对它们尤其关键

相互作用核对:最有判别力的检验

  • 思路:如果该靶点有已知的共晶结构,先分析出关键相互作用(如激酶的铰链区氢键),然后检查对接姿势是否复现了它们;
  • 为什么有效:这是独立于打分函数的判据。打分函数可能被大而油的分子欺骗,但「有没有形成铰链氢键」是明确的几何事实;
  • 工具:用 PLIP(见 108《PLIP》)分析共晶结构得到参考模式,用 ProLIF(见 109《ProLIF》)批量检查对接结果;
  • 判据:与参考指纹的 Tanimoto 相似度 > 0.5,或至少复现 1~2 个核心相互作用。
import prolif as plf
import MDAnalysis as mda

# 计算对接姿势与共晶配体的相互作用指纹相似度
u = mda.Universe("receptor.pdb")
protein = plf.Molecule.from_mda(u.select_atoms("protein"))

fp = plf.Fingerprint()
fp.run_from_iterable(list(plf.sdf_supplier("docked_poses.sdf")), protein)
df_poses = fp.to_dataframe()

# 与参考比较(见 338 的完整代码)
# 能复现关键相互作用的姿势才值得采纳

多方法一致性

# 用原理不同的方法交叉验证
#
# Vina(物理打分 + 随机搜索)
# GNINA(+ CNN 重打分)
# DiffDock(扩散生成,盲对接)
# Boltz/Chai-1(AF3 类复合物预测,见 344)
#
# 比较各方法给出的姿势:
from rdkit.Chem import rdMolAlign
import itertools

def consensus_check(poses_dict, threshold=2.0):
    names = list(poses_dict.keys())
    agreements = {}
    for a, b in itertools.combinations(names, 2):
        try:
            agreements[f"{a}-{b}"] = rdMolAlign.CalcRMS(
                poses_dict[a], poses_dict[b])
        except Exception:
            agreements[f"{a}-{b}"] = None
    return agreements

# 判读:
#   全部一致(两两 RMSD < 2 Å)→ 可信度高
#   部分一致                    → 需进一步验证
#   各说各话                    → 该体系的结合模式不明确,
#                                 不应据此做设计决策
#
# 这是最实用的可信度判据之一(见 346)

MD 验证

  • 思路:对候选姿势跑短程 MD(10~50 ns),看它是否稳定;
  • 判据对齐蛋白后,配体的 RMSD 应保持在 2 Å 以内。若配体在模拟中漂移到别处或大幅改变取向,说明该姿势不稳定(见 124《RMSD 与 RMSF》);
  • 额外收益:MD 还能揭示相互作用的稳定性(用 ProLIF 算占有率,见 109《ProLIF》)与水分子的作用;
  • 成本:比对接高得多,只对关键姿势做。

与化学常识对照

这是最容易被跳过但极有价值的一步——用药化的眼睛看一遍:

  • 极性基团是否埋在疏水口袋中且未形成氢键?这是明确的红旗(见 094《静电互补 Electrostatic Complementarity》);
  • 疏水基团是否暴露在溶剂中?浪费了疏水结合的机会;
  • 配体构象是否合理?是否处于明显的高能构象(如顺式酰胺、扭曲的共轭体系);
  • SAR 能否解释?如果该姿势提示某个基团很重要,而 SAR 显示去掉它活性不变,那么姿势可能是错的;
  • 与同家族的已知结合模式是否一致?激酶抑制剂应该形成铰链氢键——如果姿势中没有,需要特别的理由。

可信度判据汇总

检验 成本 判别力
重对接验证 必做,前置条件
物理有效性(PoseBusters) 极低 必做
相互作用核对 高,独立于打分
多方法一致性
与化学常识对照 低(人力)
MD 稳定性
共晶结构 很高 决定性

关键要点

  • 重对接验证(RMSD ≤ 2 Å)是使用任何对接方法的前置条件
  • 相互作用核对提供了独立于打分函数的判据,判别力高;
  • 多方法一致性检验是最实用的可信度判据——各说各话就不该做决策;
  • 用化学常识过一遍:埋藏的未配对极性基团是明确的红旗。

延伸资源