20260910 144229 蛋白质结构预测与虚拟筛选全流程实现详解

20260910_144229_蛋白质结构预测与虚拟筛选全流程实现详解.md

蛋白质结构预测与虚拟筛选全流程实现详解

AI生成 本文档由星辰超级智能体(TeleAgent)基于 bioSkills 技能库自动生成,内容来源于以下技能的 SKILL.md 文件,经组织编排为端到端工作流教程。


场景假设

你是一名药物化学研究员,收到一个新靶点蛋白——人源 BRD4 溴区结构域(BRD4-BD1, UniProt: O60885),需要:

  1. 获取该蛋白的三维结构(优先使用实验结构,无则用 AlphaFold 预测)
  2. 评估结构质量,判断哪些区域可信
  3. 制备受体结构(加氢、质子化、修补缺失原子)
  4. 检测结合口袋(如果是 apo 结构)
  5. 准备配体库(从 SMILES 生成 3D 构象)
  6. 进行层次化虚拟筛选(Vina → GNINA 重打分)
  7. 对 top hits 进行 PoseBusters 物理合理性验证
  8. ADMET 性质预测与类药性筛选
  9. 对最终候选化合物进行自由能计算(FEP)精排序

全流程总览

靶点蛋白序列/PDB ID
        │
        ▼
┌──────────────────────────┐
│ Step 1: 结构获取           │  技能: bio-structural-biology-alphafold-predictions
│ · PDB 实验结构 → 直接使用  │
│ · 无实验结构 → AlphaFold DB│
│ · 需要复合物 → AF3/Boltz   │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 2: 结构质量评估       │  技能: bio-structural-biology-alphafold-predictions
│ · pLDDT 分段读取           │
│ · PAE 域间置信度           │
│ · 决策:AFDB vs 新预测     │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 3: 受体结构制备       │  技能: bio-structural-biology-structure-preparation
│ · PDBFixer 补缺失原子     │
│ · PROPKA 预测 pKa         │
│ · reduce 优化翻转/互变异构  │
│ · PDB2PQR 生成 PDBQT      │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 4: 结合口袋检测       │  技能: bio-structural-biology-binding-site-detection
│ · fpocket 几何枚举         │
│ · P2Rank ML 配体性评分     │
│ · 交叉验证,确定 docking 框 │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 5: 配体库制备         │  技能: bio-virtual-screening (ligand prep)
│ · RDKit SMILES → 3D       │
│ · ETKDGv3 构象嵌入         │
│ · MMFF94 能量最小化        │
│ · meeko → PDBQT           │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 6: 层次化虚拟筛选     │  技能: bio-virtual-screening
│ · Stage 1: Vina 筛全库     │
│ · Stage 2: GNINA CNN 重排  │
│ · Stage 3: top-1000 候选   │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 7: Pose 物理验证      │  技能: bio-pose-validation
│ · PoseBusters 全检         │
│ · 应变能量化               │
│ · 芳香环平面度             │
│ · 过滤 PB-invalid 构象     │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 8: ADMET 预测         │  技能: bio-admet-prediction
│ · ADMETlab 3.0 批量预测    │
│ · Lipinski/Veber 类药性    │
│ · hERG/CYP/AMES 毒性       │
│ · PAINS 结构警报            │
└──────────┬───────────────┘
           ▼
┌──────────────────────────┐
│ Step 9: 自由能精排序       │  技能: bio-free-energy-calculations
│ · RBFE 热力学循环          │
│ · MBAR 分析                │
│ · 闭环验证                 │
│ · 或 Boltz-2 快速替代      │
└──────────────────────────┘

Step 1: 结构获取

技能:bio-structural-biology-alphafold-predictions

目标

获取 BRD4-BD1 的三维结构坐标文件。优先策略:PDB 有实验结构则直接用;无则从 AlphaFold DB 获取预测模型。

决策表:AFDB 使用 vs 重新预测

情况 用 AFDB 重新预测
单条 UniProt 单体,折叠层面问题 是 否
需要复合物/界面 否(仅单体) 是 — AF3 / AF-Multimer
需要配体/离子/辅因子/PTM 否 是 — AF3 或对接到实验结构
设计突变体不在 UniProt 中 否 是
需要特定构象状态 否(单一状态) 是(子采样 MSA)

BRD4-BD1 决策:PDB 中有多个 BRD4-BD1 实验结构(如 3MXF, 4LYI),优先使用实验 holo 结构(含已知配体)。若需 AlphaFold 模型作为补充:

代码:从 AlphaFold DB 获取模型

import requests

def afdb_metadata(accession):
    """查询 AFDB 元数据接口,返回当前下载 URL"""
    url = f'https://alphafold.ebi.ac.uk/api/prediction/{accession}'
    r = requests.get(url)
    r.raise_for_status()
    return r.json()  # list;每个片段/异构体一个对象

def fetch_afdb(accession, out_dir='.'):
    """下载坐标文件和 PAE 矩阵"""
    entries = afdb_metadata(accession)
    if not entries:
        return None  # >2700aa 非人源蛋白或非 UniProt 序列常缺失
    entry = entries[0]
    cif_text = requests.get(entry['cifUrl']).text
    pae_json = requests.get(entry['paeDocUrl']).json()
    cif_path = f"{out_dir}/AF-{accession}.cif"
    with open(cif_path, 'w') as f:
        f.write(cif_text)
    return cif_path, pae_json

# BRD4 full-length UniProt: O60885
result = fetch_afdb('O60885')

关键注意点

陷阱 原因 正确做法
版本后缀 URL 404 AFDB 版本号会变(v4→v6) 从 /api/prediction/{accession} 动态获取 URL,不要手工拼
长蛋白只返回部分残基 人源 >2700aa 的蛋白会被分段(F1, F2…) 遍历所有 metadata 条目,不同片段间的相对位置不可信
AFDB 模型无配体/离子/辅因子 AFDB 是真空中单链预测 需要 holo 结构时用实验 PDB;需要复合物时用 AF3/Boltz
404/空列表 非人源大蛋白或非 UniProt 序列 重新预测或查 ESM Metagenomic Atlas

Step 2: 结构质量评估

技能:bio-structural-biology-alphafold-predictions

目标

读取 AlphaFold 模型的 pLDDT 和 PAE,判断哪些区域可信、哪些需裁剪。

pLDDT 置信度分级

pLDDT 等级 操作含义 可信用于
> 90 Very high 骨架和侧链方向均可信 侧链细节、催化几何假设、MR 核心
70-90 Confident 骨架基本正确 折叠、域拓扑、骨架级 MR;侧链需谨慎
50-70 Low 骨架不确定 仅粗略拓扑;不可信细节
< 50 Very low 占位符;通常是固有无序区 无序信号,不是构象

代码:提取 pLDDT 并分级

from Bio.PDB import MMCIFParser

