常规对接假设配体与蛋白只有非共价相互作用。共价抑制剂(见 379《共价抑制剂设计》)需要额外建模化学键的形成,这对对接程序提出了不同的要求。
共价对接的两种思路
| 思路 | 做法 | 适用 |
|---|---|---|
| 共价约束对接 | 先假设共价键已形成,把配体与目标残基当作一个整体优化 | 已知反应位点,评估结合姿势 |
| 非共价对接 + 几何筛选 | 常规对接,再筛选「弹头接近目标 Cys」的姿势 | 探索阶段,评估可行性 |
第二种思路常被低估但很实用:它直接回答「这个分子的弹头能不能够到那个半胱氨酸」——这是共价设计的核心几何问题。
方法一:AutoDock 的共价对接
# AutoDock 家族支持「柔性侧链」方式的共价对接
# 思路:把目标 Cys 侧链与配体合并成一个柔性单元
# 1) 构建共价加合物(配体 + Cys 侧链)
# 用化学软件手工构建,或用脚本自动化
# 2) 用 Meeko 准备(见 341)
mk_prepare_ligand.py -i covalent_adduct.sdf -o adduct.pdbqt
# 3) 对接时把该残基从受体中移除(因为它已在配体里)
# 4) 用位置约束保持 Cα 位置不变
vina --receptor receptor_no_cys.pdbqt --ligand adduct.pdbqt \
--center_x ... --size_x ... \
--exhaustiveness 32 --seed 42
# AutoDock4 的 flexible sidechain 方式更直接支持这一点
方法二:非共价对接 + 几何筛选(推荐起步)
from rdkit import Chem
from rdkit.Chem import AllChem
import numpy as np
from Bio.PDB import PDBParser
def screen_covalent_feasibility(docked_sdf, receptor_pdb,
cys_resnum, warhead_smarts,
max_dist=5.0, chain="A"):
"""筛选出弹头能够到目标半胱氨酸的对接姿势"""
# 获取目标 Cys 的 SG 原子坐标
parser = PDBParser(QUIET=True)
st = parser.get_structure("r", receptor_pdb)
sg_coord = None
for res in st[0][chain]:
if res.id[1] == cys_resnum and "SG" in res:
sg_coord = res["SG"].get_coord()
break
if sg_coord is None:
raise ValueError("未找到目标 Cys 的 SG 原子")
warhead = Chem.MolFromSmarts(warhead_smarts)
results = []
for mol in Chem.SDMolSupplier(docked_sdf, removeHs=False):
if mol is None:
continue
matches = mol.GetSubstructMatches(warhead)
if not matches:
continue
conf = mol.GetConformer()
# 找弹头反应中心(如丙烯酰胺的 β 碳)到 SG 的最短距离
best = 1e9
for match in matches:
for idx in match:
pos = np.array(conf.GetAtomPosition(idx))
d = np.linalg.norm(pos - sg_coord)
best = min(best, d)
results.append({
"name": mol.GetProp("_Name") if mol.HasProp("_Name") else "",
"score": float(mol.GetProp("minimizedAffinity"))
if mol.HasProp("minimizedAffinity") else None,
"warhead_to_sg": float(best),
"feasible": best <= max_dist,
})
return results
# 常用弹头的 SMARTS:
WARHEADS = {
"acrylamide": "[CX3](=O)[CX3]=[CX3]", # 丙烯酰胺
"chloroacetamide": "[CX3](=O)[CH2]Cl", # 氯乙酰胺
"vinyl_sulfone": "[SX4](=O)(=O)[CX3]=[CX3]",
"cyanoacrylamide": "[CX3](=O)[CX3](=[CX3])C#N",
}
res = screen_covalent_feasibility(
"docked.sdf", "receptor.pdb", cys_resnum=797,
warhead_smarts=WARHEADS["acrylamide"])
feasible = [r for r in res if r["feasible"]]
print(f"{len(feasible)}/{len(res)} 个姿势的弹头能够到目标 Cys")
距离判据:反应中心到 SG 的距离在 3~5 Å 范围内通常认为几何可行(考虑到侧链柔性与反应过渡态的需求)。超过 6~7 Å 基本不可行。
方法三:专用工具
| 工具 | 特点 |
|---|---|
| AutoDock4 / Vina 柔性侧链 | 开源,需手工构建加合物 |
| CovDock(Schrödinger) | 商业,流程完整 |
| Rosetta 共价对接 | 可定制,需编写协议 |
| GOLD 共价模式 | 商业 |
| DOCKovalent | 学术工具,专为共价虚拟筛选设计 |
共价对接不能告诉你什么
这是最重要的认知:共价对接建模的是几何可行性与结合姿势,而不是反应本身。它不能预测:
- 反应速率(kinact):这需要量子化学计算过渡态,或用 QM/MM 方法——成本高且精度有限;
- 半胱氨酸的实际反应性:Cys 的 pKa 受局部环境影响很大(附近碱性残基降低 pKa,使其成为更活泼的硫醇盐),而对接程序不建模这一点;
- 选择性:需要考虑全蛋白组中其它可及的半胱氨酸;
- 竞争反应:与 GSH 等细胞内亲核试剂的反应。
更完整的评估流程
# 1) 非共价对接 + 几何筛选
# → 弹头能否够到目标 Cys
# 2) 共价约束对接或最小化
# → 成键后的构象是否合理
# 3) MD 模拟
# → 共价复合物是否稳定
# → 需要共价键的力场参数(可能要自己参数化)
# 4) 量子化学(可选,成本高)
# → 用 QM/MM 计算反应能垒
# → 只对少数关键分子做
# 5) Cys pKa 预测
# → PROPKA 等工具估算目标 Cys 的 pKa
# → pKa 低(更易去质子化)= 反应性更高
# 6) 选择性分析
# → 在同源蛋白中该 Cys 是否保守?
# → 全蛋白组中还有哪些可及的 Cys?
# 7) 实验验证(不可替代)
# → k_inact/K_i 测定
# → 质谱确认修饰位点
# → ABPP 评估脱靶
虚拟筛选共价化合物
# 共价虚拟筛选的实用流程
#
# 1) 库准备:从化合物库中筛出含目标弹头的分子
from rdkit import Chem
warhead_pattern = Chem.MolFromSmarts(WARHEADS["acrylamide"])
covalent_library = [smi for smi in library
if (m := Chem.MolFromSmiles(smi)) is not None
and m.HasSubstructMatch(warhead_pattern)]
# 2) 常规对接(不建模共价键)
# 3) 几何筛选:弹头到目标 Cys 的距离
# 4) 综合排序:对接分数 + 几何可行性
# 注意:不能只看对接分数 ——
# 分数最好的姿势可能弹头朝向完全错误
# 5) 人工审查弹头的化学合理性
# 某些弹头虽然匹配 SMARTS,但化学环境使其反应性异常
常见坑与提示
- 「非共价对接 + 几何筛选」是最实用的起步方法,直接回答弹头能否够到;
- 反应中心到 SG 距离 3~5 Å 视为几何可行;
- 共价对接建模的是几何,不是反应速率——kinact 需要量化计算或实验;
- 不能只看对接分数,最高分的姿势可能弹头朝向完全错误。
延伸资源
- 共价设计:379《共价抑制剂设计》;对接基础:336《用 AutoDock Vina 跑 Docking》、182《AutoDock Vina》;
- 相互作用分析:338《用 ProLIF 提取相互作用指纹》。