版本差异
多数中文教程仍基于 AutoDockTools(MGLTools 1.5.7)图形界面和 Vina 1.1.2。下表列出照抄这些教程时会在 Vina 1.2.x 上出问题的地方。
| 环节 | 旧教程做法 | 当前做法 | 照抄旧做法的后果 |
|---|---|---|---|
| 受体/配体 PDBQT | ADT 图形界面加氢、算 Gasteiger 电荷、导出 PDBQT | Meeko:mk_prepare_receptor.py、mk_prepare_ligand.py | MGLTools 最后一次补丁在 2022 年,基于 Python 2,新系统上难以安装;Meeko 0.8.0 需要 Python ≥ 3.10 |
| 配体加氢与 3D | ADT 中“Add Hydrogens”,或 Open Babel 直接转换 | molscrub 的 scrub.py:默认 pH 7.4 枚举质子化态与互变异构,ETKDGv3 生成 3D | 质子化态不对会改变氢键供体/受体判定;2D 输入在对接中无法修正 |
| 日志 | vina --config conf.txt --log log.txt | vina ... | tee dock.log | Vina 1.2.x 已删除 --log,报 Command line parse error: unrecognised option '--log' |
| 盒子尺寸 | 在 ADT Grid Box 中读出 60×60×60(格点数) | 直接写 Å:size_x = 22 等 | ADT 显示的是格点数(间距 0.375 Å);抄进 Vina 就成了 60 Å 立方盒子,出现超过 27000 ų 的警告 |
| 电荷 | 强调给受体和配体算 Gasteiger 电荷 | Vina 打分不读部分电荷,只对 AD4 打分有影响 | 在电荷上花的时间不改变 Vina 结果;该花时间的是质子化态 |
| 安装 | pip install vina 后直接敲 vina | conda-forge 的 vina=1.2.7,同时提供 vina 命令和 Python 绑定 | pip 包只有 Python 绑定,敲 vina 报 command not found;PyPI 上 1.2.7 只有 Linux x86_64 预编译包,macOS 上 pip 报 Boost library location was not found! |
| 结果查看 | PyMOL 直接打开输出 PDBQT | mk_export.py 转成 SDF 再打开 | 新版 PyMOL 读 PDBQT 键级会错;Open Babel 推断键级对部分分子也不可能正确 |
| Vina 版本 | Vina 1.1.2 | Vina 1.2.7(2025-02) | 1.1.2 读不了 Meeko 为大环写出的 G0/CG0 伪原子,报 ATOM syntax incorrect |
安装
Vina 的 pip 包只含 Python 绑定,不含 vina 命令。PyPI 上 vina 1.2.7 只有 Linux x86_64(Python 3.8–3.12)的预编译包,在 macOS 上 pip 会转为源码编译,缺少 Boost 时报 Boost library location was not found!。conda-forge 的 vina 1.2.7 在 Linux 和 macOS 上同时提供 vina、vina_split 命令和 Python 绑定,下面的环境用它。Windows 用户在 WSL 中执行,或下载 GitHub Releases 中的 win.exe。本页实测:下面第 1 段命令在 macOS arm64(Apple M2)上用 micromamba 从零安装成功。
openbabel 和 RDKit 在新流程中只做辅助:RDKit 负责读写 SDF、给 PDB 配体补键级和算 RMSD;Open Babel 用于格式互转和 PLIP 的依赖,不再用来生成对接用的 PDBQT。
# 1) 环境:vina 用 conda-forge 包,它同时提供 vina、vina_split 命令和 Python 绑定
# (linux-64、linux-aarch64、osx-64、osx-arm64;Python 3.10-3.14)
micromamba create -n dock -c conda-forge python=3.11 rdkit gemmi prody pdbfixer openmm vina=1.2.7 -y
micromamba activate dock
# Meeko 0.8.0 与 molscrub 0.3.0 只在 PyPI 上有;molscrub 0.3.0 用到 joblib 但没有声明依赖,需要手动装
pip install meeko==0.8.0 molscrub==0.3.0 propka joblib
vina --version # AutoDock Vina v1.2.7
# 2) 不用 conda 时:从 GitHub Releases 下载对应平台的二进制
# 文件名后缀:linux_x86_64、linux_aarch64、mac_aarch64、mac_x86_64、win.exe
curl -fL -o vina https://github.com/ccsb-scripps/AutoDock-Vina/releases/download/v1.2.7/vina_1.2.7_linux_x86_64
chmod +x vina && ./vina --version
# pip install vina 只装 Python 绑定;PyPI 上 1.2.7 只有 Linux x86_64 的预编译包,
# macOS 上会转为源码编译并报 Boost library location was not found!
# 3) 可选:口袋预测与互作分析
# P2Rank 2.5.1:从 https://github.com/rdk/p2rank/releases 下载解压,需 Java,命令为 prank
# fpocket:micromamba install -c conda-forge -c bioconda fpocket
# PLIP:conda-forge 装 openbabel 后 pip install plip受体准备
Meeko 按模板逐个匹配残基,重原子必须与模板完全一致,氢可有可无。因此受体准备的重点是补全重原子并定好可滴定残基的状态。
选链与去水
同一 PDB 中有多条相同链时只保留一条(1IEP 取 A 链)。结晶水一般全部删除;如果文献表明某个水分子在多个结构中都介导配体结合,可以保留,或改用 Vina 文档中的 hydrated docking 流程(需 AD4 打分)。
补缺失原子与残基
缺侧链原子的残基会让 Meeko 报 Template matching failed for: [...]。用 PDBFixer --add-atoms=all 补齐。远离口袋的问题残基可以用 --delete_bad_res_from_box_radius 只删盒子外的部分;Meeko 0.8.0 中 -a/--allow_bad_res 已改名为 -x/--delete_bad_res。口袋附近缺失整段环时,先用同源结构或 AlphaFold 模型补全,再检查环构象。
质子化态按 pH 定
PDBFixer --ph 7.4 按该 pH 下最常见的变体加氢,只对中性组氨酸按氢键在 HID/HIE 之间选择,不计算环境 pKa。口袋内的 His、Asp、Glu、Lys、Cys 用 propka3 查 pKa;pKa 与目标 pH 相差不到 1 个单位的残基(此时另一种状态占比超过约 9%),要结合文献判断后用 Meeko -n 指定,例如 -n A:5,7=CYX,B:17=HID(ASH 为质子化 Asp,命名沿用 Amber)。
金属离子
活性位点金属(Zn、Mg、Fe、Ca 等)应保留,Meeko 自带这些离子的模板。用 PyMOL remove inorganic 一次性删掉所有离子是常见错误,会把催化锌一起删掉。锌蛋白可以使用 Vina 文档中的 AutoDock4Zn 流程(AD4 打分加锌伪原子)。
辅因子
NAD+、FAD、血红素等在生理状态下占据口袋一部分时应保留。Meeko 没有对应模板时,准备一个带正确质子化态的 SDF,用 --add_templates NAD:nad.sdf 传入。
AlphaFold 模型
先截掉口袋外 pLDDT < 70 的柔性区段,再按上面的步骤处理。AF2 模型是无配体状态,口袋侧链可能把口袋堵住;在 GPCR 上的系统评估显示,对接到 AF2 模型的位姿准确率与传统同源模型相当,明显低于对接到实验结构。
配体准备
mk_prepare_ligand.py 要求输入含全部氢原子的 3D 结构,推荐 SDF。PDB 格式没有键级信息,官方明确不建议用来准备小分子。
直接用 SMILES 或 2D 结构对接会出错,原因有两个:Vina 在对接中只旋转可旋转键,环保持输入时的构象,椅式/船式错误无法纠正;2D 平面输入是官方 FAQ 列出的对接失败原因之一。molscrub 会用 ETKDGv3 生成 3D 构象、做力场优化,并把六元环的船式改成椅式。
Vina 用联合原子打分,输出中的氢位置没有意义;但输入中的氢决定哪些原子是氢键供体或受体,所以质子化态会直接改变打分。以伊马替尼为例,pH 5–9 范围内 molscrub 会给出吡啶中性和吡啶质子化两个状态,哌嗪胺都质子化。
- 从 PubChem 下载的结构常带盐和反离子,scrub.py 默认只保留最大片段。
- 质子化态不确定时用 --ph_low 和 --ph_high 枚举多个状态,各自对接,报告最好的一个并注明状态。
- 手性中心未定义的 SMILES 要先确定立体构型。molscrub 0.3.0 没有立体异构体枚举选项,未定义的手性中心由 ETKDG 随机确定;需要枚举时先用 RDKit 的 EnumerateStereoisomers 展开成多条 SMILES,再交给 scrub.py。
- 大环分子:Meeko 默认让大环柔性,Vina 按 BRANCH 数计算构象熵罚,分数可能偏差 2 kcal/mol;比较时对所有分子用同一设置,必要时加 --rigid_macrocycles。
- 含硼、硅以外特殊元素或金属的配体,Vina 会报 Atom type ... is not a valid AutoDock type,需要自定义原子类型参数。
对接盒子
盒子越小,搜索越容易收敛;盒子之外的位置不会被搜索。Vina FAQ 的建议是“尽可能小,但不能更小”,超过 30×30×30 Å 时应同时提高 exhaustiveness。
盒子过小:配体部分原子被挤出盒子,Vina 只能给出被截断的构象或明显偏高的分数。盒子过大:同样的 exhaustiveness 下搜索不充分,结果在不同种子之间变化大。Feinstein 与 Brylinski 在 3659 个复合物上测得,立方盒子边长取配体回转半径的 2.857 倍时 Vina 位姿最准;“每维至少 22.5 Å”的通用盒子平均 RMSD 为 4.9 Å,优化后为 4.0 Å。
盲对接(盒子包住整个蛋白)在网络药理学论文中很常见。Che 与 Zhang 统计 2024 年 35 篇相关论文,17 篇使用或疑似使用盲对接;他们引用的 CASF-2016 数据中,Vina 盲对接的 RMSD < 2 Å 比例为 34–47%,对接到指定位点为 90.2%。
本页实测(P2Rank 2.5.1、fpocket 4.2.3,输入为上一节 PDBFixer 处理后的 1IEP A 链):P2Rank 第 1 名口袋(probability 0.937)的中心距晶体配体中心 3.0 Å,fpocket 第 1 名口袋的中心距 3.4 Å,口袋残基包含 Thr315 和 Met318。--box_enveloping xtal_lig.sdf --padding 5 生成 18.7×26.7×23.5 Å 的盒子;按 2.857 × 回转半径计算,晶体构象给出 19.1 Å,scrub.py 生成的构象给出 18.7 Å。P2Rank 在 8 核机器上单个结构约 1 分钟,输出 CSV 的列名带前导空格,用 pandas 读取时加 skipinitialspace=True。
# 晶体结构
prank predict -f protA_H.pdb -o p2rank_out
# AlphaFold、NMR、冷冻电镜结构:默认模型把 B 因子当特征,AlphaFold 的 B 因子列存的是 pLDDT
prank predict -c alphafold -f AF-model.pdb -o p2rank_out
# 第一行是排名最高的口袋,center_x/y/z 列即盒子中心
head -3 p2rank_out/protA_H.pdb_predictions.csv
# 交叉验证:fpocket 输出在 protA_H_out/ 目录
fpocket -f protA_H.pdb
# 用口袋中心和配体大小定盒子(Feinstein & Brylinski 2015:边长 = 2.857 x 回转半径)
python - <<'EOF'
from rdkit import Chem
from rdkit.Chem import Descriptors3D
m = Chem.MolFromMolFile("lig_scrub.sdf") # 默认去氢,只算重原子
print("cube edge (A):", round(2.857 * Descriptors3D.RadiusOfGyration(m), 1))
EOF
mk_prepare_receptor.py --read_pdb protA_H.pdb -o rec -p -v \
--box_center 12.3 45.6 7.8 --box_size 22 22 22| 情况 | 中心 | 尺寸 | 说明 |
|---|---|---|---|
| 有共晶配体 | 共晶配体重原子的几何中心 | 配体外接盒每边外扩 4–5 Å,或立方体边长 = 2.857 × 配体回转半径 | Meeko --box_enveloping xtal_lig.sdf --padding 5 一步完成 |
| 同源蛋白有共晶配体 | 把同源复合物叠合到目标蛋白后取其配体中心 | 同上 | 叠合后检查口袋残基是否对应 |
| 无共晶,文献给出关键残基 | 关键残基 Cα 的中心 | 20–25 Å 立方体(PoseBusters 基准用 25 Å) | 先用 P2Rank 确认这些残基确实围成口袋 |
| 无共晶、无文献 | P2Rank 排名第一的口袋中心,用 fpocket 交叉验证 | 按待对接配体回转半径计算 | 两者都指向同一位置时可信度更高;对排名前 2–3 的口袋分别对接并分别报告 |
| AlphaFold / 冷冻电镜结构 | P2Rank 加 -c alphafold | 同上 | 默认模型把 B 因子当特征,AlphaFold 文件中的 B 因子是 pLDDT |
参数
同一 seed 也不保证与别人的结果完全一致:随机数生成器来自 Boost,编译时的 Boost 版本不同,同一 seed 会得到不同轨迹。维护者的建议是各跑约 10 次,比较分数分布是否不同。Che 与 Zhang 引用的数据中,exhaustiveness 从 8 提到 64,中位 RMSD 从 3.37 Å 降到 2.21 Å,耗时约增加 8 倍。
本页实测(1IEP 重对接,--box_enveloping 加 5 Å 外扩得到 18.7×26.7×23.5 Å 盒子,其余条件见下一节):exhaustiveness 8、16、32、64 各跑 3 个种子(8 和 32 各补到 10 个种子),最佳构象 RMSD 都在 0.77–0.85 Å,分数在 −12.74 至 −12.82 kcal/mol 之间。单次运行的 CPU 时间(user)中位数分别为 109、281、362、821 s,墙钟时间中位数为 70、175、94、280 s(负载干扰大,只作量级参考)。这个盒子紧贴晶体配体,默认 8 已经 10/10 进入 2 Å;官方文档提到默认 8 偶尔找不到正确构象,大盒子或柔性更大的配体仍建议从 32 起步。同一台机器、同一个 vina 二进制、同一 seed 重复运行时,分数和构象完全相同。
| 参数 | 含义 | 默认值 | 建议 |
|---|---|---|---|
| exhaustiveness | 独立蒙特卡洛搜索的次数,同时限制并行线程数;耗时大致与它成正比 | 8 | 单个分子从 32 起步(官方 1IEP 示例用 32,文档说明默认 8 偶尔找不到正确构象);虚拟筛选可用默认 8 初筛,对排名靠前的分子再用 32 复核 |
| num_modes | 最多输出的构象数 | 9 | 一般保持 9。终端表格最多列出 9 个,输出文件只写入与最佳分数相差不超过 energy_range 的构象,所以文件里常常少于 9 个 |
| energy_range | 输出构象与最佳构象的最大分数差(kcal/mol) | 3 | 想看更多备选构象时调到 5 |
| min_rmsd | 输出构象之间的最小 RMSD | 1.0 Å | 一般不改 |
| seed | 随机种子 | 0(每次随机) | 每个分子至少 3 个种子;论文中写明种子值 |
| cpu | 线程数 | 0(自动检测全部核心) | exhaustiveness 小于核心数时,多余核心空闲 |
| spacing | 地图格点间距 | 0.375 Å | 不改;它不是盒子尺寸单位 |
| scoring | 打分函数:vina、vinardo、ad4 | vina | 不同打分函数的分数不能互相比较 |
完整命令
以 Vina 官方示例体系 1IEP(c-Abl 激酶 + 伊马替尼)为例,从 PDB 文件到分数与 RMSD 表。配体从 SMILES 出发,检验的是整套准备流程能否复现晶体构象。官方示例在 Vina 打分下最佳构象约 −13 kcal/mol。
本页实测(AutoDock Vina 1.2.7(conda-forge)、Meeko 0.8.0、molscrub 0.3.0、PDBFixer 1.12、RDKit 2025.09 与 2026.03;macOS arm64,Apple M2 8 核 16 GB;测试期间机器上同时运行其他任务,系统负载约 25–70):上面 4 个代码块完整跑通。PDBFixer 的输出交给 Meeko 时,A 链所有残基模板匹配成功;scrub.py 在 pH 7.4 只给出一个状态(两个哌嗪 N 质子化,净电荷 +2)。mk_export.py 为每个构象写一条 SDF 记录,不是一个分子带多个构象。
重对接结果:从 SMILES 出发、exhaustiveness 32、种子 1–10,最佳构象分数 −12.74 至 −12.82 kcal/mol,与晶体构象的原位 RMSD 为 0.80–0.85 Å,10 次全部小于 2 Å;第 2 名构象是首尾翻转的结合方式(RMSD 约 13 Å,分数高约 1.4 kcal/mol)。PLIP 显示第 1 名构象再现了与 Met318 主链和 Thr315 侧链的氢键。晶体构象直接打分(--score_only)为 −12.51 kcal/mol,原位局部优化(--local_only)后为 −13.24 kcal/mol,RMSD 0.21 Å。
起始构象会改变分数:在 RDKit 2026.03 的环境中重跑同一脚本,scrub.py 生成的起始构象不同,3 个种子的最佳分数都是 −12.41 至 −12.42 kcal/mol,RMSD 0.84–0.85 Å。交叉对接确认差异来自配体起始构象,与受体加氢无关。Vina 在对接中不改变键长、键角和环构象,所以比较分数时要固定配体准备环境,或把起始构象文件一起保存。
Vina 终端表格最多列出 num_modes 个构象,输出 PDBQT 只写入与最佳分数相差不超过 energy_range 的构象:本例终端列出 9 个,文件中每次只有 2–7 个。rmsd_table.py 按 PDBQT 中的 REMARK VINA RESULT 读分数,与 SDF 一一对应。
set -euo pipefail
SMI='Cc1ccc(NC(=O)c2ccc(CN3CCN(C)CC3)cc2)cc1Nc1nccc(-c2cccnc2)n1' # 伊马替尼
# 1. 下载 1IEP,取 A 链蛋白(只保留无 altloc 或 altloc A)和 A 链共晶配体 STI
curl -fsSLO https://files.rcsb.org/download/1IEP.pdb
awk 'substr($0,1,4)=="ATOM" && substr($0,22,1)=="A" && (substr($0,17,1)==" " || substr($0,17,1)=="A")' 1IEP.pdb > protA.pdb
echo END >> protA.pdb
awk 'substr($0,1,6)=="HETATM" && substr($0,18,3)=="STI" && substr($0,22,1)=="A"' 1IEP.pdb > xtal_lig.pdb
# 2. 补缺失重原子,按 pH 7.4 加氢,去掉水和所有异质分子
pdbfixer protA.pdb --output=protA_H.pdb --add-atoms=all --keep-heterogens=none --ph=7.4
# 3. 检查口袋内可滴定残基的 pKa(结果写入 protA_H.pka)
propka3 protA_H.pdb
# 4. 给共晶配体补键级,得到参考 SDF(定盒子和算 RMSD 都用它)
python make_ref.py "$SMI" xtal_lig.pdb xtal_lig.sdf
# 5. 受体 PDBQT + 盒子:以共晶配体为中心,各方向外扩 5 Å
# 需要改质子化态时加 -n,例如 -n A:<残基号>=HIP
mk_prepare_receptor.py --read_pdb protA_H.pdb -o rec -p -v \
--box_enveloping xtal_lig.sdf --padding 5
# 输出 rec.pdbqt、rec.box.txt(Vina 配置)、rec.box.pdb(在 PyMOL 中查看盒子)
# 6. 配体:从 SMILES 生成 pH 7.4 质子化态和 3D 构象,再转 PDBQT
scrub.py "$SMI" -o lig_scrub.sdf --ph 7.4 --skip_tautomers
# scrub.py 写出的分子没有名字;不加 --multimol_prefix 时单分子会写成隐藏文件 lig_pdbqt/.pdbqt
mk_prepare_ligand.py -i lig_scrub.sdf --multimol_outdir lig_pdbqt --multimol_prefix lig
# 7. 重对接:3 个随机种子 x exhaustiveness 32
mkdir -p out
for lig in lig_pdbqt/*.pdbqt; do
name=$(basename "$lig" .pdbqt)
for seed in 1 2 3; do
vina --receptor rec.pdbqt --ligand "$lig" --config rec.box.txt \
--exhaustiveness 32 --num_modes 9 --energy_range 3 --seed "$seed" \
--out "out/${name}_s${seed}.pdbqt" | tee "out/${name}_s${seed}.log"
mk_export.py "out/${name}_s${seed}.pdbqt" -s "out/${name}_s${seed}.sdf"
done
done
# 8. 每个构象的分数与相对晶体构象的 RMSD
python rmsd_table.py xtal_lig.sdf out > redock_rmsd.tsv
sort -t$'\t' -k3,3g redock_rmsd.tsv | head# make_ref.py:用 SMILES 模板给 PDB 中的配体补上键级
import sys
from rdkit import Chem
from rdkit.Chem import AllChem
smi, pdb_in, sdf_out = sys.argv[1:4]
template = Chem.MolFromSmiles(smi)
lig = Chem.MolFromPDBFile(pdb_in, removeHs=True)
ref = AllChem.AssignBondOrdersFromTemplate(template, lig)
Chem.MolToMolFile(ref, sdf_out)
print("heavy atoms:", ref.GetNumHeavyAtoms())# rmsd_table.py:原位计算(不叠合)对称性感知的重原子 RMSD
import glob, os, sys
from rdkit import Chem
from rdkit.Chem import rdMolAlign
def heavy_neutral(m):
# 去氢并去掉形式电荷,避免质子化态不同导致原子无法匹配
m = Chem.RemoveHs(m)
for a in m.GetAtoms():
if a.GetFormalCharge() != 0:
# 质子化的 N 去氢后保留了 1 个显式 H,只清电荷会报 valence 错误
a.SetFormalCharge(0)
a.SetNumExplicitHs(0)
a.SetNoImplicit(False)
Chem.SanitizeMol(m)
return m
ref = heavy_neutral(Chem.MolFromMolFile(sys.argv[1]))
print("file\tpose\tvina_score\trmsd_to_xtal")
for sdf in sorted(glob.glob(os.path.join(sys.argv[2], "*.sdf"))):
pdbqt = sdf[:-4] + ".pdbqt"
scores = [float(l.split()[3]) for l in open(pdbqt) if l.startswith("REMARK VINA RESULT")]
poses = []
for m in Chem.SDMolSupplier(sdf, removeHs=False):
if m is None:
continue
for conf in m.GetConformers():
p = Chem.Mol(m, confId=conf.GetId())
poses.append(p)
for i, p in enumerate(poses):
rmsd = rdMolAlign.CalcRMS(heavy_neutral(p), ref)
print(f"{os.path.basename(sdf)}\t{i+1}\t{scores[i]:.2f}\t{rmsd:.2f}")# 批量对接:地图只算一次,换配体时复用
from vina import Vina
import glob, os
v = Vina(sf_name="vina", cpu=0, seed=42)
v.set_receptor("rec.pdbqt")
os.makedirs("out_batch", exist_ok=True)
# 不先加载配体时,compute_vina_maps 为力场中的全部原子类型算地图,换配体时不用重算
v.compute_vina_maps(center=[15.19, 53.90, 16.92], box_size=[22, 22, 22]) # 换成 rec.box.txt 中的值
for lig in sorted(glob.glob("lib_pdbqt/*.pdbqt")):
v.set_ligand_from_file(lig)
v.dock(exhaustiveness=16, n_poses=20)
v.write_poses(os.path.join("out_batch", os.path.basename(lig)), n_poses=9, energy_range=3.0, overwrite=True)
print(lig, v.energies(n_poses=1)[0][0])验证
网络药理学论文常用的 −4.25、−5.0、−7.0 kcal/mol 阈值没有统一出处,不同对接软件的分数也不能套用同一阈值。比较不同大小的分子时,同时报告配体效率 LE = −分数 / 重原子数;0.3 kcal/mol/重原子常被用作参考线,Vina 分数会随分子变大而变得更负。
- 01
重对接 RMSD < 2 Å
把共晶配体对接回它自己的结构,最佳构象与晶体构象的对称性感知重原子 RMSD 应小于 2 Å。这个阈值见于 Vina 原始论文(Trott & Olson 2010)和 PoseBusters 基准;PoseBusters 中 Vina 在 Astex Diverse 85 个体系上达到该标准的比例为 58%。RMSD 要在受体坐标系内原位计算:RDKit 的 CalcRMS 不叠合,GetBestRMS 会先把配体叠合到参考上,得到的数值偏小。
- 02
重对接不过时按顺序排查
依次检查:盒子单位与位置;配体和受体的质子化态;增加 exhaustiveness 或换种子;配体环构象;受体结构质量。若晶体构象在打分函数中本身就不是最低点(用 vina --score_only 和 --local_only 对比;这两个模式要求配体坐标已在盒子内,要用带氢的晶体配体准备 PDBQT),继续加大搜索也没用,应换打分函数或改用其他方法。本页 1IEP 实测:晶体构象 --score_only 为 −12.51,--local_only 后 −13.24 kcal/mol,对接最佳构象 −12.8 kcal/mol,三者 RMSD 都小于 1 Å。
- 03
阳性对照
用同一受体、同一盒子、同一参数对接一个已知活性分子(最好有实验 Kd 或 IC50),新分子的分数与它比较。Che 与 Zhang 统计的网络药理学论文中,没有一篇使用阳性对照。
- 04
多种子一致性
3 个种子的第 1 名构象互相之间 RMSD < 2 Å,说明搜索已收敛。仅换种子分数就大幅变化时,先缩小盒子或提高 exhaustiveness。
| Vina 分数(kcal/mol) | 按 ΔG = RT ln Kd 换算(298 K) | 解读 |
|---|---|---|
| −5 | 约 216 µM | 网络药理学论文中最常用的“有结合”阈值,换算后是很弱的结合 |
| −6 | 约 40 µM | |
| −7 | 约 7.4 µM | |
| −8 | 约 1.4 µM | |
| −9 | 约 0.25 µM | Vina 在训练集上的标准误为 2.85 kcal/mol,约等于 2 个数量级的 Kd 误差 |
结果分析
# 在 PyMOL 命令行中执行
load protA_H.pdb, rec
load out/lig-1_s1.sdf, poses
load xtal_lig.sdf, xtal
split_states poses, prefix=pose
delete poses
hide everything
show cartoon, rec
set cartoon_transparency, 0.5
select pocket, byres (rec within 4 of pose0001)
show sticks, pocket and not name N+C+O
show sticks, pose0001 or xtal
color grey70, xtal and elem C
color green, pose0001 and elem C
distance hb, pose0001, pocket, mode=2
label pocket and name CA, "%s%s" % (resn, resi)
orient pose0001
set ray_opaque_background, 0
png pose1.png, width=2400, height=1800, dpi=300, ray=1
# 导出复合物给 PLIP / LigPlot+:配体改成 HETATM 并统一残基名
alter pose0001, resn="LIG"
alter pose0001, chain="L"
alter pose0001, resi="900"
alter pose0001, type="HETATM"
save complex_pose1.pdb, rec or pose0001# 互作表(txt + xml)和 PyMOL 会话;-p 额外输出图片
plip -f complex_pose1.pdb -t -x -y -o plip_pose1- 01
读懂输出表
affinity 是 Vina 打分(kcal/mol)。rmsd l.b. 和 rmsd u.b. 是该构象与本次第 1 名构象的距离,与晶体结构无关;u.b. 按原子一一对应、不考虑对称,l.b. 按最近的同元素原子匹配。“对接 RMSD 越小越好”的说法混淆了这两种 RMSD。
- 02
选构象
不只取第 1 名。依次看:第 1 名是否在多个种子中都出现;前几名分数差远小于 Vina 打分误差(2.85 kcal/mol)时,优先选与已知关键互作一致的构象(1IEP 中伊马替尼与铰链区 Met318 主链、守门残基 Thr315 形成氢键);排除配体大部分暴露在溶剂中或贴着盒子边缘的构象。
- 03
导出 SDF
mk_export.py 依据 PDBQT 头部保存的 SMILES 还原键级、形式电荷和全部氢,导出的 SDF 可以直接给 PyMOL、PLIP、RDKit 和下游分子动力学使用。
- 04
三维图
用下面的 PyMOL 命令画口袋、氢键和晶体构象叠加图。Vina 1.2.x 输出在 PyMOL 中显示不全时,多半是文件中混入了 NUL 字符,改看 SDF。
- 05
二维互作图
PLIP 输出氢键、疏水、π 堆积、盐桥、卤键的残基和距离表;LigPlot+ 和 PoseView(proteins.plus)画二维示意图;Discovery Studio Visualizer 也能画二维图。这些工具都要求输入受体和配体在同一个 PDB 文件里,配体标记为 HETATM。
论文写作
审稿人复现对接需要以下信息。缺少盒子中心和尺寸是网络药理学论文中最常见的问题。
- 软件与版本:AutoDock Vina 1.2.7、Meeko 0.8.0、molscrub 0.3.0、PDBFixer 等。
- 受体:PDB ID、链、分辨率;去除了哪些水、离子和配体,保留了哪些金属和辅因子;补了哪些残基。
- 质子化:目标 pH、所用工具(PDBFixer、PROPKA),手动指定的残基状态。
- 配体:来源(PubChem CID 等),质子化与 3D 生成方法,枚举了几个状态。
- 盒子:中心坐标和三维尺寸(Å),以及中心的依据(共晶配体、文献残基、P2Rank)。
- 参数:打分函数、exhaustiveness、num_modes、energy_range、随机种子与重复次数。
- 验证:共晶配体重对接 RMSD;阳性对照分子及其分数。
- 结果:每个分子在各种子中的最佳分数(均值 ± 标准差)、所选构象的依据、互作残基表与三维图。
排错
| 报错原文 | 原因 | 处理方法 |
|---|---|---|
| Command line parse error: unrecognised option '--log' | Vina 1.2.x 删除了 --log | vina ... | tee dock.log 或 > dock.log |
| WARNING: Search space volume is greater than 27000 Angstrom^3 (See FAQ) | 盒子尺寸按 AutoDock4 格点数填写,或盲对接盒子过大 | 格点数 × 0.375 换算成 Å;确需大盒子时提高 exhaustiveness |
| Vina runtime error: The ligand is outside the grid box. Increase the size of the grid box or center it accordingly around the ligand. | --score_only 或 --local_only 不做全局搜索,要求输入配体已在盒子内;scrub.py 从 SMILES 生成的坐标在原点附近 | 给晶体配体加氢后用 mk_prepare_ligand.py 准备 PDBQT 再打分;正常对接不受影响 |
| ATOM syntax incorrect: "CG0" is not a valid AutoDock type | Vina 1.1.2 读取 Meeko 为大环写出的伪原子 | 升级到 Vina 1.2.x |
| Atom type 9.00 -17.40 is not a valid AutoDock type (atom types are case-sensitive) | 用了 MGLTools 的 prepare_ligand.py / prepare_receptor.py(不带 4),写出的是 PDBQ / PDBQS 旧格式 | 改用 Meeko,或 prepare_ligand4.py / prepare_receptor4.py |
| Atom type Xx is not a valid AutoDock type | 配体或受体含 Vina 没有参数的元素,或元素符号大小写错误(如 CL) | 检查元素列;金属配合物需要自定义原子类型 |
| PDBQT parsing error: Unknown or inappropriate tag found in rigid receptor. | 受体 PDBQT 中有 ROOT/BRANCH,常见于用 Open Babel 不加 -xr 转换受体 | 用 mk_prepare_receptor.py 重新生成受体 |
| PDBQT parsing error: Unexpected multi-MODEL tag found in flex residue or ligand PDBQT file. Use "vina_split" to split flex residues or ligands in multiple PDBQT files. | 把含多个 MODEL 的对接输出当作配体输入 | 先用 vina_split 拆分,或用 mk_export.py 导出后取单个构象 |
| Template matching failed for: ['A:238', ...] | Meeko 受体模板匹配失败:缺重原子、非标准残基或未知配体 | PDBFixer 补原子;非标准残基用 --add_templates;盒子外的残基用 --delete_bad_res_from_box_radius |
| Affinity map for atom type A is not present | AD4 打分时 GPF 没有为该原子类型生成地图 | 用 mk_prepare_receptor.py -g 重新生成 GPF,或在 ligand_types 行加入该类型 |
| Error: could not open "conf.txt" for reading. | 文件实际名为 conf.txt.txt,或不在当前目录 | 显示扩展名后改名,或写绝对路径 |
| boost thread resource error | 集群节点的配置限制了进程创建线程 | 联系管理员调整线程限制 |
| Residues with alternate location: ['A:709'] | 受体 PDB 中有多构象残基(altloc) | mk_prepare_receptor.py 加 --default_altloc A,或用 --wanted_altloc A:709=A 只指定该残基;选占有度高的构象 |
| RDKit molecule has implicit Hs. Need explicit Hs. | 配体 SDF 的形式电荷或键级不对,例如去质子的 O 仍标为 0 电荷,RDKit 推断出未给坐标的氢 | 在 Avogadro 等编辑器中修正形式电荷和键级后导出 SDF,检查文件末尾的 M CHG 行 |
| Element K doesn't have an implemented covalent radius | 受体中有 Meeko 不支持的元素,例如 K⁺ | 离口袋较远时直接删除该离子 |
国内常用工具
以下经验来自计算化学公社、Sobereva 博客与中文问答,已与工具文档或原始论文核对。
CB-Dock2 会删掉金属和辅因子
CB-Dock2 论文说明:服务器自动补侧链原子和氢,并删除所有结晶水和 HETATM,活性位点的金属离子和辅因子也在其中。含锌、镁或 NAD 等的口袋应改用本地流程。配体 3D 构象由 RDKit 生成。
CB-Dock2 的高成功率主要来自模板
CB-Dock2 先在 BioLiP 中按 FP2 相似度(≥0.4)找相似配体的共晶结构做模板对接,找不到才只做空腔检测加 Vina 对接。Astex 85 个体系中 82 个走了模板对接,top pose 成功率 85.9%;只用空腔盲对接的原版 CB-Dock 约为 70%。PDB 中没有相似配体的分子(多数中药单体)只能走后一条路。网页上的 Vina score 与本地 Vina 1.2.x 的分数来自不同的受体准备与程序版本,不放在同一张表中比较。
金属蛋白加氢与 AutoDock4Zn
计算化学公社一位用户按 Vina 官方 AutoDock4Zn 示例复现,最佳构象为 −12.94 kcal/mol,与官方约 −13 kcal/mol 一致。他的经验:金属蛋白用 ChimeraX 加氢,命令 addh hbond true metalDist 3.95,与金属距离小于 3.95 Å 的 O、N 不加氢,配位残基不会被错误质子化;ADFRsuite 不装进 conda 环境,用完整路径调用其 pythonsh 和 autogrid4,避免与 conda 里的 autogrid4 混用。
质子化态可用 Protoss
Sobereva 建议用 proteins.plus 的 Protoss 判断蛋白和配体的质子化态,重点检查组氨酸:它的 pKa 接近 7,与配体可能形成氢键时,应取有利于氢键的状态。同一网站的 PoseView 画二维互作图,DoGSiteScorer 找口袋并给出 Drug Score,可用来辅助确定对接范围。
对接构象接着跑 MD 时配体跑掉
Sobereva 的判断:对接得到的打分最高构象,可靠性明显低于高分辨率晶体结构;蛋白本身是预测结构时可靠性最低。MD 开始不久配体就脱离,多半说明打分第一的构象不合理,可以换一个看起来合理但分数不是第一的构象,或换对接程序。也可以先对关键氢键加弱距离限制势平衡一段,等口袋弛豫后撤掉限制再做正式模拟;正式模拟保留限制势会被审稿人质疑。
Discovery Studio 画不出二维图
报错 Invalid selection for 2D ligand. ... The maximum number of atoms in the ligand is specified in the preferences 表示配体原子数超过了默认上限。在 Edit > Preferences > Ligand Definition 中调大最大原子数即可。贴吧用户报告约 7 个残基以上的多肽配体无法识别,原因相同(经验帖)。
交给 Agent
指令示例:“用 AutoDock Vina 把这 5 个化合物(附 SMILES)对接到 PDB 1IEP 的 ATP 口袋,先用共晶伊马替尼做重对接验证,再以伊马替尼为阳性对照,每个分子 3 个随机种子,输出分数表、RMSD 表、PyMOL 图和 PLIP 互作表。”
智能体会在工作区安装 Vina 1.2.7、Meeko 和 molscrub(预装环境中已有 RDKit、OpenMM、AmberTools),按本文流程准备受体和配体、重对接并检查 RMSD、批量对接、导出 SDF、作图并整理互作表。交付文件包括 run_redock.sh 等脚本、rec.pdbqt 与 rec.box.txt、各种子的对接输出与日志、redock_rmsd.tsv、分数汇总表、PNG 图和 PLIP 报告。智能体会对结果做对抗审阅,例如检查重对接是否真的达到 2 Å 以内、多种子结果是否一致。
需要你自己核对的是:口袋内残基的质子化态是否符合实验条件,盒子位置是否与文献中的结合位点一致,所选构象的关键互作是否有实验依据,阳性对照是否合适。需要继续做分子动力学验证时,可以在同一工作区里用预装的 GROMACS 接着跑。
参考资料
- AutoDock Vina 文档:Basic docking — Meeko 准备流程、1IEP 示例、exhaustiveness 32、期望分数、mk_export.py
- AutoDock Vina 文档:Installation 与 Software requirements — pip 包不含可执行程序;Meeko、AutoGrid4、ADFR 安装
- AutoDock Vina FAQ — 盒子大小、27000 ų 警告、exhaustiveness 含义、忽略部分电荷、联合原子、对接失败原因、随机种子
- AutoDock Vina 1.2.7 Release 与源码 main.cpp — 当前版本与命令行参数默认值
- AutoDock Vina 1.1.2 Manual — rmsd l.b. / u.b. 的定义
- Vina issue #129、#427:--log 选项 — 1.2.x 删除 --log,用重定向代替
- Vina issue #298:PDBQ / PDBQS 格式 — prepare_ligand.py 与 prepare_ligand4.py 的区别
- Vina issue #473:受体与辅因子的质子化态 — 维护者建议用 Meeko -n 与 --add_templates
- Vina issue #476:同一种子结果不同 — Boost 版本影响随机数;按分布比较
- Vina issue #218:大环与构象熵罚 — 柔性大环分数偏差约 2 kcal/mol
- Vina issue #370:PyMOL 显示不全 — 输出中的 NUL 字符
- Vina issue #465:Affinity map 缺失 — AD4 打分的 GPF 原子类型
- Meeko issue #239:CG0 原子类型 — Vina 1.1.2 无法读取大环伪原子
- Meeko 文档(v0.8.0) — 受体模板匹配、mk_prepare_receptor.py 参数、--box_enveloping
- molscrub — scrub.py 质子化态、互变异构与 3D 生成,默认 pH 7.4
- OpenMM Modeller.addHydrogens 文档 — PDBFixer 按 pH 加氢的规则
- P2Rank — 口袋预测;AlphaFold 结构使用 -c alphafold
- PLIP — 蛋白-配体互作分析命令
- RDKit rdMolAlign 文档 — CalcRMS 与 GetBestRMS 的区别
- Trott & Olson 2010, J Comput Chem 31:455 — Vina 原始论文:2 Å 标准、标准误 2.85 kcal/mol
- Eberhardt et al. 2021, J Chem Inf Model 61:3891 — Vina 1.2.0 论文:Python 接口、新打分与对接方法
- Buttenschoen et al. 2024, Chem Sci 15:3130(PoseBusters) — 重对接 RMSD ≤ 2 Å 与物理合理性;Vina 成功率
- Feinstein & Brylinski 2015, J Cheminform 7:18 — 盒子边长 = 2.857 × 回转半径
- Che & Zhang 2025, Front Pharmacol 16:1566772 — 网络药理学中的盲对接与分数阈值统计
- Karelina, Noh & Dror 2023, eLife 12:RP89386 — AlphaFold 模型用于对接的准确率
- Nagar et al. 2002, Cancer Res 62:4236 — 1IEP 结构与伊马替尼结合模式
- Hopkins et al. 2014, Nat Rev Drug Discov 13:105 — 配体效率及参考值
- MGLTools 下载页 — 最新版 1.5.7 与 2022 年补丁
- chimera-users 邮件列表:Open Babel 转受体 PDBQT — 经验帖:-xr 去掉 BRANCH 后结构异常、被拆成多个 model
- BioStars:同参数不同次运行结果差异很大 — 经验帖:仅换随机种子时最佳分数差异很大
- 计算化学公社:AutoDock Vina 与含 Zn 蛋白对接流程经验分享 — 经验帖:AutoDock4Zn 复现 −12.94 kcal/mol、ChimeraX metalDist、altloc 与 implicit Hs 报错
- Sobereva:谈谈分子动力学模拟蛋白-配体复合物过程中配体发生脱离的原因 — 对接构象的可靠性、Protoss、PoseView、DoGSiteScorer、限制势的用法
- Liu et al. 2022, Nucleic Acids Research(CB-Dock2) — 受体预处理删除 HETATM、模板对接、Astex 成功率
- Liu et al. 2020, Acta Pharmacologica Sinica(CB-Dock) — 空腔检测盲对接 top pose 成功率约 70%
- ChimeraX addh 命令文档 — metalDist 默认 3.95 Å、hbond 默认 true
- 知乎:Discovery studio 问题解决 — 经验帖:Invalid selection for 2D ligand 与 Ligand Definition 设置