def extract_plddt(cif_file):
    """从 B-factor 列读取 pLDDT(注意:与热运动 B-factor 极性相反)"""
    parser = MMCIFParser(QUIET=True)
    structure = parser.get_structure('af', cif_file)
    plddt = {}
    for residue in structure[0].get_residues():
        if residue.id[0] == ' ' and 'CA' in residue:
            # pLDDT 存在 B-factor 列中,但是置信度(0-100,越高越好)
            # 与热运动 B-factor 极性相反——切勿当作热运动读取
            plddt[residue.id[1]] = residue['CA'].get_bfactor()
    return plddt

def plddt_band(score):
    if score > 90:
        return 'very_high'
    if score >= 70:
        return 'confident'
    if score >= 50:
        return 'low'
    return 'very_low'   # <50: 通常是无序区(IDR),不是建模错误

plddt = extract_plddt('AF-O60885.cif')
mean_plddt = sum(plddt.values()) / len(plddt)
disordered = [res for res, s in plddt.items() if s < 50]  # 候选 IDR

代码:读取 PAE 判断域间可靠性

import numpy as np

def load_pae(pae_json):
    entry = pae_json[0] if isinstance(pae_json, list) else pae_json
    # 紧凑格式(2023+): 2D num_res × num_res 数组
    # 遗留 1D 'distance'/'residue1'/'residue2' 字段已移除
    return np.array(entry['predicted_aligned_error'])

def interdomain_confidence(pae, domain_a, domain_b):
    """PAE 不对称,取两个 off-diagonal block 的平均"""
    block = np.concatenate([pae[np.ix_(domain_a, domain_b)].ravel(),
                            pae[np.ix_(domain_b, domain_a)].ravel()])
    return block.mean()  # 低(约 <5Å)= 域间相对位置可信

pae = load_pae(result[1])

核心原则

pLDDT 是局部逐残基置信度,高均值 pLDDT 不保证域间相对位置正确。 两个域各 95 pLDDT 仍可能以未知相对方向飘浮——读 PAE 才能判断域间几何。

低 pLDDT 长段通常是真实的固有无序区(IDR),不是建模失败。 裁剪掉它会丢失真实生物学信息。pLDDT 与专门的 IDR 预测器具有竞争力(Akdel 2022, Piovesan 2022)。

关键陷阱

症状 原因 修复
模型”按柔度着色”看起来反了 B-factor 列被当作热运动读 它是 pLDDT(置信度,越高越好);按 pLDDT band 着色
删掉低 pLDDT 尾巴后已知 IDR 消失 把低 pLDDT 当”错误” 低 pLDDT 通常= 无序;保留并注释为 IDR
域间距离无意义但 pLDDT 都很高 信任了拼接卡通图 pLDDT 是局部的;读 PAE——高 off-diagonal PAE = 域间无约束
对接打分很好但验证差 对接到 apo AFDB 口袋 口袋缺配体/辅因子,rotamer 不可靠;用 holo 结构或柔性对接

Step 3: 受体结构制备

技能:bio-structural-biology-structure-preparation

目标

将原始 PDB/mmCIF 转化为加氢完全、质子化正确、缺失原子补齐的 docking-ready 受体。

核心原则

沉积或预测的结构不是模拟就绪的。 每个添加的原子、每个放置的质子、每段补建的 loop 都是假设而非测量。制备条件(pH、质子化模型、补建内容)必须随文件一起记录,否则下游 H-bond、盐桥、界面和对接结果不可复现。

工具选择决策表

任务 工具 最佳场景 失败/误导场景
补缺失重原子、短内部 loop PDBFixer 截短侧链、1-3 残基缺口 长/末端缺口、域级缺失
加 pH 氢、替换非标准残基 PDBFixer addMissingHydrogens(pH) 快速一键制备 忽略微环境 pKa 偏移
优化 Asn/Gln/His 翻转和 His 互变异构 reduce -build 解决酰胺/环方向歧义 当作 pKa 预测器——它优化几何而非滴定
预测残基 pKa / pH 依赖质子化 PROPKA (propka3) 判断哪些可滴定残基偏离标准态 当作精确实验 pKa
指定状态 + 写 PQR PDB2PQR --with-ph --ff --titration-state-method propka APBS/泊松-玻尔兹曼静电 力场不匹配时用作通用加氢
力场一致氢 + 显式变体 OpenMM Modeller.addHydrogens MD 系统构建 需要非标准态时变体留默认

质子化决策表:标准态 vs pKa 预测器

残基/情形 pH 7 标准态通常可用 需 pKa 预测器 + H-bond 优化
表面 Asp/Glu 去质子化 (-1) 仅当靠近金属或 H-bond 伙伴
埋藏或盐桥 Asp/Glu — pKa 可升数个单位 → 可能中性/质子化
表面 Lys/Arg 质子化 (+1) 埋藏 Lys 靠近酸性残基可中性
任意位置 His 默认歧义 几乎总是:按局部 H-bond 和金属配位选 HID/HIE/HIP
游离 Cys 中性硫醇 催化/金属配位 Cys 常为硫醇盐
二硫键 Cys S 上无 H (CYX) 先检测 SS 键;不要质子化

一句话规则:标准态仅对体相溶剂环境中的残基可辩护;任何埋藏、电荷簇集、金属邻接或口袋内的可滴定残基都需要预测器(PROPKA/H++)和 H-bond 网络 pass(reduce)。

代码:PDBFixer 制备管线

from pdbfixer import PDBFixer
from openmm.app import PDBFile

# 注意:finder 调用顺序很重要——残基 → 非标准 → 原子
# hydrogens 必须最后加(重原子存在后才能加氢)
fixer = PDBFixer(filename='receptor.pdb')

fixer.findMissingResidues()           # 短内部缺口 + 末端
fixer.findNonstandardResidues()       # 如 MSE(硒代蛋氨酸)
fixer.replaceNonstandardResidues()    # 映射回标准母体
fixer.removeHeterogens(keepWater=False)  # 去缓冲离子/冷冻保护剂
fixer.findMissingAtoms()              # 截短侧链 + 上面找到的残基
fixer.addMissingAtoms()               # 补重原子;补建的 loop 是假设,需记录

# pH 7.0 是一个选择,不是安全默认——需声明并匹配实验/生物条件
# addMissingHydrogens 检测二硫键并将那些 Cys 留为 CYX
fixer.addMissingHydrogens(pH=7.0)

with open('receptor_prepared.pdb', 'w') as out:
    PDBFile.writeFile(fixer.topology, fixer.positions, out, keepIds=True)

# 记录 provenance
built = [(ci, pos, name) for (ci, pos), names in fixer.missingResidues.items() for name in names]
print(f'built {len(fixer.missingResidues)} missing-residue segment(s), {len(built)} residue(s); pH=7.0')

代码:reduce 优化翻转和互变异构

import subprocess

# -build 执行 -OH -ROTEXOH -HIS -FLIP:加氢并优化 OH/His 旋转 + Asn/Gln/His 翻转
# reduce 通过小探针全原子接触评分优化方向(Word 1999)
with open('receptor_reduced.pdb', 'w') as out:
    subprocess.run(['reduce', '-build', 'receptor_prepared.pdb'], stdout=out, check=True)

