AI生成 本文档由星辰超级智能体(TeleAgent)基于 bioSkills 技能库自动生成,内容来源于以下技能的 SKILL.md 文件,经组织编排为端到端工作流教程。
你是一名药物化学研究员,收到一个新靶点蛋白——人源 BRD4 溴区结构域(BRD4-BD1, UniProt: O60885),需要:
- 获取该蛋白的三维结构(优先使用实验结构,无则用 AlphaFold 预测)
- 评估结构质量,判断哪些区域可信
- 制备受体结构(加氢、质子化、修补缺失原子)
- 检测结合口袋(如果是 apo 结构)
- 准备配体库(从 SMILES 生成 3D 构象)
- 进行层次化虚拟筛选(Vina → GNINA 重打分)
- 对 top hits 进行 PoseBusters 物理合理性验证
- ADMET 性质预测与类药性筛选
- 对最终候选化合物进行自由能计算(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 快速替代 │
└──────────────────────────┘
获取 BRD4-BD1 的三维结构坐标文件。优先策略:PDB 有实验结构则直接用;无则从 AlphaFold DB 获取预测模型。
| 情况 |
用 AFDB |
重新预测 |
| 单条 UniProt 单体,折叠层面问题 |
是 |
否 |
| 需要复合物/界面 |
否(仅单体) |
是 — AF3 / AF-Multimer |
| 需要配体/离子/辅因子/PTM |
否 |
是 — AF3 或对接到实验结构 |
| 设计突变体不在 UniProt 中 |
否 |
是 |
| 需要特定构象状态 |
否(单一状态) |
是(子采样 MSA) |
BRD4-BD1 决策:PDB 中有多个 BRD4-BD1 实验结构(如 3MXF, 4LYI),优先使用实验 holo 结构(含已知配体)。若需 AlphaFold 模型作为补充:
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 |
读取 AlphaFold 模型的 pLDDT 和 PAE,判断哪些区域可信、哪些需裁剪。
| pLDDT |
等级 |
操作含义 |
可信用于 |
| > 90 |
Very high |
骨架和侧链方向均可信 |
侧链细节、催化几何假设、MR 核心 |
| 70-90 |
Confident |
骨架基本正确 |
折叠、域拓扑、骨架级 MR;侧链需谨慎 |
| 50-70 |
Low |
骨架不确定 |
仅粗略拓扑;不可信细节 |
| < 50 |
Very low |
占位符;通常是固有无序区 |
无序信号,不是构象 |
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
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 结构或柔性对接 |
将原始 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 系统构建 |
需要非标准态时变体留默认 |
| 残基/情形 |
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)。
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')
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
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 |
在 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 |
位点仅在结合时打开 |
单一静态结构——隐口袋不可见 |
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}")
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}")
口袋检测排名需要以下信号交叉验证:
- 独立检测器一致性:fpocket 和 P2Rank 是否排名同一个口袋为 top
- 口袋内衬残基的进化保守性(ConSurf):功能位点通常保守,添加剂/晶体裂缝不保守
- 热点/混合溶剂作图(FTMap, mixed-solvent MD)
- 同源 holo 结构
- 已知生物学信息
| 症状 |
原因 |
修复 |
| 排名第一的口袋是表面添加剂位点 |
几何找到所有凹陷 |
交叉检查口袋原子 vs 输入中的 HETATM/添加剂 |
| 已知结合位点完全漏掉 |
位点是隐口袋——apo 快照中关闭 |
运行 mdpocket over MD/NMR 系综 |
| 真实靶点药性分全低 |
评分训练于 holo/可成药集 |
低分不等于”无位点”;用独立方法佐证 |
| P2Rank parse KeyError |
CSV 列名有前导空格 |
用 csv.DictReader(skipinitialspace=True) 并 strip keys |
| AlphaFold 口袋对接差 |
口袋内衬 rotamer 最不可靠 |
先验证/制备模型;优先用 holo 实验结构 |
从 SMILES 生成 3D docking-ready 配体文件,包含正确的质子化和构象。
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 检查催化残基 |
对 10M+ 化合物库进行三阶段过滤,从全库筛到 top-1000 候选。
| 工具 |
评分函数 |
最佳场景 |
失败场景 |
| 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 亲和力 |
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 -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 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 |
用 PoseBusters 对 docked poses 进行物理合理性验证,过滤 PB-invalid 构象。
Pose 准确性和化学合理性是不同的维度。 在 PoseBusters Benchmark 上,DiffDock 的 top-pose RMSD ≤ 2Å 成功率为 72%,但 RMSD+PB-valid 联合成功率仅 47%——25 个百分点的差距。不要将此百分比泛化到其他数据集或更新模型版本。
| 检查组 |
测试内容 |
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Å = 现代标准。
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 ≤ 2Å |
PB-valid |
行动 |
| 是 |
是 |
物理合理且接近参考;仍需验证下游任务适用性 |
| 是 |
否 |
接近参考但某项合理性检查未过;检查失败项 |
| 否 |
是 |
物理合理但与参考不同;调查对齐、蛋白状态和替代结合模式 |
| 否 |
否 |
与参考不同且不合理;检查两方面再决定是否拒绝 |
| 症状 |
原因 |
修复 |
| 期望的检查缺失 |
输入加载失败或配置省略 |
检查返回 DataFrame、加载状态列和输入格式 |
| 全检通过但 pose 无效 |
受体文件格式错 |
用带氢的 PDB;PDBQT 可能不工作 |
| vdW 重叠假阳性(共价) |
共价键被计为 clash |
用共价对接专用验证 |
| 应变计算慢 |
参考构象太多 |
n_ref 减到 5-10 |
对 top hits 进行 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 |
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]
| 类别 |
端点示例 |
| 吸收 |
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 |
| 模型 |
架构 |
训练数据 |
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 校准的是 HTS 分析干扰,不预测药物开发失败。将 PAINS 匹配作为排除标准会从库中清除有效先导物(如姜黄素类似物、多酚天然产物)。正确做法是标记 PAINS 命中以便正交分析确认,而非预先排除。
当 ADMETlab、ProTox-3.0 和 chemprop 在 hERG 上不一致:
| 情况 |
行动 |
| 全预测 hERG+ |
更高关注;计划体外膜片钳 |
| 结果分歧 |
检查适用域、活性阈值和测定定义再决定 |
| 全预测 hERG- |
较低关注,但临床候选和新化学型仍考虑体外筛选 |
| 不要将相关模型当作独立证据 |
仅仅因为托管在不同服务上 |
- 明确定义端点 — 具体生物测定、单位、条件
- 明确算法 — 可复现模型 + 代码
- 定义适用域(AD) — 模型有效的范围
- 适当统计验证 — 外部测试集、交叉验证
- 机制解释 — 生物/化学原理
| 症状 |
原因 |
修复 |
| ADMETlab API 超时 |
服务负载/配额 |
遵循批量限制;退避重试 |
| chemprop 过拟合 |
随机拆分 |
用骨架拆分 --split scaffold_balanced |
| hERG 预测 50/50 |
OOD |
检查适用域(kNN 距离、集成方差) |
| QED 计算失败 |
分子缺失/未 sanitize |
拒绝解析失败;sanitize 输入 |
| 预测跨运行不一致 |
chemprop 集成随机种子 |
--seed 42 并复用模型 |
| 校准不匹配 |
DL 原生概率未校准 |
在验证集上 Platt scaling |
对 top 候选化合物进行相对结合自由能(RBFE)计算,以物理方法精确排序类似物。
| 方法 |
成本/对 |
精度 |
适用场景 |
失败场景 |
| 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 稳定性 |
ΔΔG_binding = ΔG_lig1→lig2(bound) - ΔG_lig1→lig2(solvent)
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 值 |
目的 |
| 解耦(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 式约束 |
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 报告在评估基准上亲和力精度接近 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 手册 |
- PDB 有 holo 实验结构 → 直接用实验结构
- PDB 只有 apo → 用 apo + 口袋检测,或考虑 MD 开口袋袋
- 无实验结构 → AlphaFold DB → 检查 pLDDT/PAE → 裁剪后制备
- 需要复合物 → AF3/Boltz-1/Chai-1
- 有 holo 受体 + 已知口袋 → GNINA
--cnn_scoring rescore
- Apo 或预测受体 → DiffDock-L + GNINA rescore + PoseBusters
- 超大库 → Vina → top 1% GNINA → top 0.1% Boltz-2/FEP
- 金属/辅因子 → 需要专门力场(ZAFF, MCPB.py)
- 同系列类似物(R-group SAR)→ RBFE
- 跨骨架 → ABFE
- 快速分诊 → Boltz-2 affinity
-低成本探索 → MM/GBSA(仅系列内排序)
- Vina PB-valid + RMSD ≤ 2Å = 58%(PoseBusters Benchmark)
- DiffDock PB-valid + RMSD ≤ 2Å = 12%(原始版本)
- ML 模型 pose 必须 PoseBusters 验证(不是可选)
- 保留采样器置信度、独立评分和物理验证作为分离的证据列
- Jumper J, et al. (2021) Highly accurate protein structure prediction with AlphaFold. Nature 596:583-589.
- Varadi M, et al. (2024) AlphaFold Protein Structure Database in 2024. Nucleic Acids Res 52:D368-D375.
- Akdel M, et al. (2022) A structural biology community assessment of AlphaFold2 applications. Nat Struct Mol Biol 29:1056-1067.
- 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.
- Olsson MHM, et al. (2011) PROPKA3. J Chem Theory Comput 7:525-537.
- Dolinsky TJ, et al. (2004) PDB2PQR. Nucleic Acids Res 32:W665-W667.
- Le Guilloux V, et al. (2009) Fpocket. BMC Bioinformatics 10:168.
- Krivak R, Hoksza D (2018) P2Rank. J Cheminform 10:39.
- Trott O, Olson AJ (2010) AutoDock Vina. J Comput Chem 31:455-461.
- Eberhardt J, et al. (2021) Vina 1.2 features. J Chem Inf Model 61:3891-3898.
- McNutt AT, et al. (2021) GNINA 1.0 CNN docking. J Cheminformatics 13:43.
- Buttenschoen M, et al. (2024) PoseBusters. Chem Sci 15:3130-3139.
- Corso G, et al. (2024) DiffDock-L. ICLR.
- Passaro S, et al. (2025) Boltz-2. bioRxiv.
- Abramson J, et al. (2024) AlphaFold 3. Nature 630:493-500.
- Fu et al. (2024) ADMETlab 3.0. Nucleic Acids Res 52:W422-W431.
- Capuzzi et al. (2017) PAINS reality check. J Chem Inf Model 57:417.
- Wang L, et al. (2015) FEP+ method. J Am Chem Soc 137:2695-2703.
- Mey ASJS, et al. (2020) Alchemical free-energy best practices. Living J Comput Mol Sci 2:18378.
- Shirts MR, Chodera JD (2008) MBAR. J Chem Phys 129:124105.
- Boström J, et al. (1998) Conformational energy penalties of protein-bound ligands. J Comput-Aided Mol Des 12:383-396.
- Schmidtke P, Barril X (2010) Understanding and predicting druggability. J Med Chem 53:5858-5867.
- Cimermancic P, et al. (2016) CryptoSite: cryptic binding sites. J Mol Biol 428:709-719.
- 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生成