# Reduce2(CCTBX/Phenix)是维护中的继承者:mmtbx.reduce2 receptor_prepared.pdb

代码:PROPKA pKa 预测 + PDB2PQR 生成 PQR/PDBQT

import subprocess

# propka3 写 receptor_prepared.pka;SUMMARY 列出预测 pKa vs 模型(标准)pKa
subprocess.run(['propka3', 'receptor_prepared.pdb'], check=True)

# PDB2PQR 通过 PROPKA 在 --with-ph 指定 pH 下指定质子化态,写出电荷/半径
# --ff 必须匹配下游力场;--with-ph 7.0 是声明的滴定条件
subprocess.run([
    'pdb2pqr30', '--ff=AMBER', '--with-ph', '7.0',
    '--titration-state-method', 'propka', '--keep-chain',
    'receptor_prepared.pdb', 'receptor.pqr',
], check=True)

# 再用 meeko mk_prepare_receptor.py 转 PDBQT
subprocess.run([
    'mk_prepare_receptor.py', '--read_pqr', 'receptor.pqr',
    '-o', 'receptor', '-p'
], check=True)

预测模型制备的特殊考虑

AlphaFold/ESMFold 模型制备时必须先裁剪低 pLDDT 区域,再加氢/质子化。口袋 rotamer 即使在骨架 pLDDT 高时也是最不可靠的原子。

# 1) 先裁剪低 pLDDT 残基(<50-70 = 不可靠)
#    phenix.process_predicted_model 做这个 + PAE 域分割
# 2) 然后对裁剪后模型运行 PDBFixer 管线
fixer = PDBFixer(filename='af_model_trimmed.pdb')
fixer.findMissingAtoms()
fixer.addMissingAtoms()
fixer.addMissingHydrogens(pH=7.0)  # 预测模型从不携带实验氢

关键陷阱

症状 原因 修复
制备文件没有氢 X-ray 模型极少分辨氢 显式调用 addMissingHydrogens(pH=...)
His H-bond/金属配位错 默认 HIE/HID 猜测未考虑局部网络 让 reduce 选中性互变异构(HID vs HIE);PROPKA 仅决定电荷态(HIP vs 中性)
埋藏 Asp/Glu 去质子化但应为中性 假设标准 pKa 7 预测 pKa(PROPKA/H++);质子化该残基(ASH/GLH)
addMissingAtoms 建出离谱 loop 长/末端缺口交给只做短 loop 的补全器 不在这里补长缺口;用 loop/同源建模器并标记
催化金属/辅因子被去掉 removeHeterogens() 清掉所有非水 heterogen 有目的地保留:显式过滤,不要批量移除
下游结果不可复现 制备文件未记录假设 记录 pH、质子化模型、每个补建原子/loop 作为 provenance

Step 4: 结合口袋检测

技能:bio-structural-biology-binding-site-detection

目标

在 apo 结构上检测候选口袋并评分,确定 docking 搜索框的中心坐标和大小。

核心原则

几何凹陷不自动等于功能或可成药位点。 fpocket 的 alpha 球或 CASTp 的表面拓扑会找到表面所有凹陷——包括结晶添加剂位点、非功能表面口袋和域间裂缝。口袋排名是假设而非结合位点。最可靠的位点是已被配体占据的位点(holo 结构)。

可成药性评分基于 holo 训练集,系统性低估 apo、浅口袋、别构位点和 PPI 口袋。 隐口袋在 apo 快照中完全不可见——仅在 MD 或构象系综中出现。

方法选择决策表

问题/情况 方法 最佳场景 失败/误导场景
快速枚举所有几何凹陷 fpocket 或 CASTp apo 或 holo 全表面扫描 报告添加剂位点和非功能口袋
按配体性/可成药性排名 P2Rank, fpocket 药性分, DoGSiteScorer 球状结构域上多口袋优先排序 训练于 holo/可成药集 → 低估 apo/shallow/allosteric
检测隐口袋/瞬态口袋 mdpocket over MD trajectory 位点仅在结合时打开 单一静态结构——隐口袋不可见

代码:fpocket 检测和排名

import subprocess
from pathlib import Path

def run_fpocket(pdb_path):
    subprocess.run(['fpocket', '-f', pdb_path], check=True)
    stem = Path(pdb_path).stem
    return Path(pdb_path).with_name(f'{stem}_out')

def parse_fpocket_info(out_dir):
    info = next(Path(out_dir).glob('*_info.txt'))
    pockets, current = [], None
    for raw in info.read_text().splitlines():
        line = raw.strip()
        if line.startswith('Pocket'):
            current = {'pocket': int(line.split()[1])}
            pockets.append(current)
        elif ':' in line and current is not None:
            key, val = (part.strip() for part in line.split(':', 1))
            try:
                current[key] = float(val)
            except ValueError:
                pass
    return pockets

out_dir = run_fpocket('receptor_prepared.pdb')
pockets = sorted(parse_fpocket_info(out_dir),
                 key=lambda p: p.get('Druggability Score', 0), reverse=True)
# 0.5 药性分是分诊线,不是定律
druggable = [p for p in pockets if p.get('Druggability Score', 0) >= 0.5]
for p in pockets[:5]:
    print(f"pocket {p['pocket']}: drug={p.get('Druggability Score', 0):.2f}")

代码:P2Rank ML 配体性评分

import csv
import subprocess
from pathlib import Path

def run_p2rank(pdb_path, out_dir='p2rank_out'):
    subprocess.run(['prank', 'predict', '-f', pdb_path, '-o', out_dir], check=True)
    return Path(out_dir) / f'{Path(pdb_path).name}_predictions.csv'

def parse_p2rank(csv_path):
    with open(csv_path) as fh:
        reader = csv.DictReader(fh, skipinitialspace=True)  # P2Rank 列名有空格
        rows = [{k.strip(): v.strip() for k, v in row.items()} for row in reader]
    return [{'rank': int(r['rank']), 'score': float(r['score']),
             'probability': float(r['probability'])} for r in rows]

predictions = parse_p2rank(run_p2rank('receptor_prepared.pdb'))
top = predictions[0]
print(f"top pocket: probability={top['probability']:.2f} score={top['score']:.2f}")

正交验证信号

口袋检测排名需要以下信号交叉验证:

  1. 独立检测器一致性:fpocket 和 P2Rank 是否排名同一个口袋为 top
  2. 口袋内衬残基的进化保守性(ConSurf):功能位点通常保守,添加剂/晶体裂缝不保守
  3. 热点/混合溶剂作图(FTMap, mixed-solvent MD)
  4. 同源 holo 结构
  5. 已知生物学信息

关键陷阱

症状 原因 修复
排名第一的口袋是表面添加剂位点 几何找到所有凹陷 交叉检查口袋原子 vs 输入中的 HETATM/添加剂
已知结合位点完全漏掉 位点是隐口袋——apo 快照中关闭 运行 mdpocket over MD/NMR 系综
真实靶点药性分全低 评分训练于 holo/可成药集 低分不等于”无位点”;用独立方法佐证
P2Rank parse KeyError CSV 列名有前导空格 用 csv.DictReader(skipinitialspace=True) 并 strip keys
AlphaFold 口袋对接差 口袋内衬 rotamer 最不可靠 先验证/制备模型;优先用 holo 实验结构

Step 5: 配体库制备

技能:bio-virtual-screening(配体制备部分)

目标

从 SMILES 生成 3D docking-ready 配体文件,包含正确的质子化和构象。

代码:RDKit + meeko 配体制备

from rdkit import Chem
from rdkit.Chem import AllChem
from meeko import MoleculePreparation, PDBQTWriterLegacy

def prepare_ligand(smiles, pdbqt_out):
    mol = Chem.MolFromSmiles(smiles)
    if mol is None:
        raise ValueError(f'invalid SMILES: {smiles}')
    mol = Chem.AddHs(mol)

    # ETKDGv3 3D 构象嵌入
    embed_status = AllChem.EmbedMolecule(mol, AllChem.ETKDGv3())
    if embed_status != 0:
        raise RuntimeError('ETKDGv3 failed to generate a ligand conformer')

    # MMFF94 能量最小化
    if not AllChem.MMFFHasAllMoleculeParams(mol):
        raise ValueError('MMFF94 parameters unavailable for this ligand')
    optimization_status = AllChem.MMFFOptimizeMolecule(mol)
    if optimization_status != 0:
        raise RuntimeError('MMFF94 optimization did not converge')

    # meeko 0.5+ API:prepare() 返回 MoleculeSetup 列表
    # 用 PDBQTWriterLegacy.write_string() 生成 PDBQT
    mk_prep = MoleculePreparation()
    setups = mk_prep.prepare(mol)
    pdbqt_text, is_ok, err = PDBQTWriterLegacy.write_string(setups[0])
    if not is_ok:
        raise RuntimeError(f'meeko PDBQT export failed: {err}')
    with open(pdbqt_out, 'w') as f:
        f.write(pdbqt_text)
    return pdbqt_out

# 批量制备
library = [
    'CC(=O)c1ccccc1',      # acetophenone
    'O=C(O)c1ccccc1O',     # salicylic acid
    # ... 更多 SMILES
]
for i, smi in enumerate(library):
    prepare_ligand(smi, f'ligand_{i:04d}.pdbqt')

关键注意点

陷阱 原因 修复
MolFromSmiles 不预测 pH 7.4 质子化 它只解析提供的 SMILES 状态 需先用 pKa/protomer 工具生成正确质子化态
Uncharger 不预测质子化 它仅中和形式电荷 用专门工具预测 pH 7.4 下的质子化
meeko 0.5+ API 变化 prep.write_pdbqt_file() 已废弃 用 PDBQTWriterLegacy.write_string(setups[0])
Histidine 质子化不一致 受体用 pH 7.4,配体用 pH 7.0 统一 pH,用 PROPKA 检查催化残基

Step 6: 层次化虚拟筛选

技能:bio-virtual-screening

目标

对 10M+ 化合物库进行三阶段过滤,从全库筛到 top-1000 候选。

Docking 工具分类

工具 评分函数 最佳场景 失败场景
AutoDock Vina 1.2 Vina(经验) 开放、表征良好的基线 交叉对接;隐口袋;金属中心
SMINA Vina + 灵活 + 自定义 自定义评分;柔性侧链 Vina 评分同样的注意事项
GNINA 1.1 CNN 或 Vina 评分 CNN 辅助 pose 排序 新化学型 OOD
DiffDock-L 扩散生成 交叉对接 pose 采样 需 PoseBusters 验证
Boltz-2 + GNINA rescore 基础模型 + CNN 实验性多模型工作流 独立基准每个证据流

场景决策树

场景 推荐工作流
自对接(已知配体口袋) GNINA --cnn_scoring rescore
交叉对接(apo 或相关靶点结构) DiffDock-L pose + GNINA rescore + PoseBusters
超大库(10M+) 校准层次筛选:性质/警报分诊 → Vina → GNINA → 高成本后续
别构/未定义位点 P2Rank 口袋检测 → 对所有口袋做系综对接
金属配位配体 GOLD(商业)或手动参数化 Vina 金属评分
Hit-to-lead 精修 用共晶结构;MD 弛豫受体;FEP 亲和力

代码:Vina 单配体对接

from vina import Vina

def dock_single(receptor_pdbqt, ligand_pdbqt, center, box_size,
                exhaustiveness=8, n_poses=10):
    """
    center: (x, y, z) 口袋中心坐标
    box_size: (x, y, z) 搜索框大小
    """
    v = Vina(sf_name='vina')
    v.set_receptor(receptor_pdbqt)
    v.set_ligand_from_file(ligand_pdbqt)
    v.compute_vina_maps(center=center, box_size=box_size)
    v.dock(exhaustiveness=exhaustiveness, n_poses=n_poses)
    return v.energies(), v.poses()

代码:GNINA CNN 重打分

gnina -r receptor.pdb -l ligand.sdf \
      --autobox_ligand reference_ligand.sdf \
      --cnn_scoring rescore \
      -o poses.sdf.gz \
      --num_modes 9 --exhaustiveness 8

--cnn_scoring 模式说明:

模式 行为 计算开销
none 无 CNN;全程经验评分 最低
rescore(默认) 经验搜索 + CNN 重排最终 pose CNN 选项中最低
refinement CNN 精修 pose 并排名 ~10x rescore
metrorescore CNN 在 Metropolis 搜索中评分 中等
metrorefine CNN 在搜索和精修中均评分 高
all 全程 CNN 极高,不推荐

代码:层次化虚拟筛选管线

import pandas as pd
from concurrent.futures import ProcessPoolExecutor
from functools import partial

def vs_pipeline(library_smi, receptor_pdbqt, center, box, output_dir, n_workers=16):
    # Stage 0: 读取化合物库
    df = pd.read_csv(library_smi)

    # Stage 1: 类药性过滤(Lipinski + Veber + PAINS)
    df_stage1 = drug_like_filter(df)  # 委托给 admet-prediction 技能

    # Stage 2: Vina 对接全过滤后库
    worker = partial(vina_dock, receptor_pdbqt=receptor_pdbqt,
                     center=center, box=box)
    with ProcessPoolExecutor(max_workers=n_workers) as ex:
        affinities = list(ex.map(worker, df_stage1['smiles']))
    df_stage1['vina_affinity'] = affinities

    # 取 Vina top 1%
    df_stage2 = df_stage1.nsmallest(int(len(df_stage1) * 0.01), 'vina_affinity')

    # Stage 3: GNINA CNN 重打分 top 1%
    df_stage2['gnina_affinity'] = df_stage2['smiles'].apply(
        lambda smi: gnina_rescore(smi, receptor_pdbqt, center, box))

    # 取 GNINA top 1000
    df_stage3 = df_stage2.nsmallest(1000, 'gnina_affinity')

    # Stage 4: Pose 物理验证
    return pose_validate(df_stage3)  # 委托给 pose-validation 技能

Vina vs GNINA 分歧调解表

Vina top pose GNINA top pose 行动
同一 pose,分数相似 同一 pose,分数相似 视为支持证据;仍需物理验证
不同 pose 同口袋,不同方向 保留两者,对照靶点相关对照比较
Vina 极好,GNINA 一般 不同 pose,分数差异大 检查两个 pose;不要仅从分数分歧推断谁对
两者都差 大量配体分数相似偏低 可能口袋/蛋白构象错;重新考虑受体

关键陷阱

症状 原因 修复
Vina segfault PDBQT 损坏(原子名) 用 meeko 重新制备
GNINA 挂起 GPU OOM 减少并发;--num_modes 5
所有色预测结合能很差(-3 到 -5) 质子化错误;配体对框太大 重检 pKa;扩大框
配体间亲和力完全相同 受体 grid 未计算 dock 前调 v.compute_vina_maps()
GPU 模式慢 Vina 仅 CPU;仅 GNINA 用 GPU GNINA 用 GPU;Vina 用多核 CPU

Step 7: Pose 物理验证

技能:bio-pose-validation

目标

用 PoseBusters 对 docked poses 进行物理合理性验证,过滤 PB-invalid 构象。

核心原则

Pose 准确性和化学合理性是不同的维度。 在 PoseBusters Benchmark 上,DiffDock 的 top-pose RMSD ≤ 2Å 成功率为 72%,但 RMSD+PB-valid 联合成功率仅 47%——25 个百分点的差距。不要将此百分比泛化到其他数据集或更新模型版本。

PoseBusters 检查组

检查组 测试内容 2024 基准标准
Sanity 配体化学合理性 RDKit sanitization 通过
Bond lengths 键长在参考范围内 0.75–1.25 × RDKit 距离几何下界
Bond angles 1-3 距离在参考范围内 0.75–1.25 × RDKit 下界
Internal steric 无配体内 clash 对距离 > 0.70 × RDKit 下界
Aromatic planarity 芳香环平面 最大偏离拟合平面 ≤ 0.25 Å
Double-bond stereo Z/E 保持 匹配输入 SMILES
Internal energy 能量 vs 生成构象 UFF 能量比 ≤ 100 × 50 个生成弛豫构象均值
Volume overlap 与蛋白 vdW 重叠 < 7.5% 配体 vdW 体积
Minimum distance 无严重蛋白-配体 clash 距离 ≥ 0.75 × vdW 半径和
Chirality R/S 保持 匹配输入 SMILES

通过所有检查 = “PB-valid”。PB-valid + RMSD ≤ 2Å = 现代标准。

代码:PoseBusters 验证

from posebusters import PoseBusters
import pandas as pd

bust = PoseBusters(config='dock')  # 'dock' = 全检除 RMSD 参考

results = bust.bust(
    mol_pred='/path/to/docked_poses.sdf',
    mol_cond='/path/to/receptor.pdb',
)

# 聚合所有 bool 列为 pb_valid 标志
check_cols = [
    col for col in results.select_dtypes(include='bool').columns
    if not col.lower().startswith('rmsd')
]
results['pb_valid'] = results[check_cols].all(axis=1)
valid = results[results['pb_valid']]
print(f'{len(valid)} / {len(results)} poses are PB-valid')

配置选择

配置 包含检查 使用场景
redock 全检 + RMSD vs 参考 + 蛋白 vdW 重叠 自对接基准、回溯验证
dock 全检除 RMSD 参考 盲对接、前瞻性虚拟筛选
mol 仅配体内(sanity, bonds, angles, rings, stereo, energy) 构象 QC;无蛋白上下文

代码:应变能量化

from rdkit import Chem
from rdkit.Chem import AllChem

def ligand_strain(docked_sdf, n_ref=20):
    """量化 docked pose 偏离最低能量自由构象的程度"""
    suppl = Chem.SDMolSupplier(docked_sdf, removeHs=False)
    strains = []
    for docked in suppl:
        if docked is None:
            continue
        smi = Chem.MolToSmiles(docked)
        ref = Chem.MolFromSmiles(smi)
        if ref is None:
            strains.append({'strain': None, 'note': 'reference_parse_failed'})
            continue
        ref = Chem.AddHs(ref)
        props_ref = AllChem.MMFFGetMoleculeProperties(ref)
        if props_ref is None:
            strains.append({'strain': None, 'note': 'no_mmff_params'})
            continue
        conf_ids = list(AllChem.EmbedMultipleConfs(
            ref, numConfs=n_ref, params=AllChem.ETKDGv3()))
        if not conf_ids:
            strains.append({'strain': None, 'note': 'embedding_failed'})
            continue
        AllChem.MMFFOptimizeMoleculeConfs(ref)

        ref_energies = []
        for c in conf_ids:
            ff = AllChem.MMFFGetMoleculeForceField(ref, props_ref, confId=c)
            if ff is not None:
                ref_energies.append(ff.CalcEnergy())
        min_ref = min(ref_energies) if ref_energies else None

        # 加 H 坐标,弛豫 H 同时固定重原子
        docked_h = Chem.AddHs(Chem.Mol(docked), addCoords=True)
        if docked_h.GetNumAtoms() != ref.GetNumAtoms():
            strains.append({'strain': None, 'note': 'atom_mismatch'})
            continue
        props_docked = AllChem.MMFFGetMoleculeProperties(docked_h)
        docked_ff = AllChem.MMFFGetMoleculeForceField(docked_h, props_docked) \
            if props_docked is not None else None
        if docked_ff is not None:
            for atom in docked_h.GetAtoms():
                if atom.GetAtomicNum() != 1:
                    docked_ff.AddFixedPoint(atom.GetIdx())
            docked_ff.Minimize(maxIts=200)
            docked_e = docked_ff.CalcEnergy()
            strains.append({
                'min_ref_energy': min_ref,
                'docked_energy': docked_e,
                'strain': docked_e - min_ref,
                'note': 'ok'
            })
        else:
            strains.append({'strain': None, 'note': 'docked_ff_failed'})
    return strains

RMSD vs PB-valid 调解表

RMSD ≤ 2Å PB-valid 行动
是 是 物理合理且接近参考;仍需验证下游任务适用性
是 否 接近参考但某项合理性检查未过;检查失败项
否 是 物理合理但与参考不同;调查对齐、蛋白状态和替代结合模式
否 否 与参考不同且不合理;检查两方面再决定是否拒绝

关键陷阱

症状 原因 修复
期望的检查缺失 输入加载失败或配置省略 检查返回 DataFrame、加载状态列和输入格式
全检通过但 pose 无效 受体文件格式错 用带氢的 PDB;PDBQT 可能不工作
vdW 重叠假阳性(共价) 共价键被计为 clash 用共价对接专用验证
应变计算慢 参考构象太多 n_ref 减到 5-10

Step 8: ADMET 预测

技能:bio-admet-prediction

目标

对 top hits 进行 ADMET 性质预测和类药性筛选,排除有毒性或药代性质差的化合物。

ADMET 模型分类

工具 端点数 架构 不确定性 访问方式 失败场景
ADMETlab 3.0 119 特征(77 模型 + 34 计算性质 + 8 规则) 多任务 DMPNN + 描述符 证据不确定性 Web 服务/ API OOD;金属;大环
ADMET-AI TDC 衍生 Chemprop D-MPNN 版本相关 Python 包 v2 与 v1/服务器不同
chemprop(自建) 用户定义 D-MPNN ± 描述符 集成 Python 包 需充足训练数据
ProTox-3.0 61 毒性端点 RF/DNN + 相似性 置信分 Web 服务 仅毒性

场景决策树

场景 工作流 理由
库分诊,无内部数据 ADMETlab 3.0 API 批量 广覆盖 + 模型不确定性
单端点,有内部数据 chemprop D-MPNN 基准 按部署相关验证选择
需校准概率 chemprop 集成 + Platt DL 原生概率很少校准
心脏毒性倾向 ADMETlab hERG + ProTox-3.0 + 文献 多模型三角验证
药物-药物相互作用(CYP) CYP1A2/2C9/2C19/2D6/3A4 标准 5 个 CYP

代码:Lipinski/Veber 类药性筛选

from rdkit.Chem import Descriptors, Lipinski, QED
from rdkit.Chem.FilterCatalog import FilterCatalog, FilterCatalogParams

def druglike_score(mol):
    """计算类药性指标"""
    mw = Descriptors.MolWt(mol)
    logp = Descriptors.MolLogP(mol)
    hbd = Lipinski.NumHDonors(mol)
    hba = Lipinski.NumHAcceptors(mol)
    tpsa = Descriptors.TPSA(mol)
    rotbonds = Lipinski.NumRotatableBonds(mol)
    qed = QED.qed(mol)

    lipinski_violations = sum([mw > 500, logp > 5, hbd > 5, hba > 10])
    veber_pass = rotbonds <= 10 and tpsa <= 140
    bbb_simple_screen = tpsa <= 90 and mw <= 500 and hbd <= 3  # BBB 启发式

    return {'MW': mw, 'LogP': logp, 'HBD': hbd, 'HBA': hba,
            'TPSA': tpsa, 'RotBonds': rotbonds, 'QED': qed,
            'Lipinski_violations': lipinski_violations,
            'Veber_pass': veber_pass,
            'BBB_simple_screen': bbb_simple_screen}

def alerts(mol, catalogs=('PAINS_A', 'BRENK', 'ZINC')):
    """PAINS/BRENK/REOS 结构警报"""
    params = FilterCatalogParams()
    for cat in catalogs:
        params.AddCatalog(getattr(FilterCatalogParams.FilterCatalogs, cat))
    catalog = FilterCatalog(params)
    hits = catalog.GetMatches(mol)
    return [h.GetDescription() for h in hits]

ADMETlab 3.0 端点样例

类别 端点示例
吸收 Caco-2 通透性、HIA (%)、Pgp 抑制剂/底物、MDCK
分布 BBB+、PPB (%)、VDss (L/kg)、Fu(游离分数)
代谢 CYP1A2/2C9/2C19/2D6/3A4 抑制剂/底物
排泄 CL (mL/min/kg)、T1/2 (h)
毒性 hERG、AMES、肝毒性(DILI)、致癌性、免疫毒性、致突变性
类药性 Lipinski, Veber, Ghose, Egan, Muegge, QED, SAscore

hERG 心脏毒性端点

模型 架构 训练数据 AUC
Shan et al. D-MPNN + MOE D-MPNN + 206 MOE 7,889 化合物 0.956
CardioTox-net 五 DL + 神经元集成 BindingDB + ChEMBL 0.930
ADMETlab 3.0 hERG DMPNN 多任务 内部 0.92
ProTox-3.0 心脏毒性 RF 5,252 ChEMBL 0.86 CV / 0.95 外部

单模型概率 > 0.5 不是 kill signal。 需多模型三角验证 + 文献检索 + 考虑暴露量 vs hERG 效力。

PAINS 作为 kill filter 的陷阱

PAINS 校准的是 HTS 分析干扰,不预测药物开发失败。将 PAINS 匹配作为排除标准会从库中清除有效先导物(如姜黄素类似物、多酚天然产物)。正确做法是标记 PAINS 命中以便正交分析确认,而非预先排除。

模型间调解

当 ADMETlab、ProTox-3.0 和 chemprop 在 hERG 上不一致:

情况 行动
全预测 hERG+ 更高关注;计划体外膜片钳
结果分歧 检查适用域、活性阈值和测定定义再决定
全预测 hERG- 较低关注,但临床候选和新化学型仍考虑体外筛选
不要将相关模型当作独立证据 仅仅因为托管在不同服务上

OECD QSAR 五支柱(监管级)

  1. 明确定义端点 — 具体生物测定、单位、条件
  2. 明确算法 — 可复现模型 + 代码
  3. 定义适用域(AD) — 模型有效的范围
  4. 适当统计验证 — 外部测试集、交叉验证
  5. 机制解释 — 生物/化学原理

关键陷阱

症状 原因 修复
ADMETlab API 超时 服务负载/配额 遵循批量限制;退避重试
chemprop 过拟合 随机拆分 用骨架拆分 --split scaffold_balanced
hERG 预测 50/50 OOD 检查适用域(kNN 距离、集成方差)
QED 计算失败 分子缺失/未 sanitize 拒绝解析失败;sanitize 输入
预测跨运行不一致 chemprop 集成随机种子 --seed 42 并复用模型
校准不匹配 DL 原生概率未校准 在验证集上 Platt scaling

Step 9: 自由能精排序

技能:bio-free-energy-calculations

目标

对 top 候选化合物进行相对结合自由能(RBFE)计算,以物理方法精确排序类似物。

FEP 方法分类

方法 成本/对 精度 适用场景 失败场景
FEP+(Schrödinger) 系统/协议相关 GPU 商业 RBFE 商业先导优化 许可和复现约束
OpenFE RBFE 系统/协议相关 GPU 开源 RBFE 开源项目 映射/设置/采样需审查
GROMACS/AMBER RBFE 实现相关 自定义 专家控制 手动验证负担
MM/PBSA / MM/GBSA 低成本端点 近似端点分 系列内探索排序 熵、采样、模型依赖
Boltz-2 affinity 秒级 GPU 基准相关 ML 替代;≥1000x 更快 新化学型

场景决策树

场景 推荐工作流
排序近似物(R-group SAR) RBFE via OpenFE(循环:lig1↔lig2↔lig3)
跨骨架排序 ABFE 每个配体;或协调 RBFE 星形网络
同源先导优化集 RBFE + 连通冗余感知扰动图
单配体亲和力 ABFE(无需参考化合物)
低成本探索排序 项目验证端点或 ML 方法 + 正交确认
选择性(靶点 vs 脱靶) 两个蛋白上 RBFE;报告 delta-delta-G
别构 vs 正构 ABFE 可比;用 MD 检查 pose 稳定性

RBFE 热力学循环

ΔΔG_binding = ΔG_lig1→lig2(bound) - ΔG_lig1→lig2(solvent)

代码:OpenFE RBFE 设置

from openfe import SmallMoleculeComponent, ProteinComponent, SolventComponent
from openfe.protocols.openmm_rfe import RelativeHybridTopologyProtocol

protein = ProteinComponent.from_pdb_file('receptor_prepared.pdb')
ligA = SmallMoleculeComponent.from_sdf_file('ligand_A.sdf')
ligB = SmallMoleculeComponent.from_sdf_file('ligand_B.sdf')
solvent = SolventComponent()

protocol = RelativeHybridTopologyProtocol(
    RelativeHybridTopologyProtocol.default_settings()
)
# 需创建/检查原子映射(Kartograf 是 OpenFE 1.7 CLI 默认映射器)
# 构建 bound 和 solvent Transformation 对象
# 通过 openfe quickrun 或 Python 执行接口运行

Lambda 窗口调度

阶段 Lambda 值 目的
解耦(vdW) 0.0, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 1.0 关闭配体 vdW
充电(Coulomb) 0.0, 0.25, 0.5, 0.75, 1.0 关闭配体部分电荷
约束(仅 ABFE) 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0 Boresch 式约束

代码:MBAR 分析

from alchemlyb import concat
from alchemlyb.parsing import gmx
from alchemlyb.estimators import MBAR
from alchemlyb.postprocessors.units import to_kcalmol

u_nks = []
for window in range(12):
    df = gmx.extract_u_nk(f'window_{window}.xvg', T=300)
    u_nks.append(df)

u_nk = concat(u_nks)
mbar = MBAR().fit(u_nk)
delta_g = to_kcalmol(mbar.delta_f_).iloc[0, -1]
d_delta_g = to_kcalmol(mbar.d_delta_f_).iloc[0, -1]
print(f'ΔG: {delta_g:.2f} ± {d_delta_g:.2f} kcal/mol')

代码:闭环验证

def cycle_closure_residual(cycle):
    """cycle = [(lig_i, lig_j, delta_g, sd), ...]"""
    total = sum(d_g for _, _, d_g, _ in cycle)
    total_var = sum(sd**2 for _, _, _, sd in cycle)
    return total, total_var ** 0.5

# 残差应与传播不确定性一致(在 ~2σ 内)

力场选择

力场 用于 备注
OPLS4(Schrödinger) FEP+ 默认 商业;测试充分
OpenFF 2.1.1 (Sage) OpenFE 1.7 默认 检查序列化设置
GAFF2 AMBER FEP 仅配体;蛋白 FF14SB
CGenFF CHARMM 系 FEP CHARMM 力场族

Boltz-2 快速替代

Boltz-2 报告在评估基准上亲和力精度接近 FEP,至少 1000 倍速度优势。但结果是基于特定基准的,不建立对任意 ChEMBL 数据的通用 RMSE 或相关性。新化学型或模态超出演示的训练/基准域时不应单独依赖。

  • 何时用 Boltz-2:hit 发现分诊用 affinity_probability_binary;hit-to-lead 用 affinity_pred_value
  • 何时不依赖 Boltz-2:新化学型/模态超出版本域,或无靶点相关验证的生产决策

关键陷阱

症状 原因 修复
Lambda 窗口模拟发散 初始 pose 差 先用 MM 最小化弛豫 pose
闭环残差与不确定性不一致 采样/映射/力场/相关边问题 检查有符号残差、重叠、映射和独立重复
MBAR 返回 NaN 窗口间重叠不足 添加中间 lambda 窗口
ABFE 系统偏移 约束/标准态/采样/力场问题 检查协议文档化的约束/自由能项和符号
MM/GBSA 排序与对接不符 不同轨迹帧 在 MD 弛豫 pose 上计算 MM/GBSA
Boltz-2 亲和力全 0 输入格式错 检查 SMILES 有效性;先标准化

全流程总结图

靶点蛋白 BRD4-BD1 (O60885)
    │
    ├─ PDB 实验结构 (h3MXF) ──────────────────────────────┐
    │                                                      │
    └─ AlphaFold DB (O60885) ─┐                           │
         │                     │                           │
         ▼                     │                           │
    pLDDT/PAE 评估              │                           │
    裁剪低置信区域               │                           │
         │                     │                           │
         ▼                     ▼                           ▼
    ┌────────────────────────────────────────────────────────┐
    │           受体结构制备 (PDBFixer + PROPKA + reduce)     │
    │           补缺失原子 → 加氢 → 质子化 → PDBQT            │
    └────────────────────────┬───────────────────────────────┘
                             │
    ┌────────────────────────▼───────────────────────────────┐
    │  口袋检测 (fpocket + P2Rank)  ← 如果是 apo             │
    │  或从 holo 共晶配体中心定义搜索框                       │
    └────────────────────────┬───────────────────────────────┘
                             │
                  ┌──────────┴──────────┐
                  │                     │
            配体库制备               受体 PDBQT
          (RDKit + meeko)              │
                  │                     │
                  └──────────┬──────────┘
                             │
    ┌────────────────────────▼───────────────────────────────┐
    │  Stage 1: 类药性过滤 (Lipinski + Veber + PAINS)        │
    │  Stage 2: Vina 对接 (exhaustiveness=8, 并行)           │
    │  Stage 3: GNINA CNN rescore top 1%                    │
    │  Stage 4: PoseBusters 物理验证 top 1000               │
    │  Stage 5: ADMET 预测 (ADMETlab 3.0 + hERG + CYP)      │
    └────────────────────────┬───────────────────────────────┘
                             │
                    top ~50 候选
                             │
    ┌────────────────────────▼───────────────────────────────┐
    │  自由能精排序                                          │
    │  · 同系列: RBFE (OpenFE, MBAR, 闭环验证)              │
    │  · 跨骨架: ABFE 或 Boltz-2 快速分诊                    │
    └────────────────────────┬───────────────────────────────┘
                             │
                    top 5-10 候选
                             │
                    ▼
              实验验证 (SPR / ITC)

涉及技能一览表

步骤 技能名称 主要工具 核心功能
Step 1 bio-structural-biology-alphafold-predictions requests, Bio.PDB AFDB 模型获取与置信度解读
Step 2 bio-structural-biology-alphafold-predictions numpy pLDDT 分级、PAE 域间分析
Step 3 bio-structural-biology-structure-preparation PDBFixer, PROPKA, reduce, PDB2PQR 受体制备:加氢、质子化、补原子
Step 4 bio-structural-biology-binding-site-detection fpocket, P2Rank 结合口袋检测与可成药性评分
Step 5 bio-virtual-screening (ligand prep) RDKit, meeko SMILES → 3D PDBQT
Step 6 bio-virtual-screening AutoDock Vina, GNINA 层次化虚拟筛选
Step 7 bio-pose-validation PoseBusters, RDKit Pose 物理合理性验证 + 应变能
Step 8 bio-admet-prediction ADMETlab 3.0, RDKit, chemprop ADMET 预测与类药性筛选
Step 9 bio-free-energy-calculations OpenFE, alchemlyb, MBAR RBFE/ABFE 自由能精排序
补充 bio-ml-docking-rescoring DiffDock-L, Boltz-2, Chai-1 ML 对接与重打分(替代/补充)

量化阈值速查表

指标 阈值 含义 来源
pLDDT > 90 Very high 骨架+侧链方向可信 Jumper 2021
pLDDT 70-90 Confident 骨架基本正确 AFDB 定义
pLDDT 50-70 Low 仅粗略拓扑 AFDB 定义
pLDDT < 50 Very low 通常是无序区(IDR) Akdel 2022
PAE < 5Å(域间) 可信 域间相对位置有约束 AFDB
Druggability Score ≥ 0.5 可成药分诊线 药物分子可结合 Schmidtke 2010
Lipinski violations ≤ 1 类药 MW≤500, LogP≤5, HBD≤5, HBA≤10 Lipinski
Veber pass 可药 RotBonds≤10, TPSA≤140 Veber
PoseBusters PB-valid 物理合理 通过全部 ~20 项检查 Buttenschoen 2024
RMSD ≤ 2Å + PB-valid 现代标准 准确且合理 Buttenschoen 2024
芳香环偏离 ≤ 0.25Å 平面 芳香环非平面 = 不合理 PoseBusters
vdW 体积重叠 < 7.5% 无严重 clash 与蛋白的体积重叠 PoseBusters
内部应变能 ≤ 3 kcal/mol 低应变 ~70% 蛋白结合配体满足 Boström 1998
Vina affinity < -7 kcal/mol 可能活性 经验阈值(非保证) Vina 手册
闭环残差 < 2σ 一致 热力学循环闭合 最佳实践
hERG prob < 0.5 较低关注 需多模型三角验证 ADMETlab 3.0
BBB simple screen 可过 BBB TPSA≤90, MW≤500, HBD≤3 启发式
Exhaustiveness = 8 Vina 默认 可增到 16/32/64 Vina 手册

关键决策点汇总

1. 实验结构 vs 预测模型

  • PDB 有 holo 实验结构 → 直接用实验结构
  • PDB 只有 apo → 用 apo + 口袋检测,或考虑 MD 开口袋袋
  • 无实验结构 → AlphaFold DB → 检查 pLDDT/PAE → 裁剪后制备
  • 需要复合物 → AF3/Boltz-1/Chai-1

2. 对接策略选择

  • 有 holo 受体 + 已知口袋 → GNINA --cnn_scoring rescore
  • Apo 或预测受体 → DiffDock-L + GNINA rescore + PoseBusters
  • 超大库 → Vina → top 1% GNINA → top 0.1% Boltz-2/FEP
  • 金属/辅因子 → 需要专门力场(ZAFF, MCPB.py)

3. 自由能方法选择

  • 同系列类似物(R-group SAR)→ RBFE
  • 跨骨架 → ABFE
  • 快速分诊 → Boltz-2 affinity
    -低成本探索 → MM/GBSA(仅系列内排序)

4. ML vs 经典对接

  • Vina PB-valid + RMSD ≤ 2Å = 58%(PoseBusters Benchmark)
  • DiffDock PB-valid + RMSD ≤ 2Å = 12%(原始版本)
  • ML 模型 pose 必须 PoseBusters 验证(不是可选)
  • 保留采样器置信度、独立评分和物理验证作为分离的证据列

参考文献

  1. Jumper J, et al. (2021) Highly accurate protein structure prediction with AlphaFold. Nature 596:583-589.
  2. Varadi M, et al. (2024) AlphaFold Protein Structure Database in 2024. Nucleic Acids Res 52:D368-D375.
  3. Akdel M, et al. (2022) A structural biology community assessment of AlphaFold2 applications. Nat Struct Mol Biol 29:1056-1067.
  4. Word JM, et al. (1999) Asparagine and glutamine: using hydrogen atom contacts in the choice of side-chain amide orientation. J Mol Biol 285:1735-1747.
  5. Olsson MHM, et al. (2011) PROPKA3. J Chem Theory Comput 7:525-537.
  6. Dolinsky TJ, et al. (2004) PDB2PQR. Nucleic Acids Res 32:W665-W667.
  7. Le Guilloux V, et al. (2009) Fpocket. BMC Bioinformatics 10:168.
  8. Krivak R, Hoksza D (2018) P2Rank. J Cheminform 10:39.
  9. Trott O, Olson AJ (2010) AutoDock Vina. J Comput Chem 31:455-461.
  10. Eberhardt J, et al. (2021) Vina 1.2 features. J Chem Inf Model 61:3891-3898.
  11. McNutt AT, et al. (2021) GNINA 1.0 CNN docking. J Cheminformatics 13:43.
  12. Buttenschoen M, et al. (2024) PoseBusters. Chem Sci 15:3130-3139.
  13. Corso G, et al. (2024) DiffDock-L. ICLR.
  14. Passaro S, et al. (2025) Boltz-2. bioRxiv.
  15. Abramson J, et al. (2024) AlphaFold 3. Nature 630:493-500.
  16. Fu et al. (2024) ADMETlab 3.0. Nucleic Acids Res 52:W422-W431.
  17. Capuzzi et al. (2017) PAINS reality check. J Chem Inf Model 57:417.
  18. Wang L, et al. (2015) FEP+ method. J Am Chem Soc 137:2695-2703.
  19. Mey ASJS, et al. (2020) Alchemical free-energy best practices. Living J Comput Mol Sci 2:18378.
  20. Shirts MR, Chodera JD (2008) MBAR. J Chem Phys 129:124105.
  21. Boström J, et al. (1998) Conformational energy penalties of protein-bound ligands. J Comput-Aided Mol Des 12:383-396.
  22. Schmidtke P, Barril X (2010) Understanding and predicting druggability. J Med Chem 53:5858-5867.
  23. Cimermancic P, et al. (2016) CryptoSite: cryptic binding sites. J Mol Biol 428:709-719.
  24. Lyu et al. (2019) Ultralarge virtual-screening proof of concept. Nature 566:224-229.

AI生成 本文档由星辰超级智能体(TeleAgent)基于 bioSkills 技能库中以下 SKILL.md 文件编写:bio-structural-biology-alphafold-predictions、bio-structural-biology-structure-preparation、bio-structural-biology-binding-site-detection、bio-virtual-screening、bio-pose-validation、bio-admet-prediction、bio-free-energy-calculations、bio-ml-docking-rescoring。所有命令、参数和陷阱警告均来源于技能文件的原始内容。

AI生成