AutoDock-Vina分子对接实战:破解新手最容易栽的3个坑,跑通你的第一个药物筛选
【免费下载链接】AutoDock-VinaAutoDock Vina项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina
分子对接,说白了就是让计算机模拟"钥匙找锁孔"的过程——小分子配体是钥匙,蛋白质受体是锁。AutoDock-Vina就是这个领域最出名的开源引擎之一:它来自Scripps研究所的Forli实验室,免费开源,速度快得离谱,还能接Python做自动化。这篇文章不是给你念官方手册,而是替你把新手期的雷区一个个踩一遍:为什么你照着教程跑出来的结果对不上?为什么同一个盒子、同一条命令,结果总在变?为什么明明装了vina却找不到命令?我先把这些坑摆上台面,再用一个真实的药物对接案例(抗癌药伊马替尼对c-Abl激酶)把它们逐个击破,最后给你一套可以直接拿去复用的操作路径。
上图是官方文档里的对接全流程:结构预处理 → 对接输入准备(生成PDBQT和盒子文件)→ 对接计算。整篇文章就是沿着这条链路展开的。
开篇先破案:新手反复踩的3个坑
先说结论,绝大多数"Vina跑不出来/结果不对"的求助帖,根子都在下面三件事上:
坑一:配体用了PDB格式。PDB文件不含键连接信息,小分子一进PDB基本等于"散装零件",对接必然翻车。官方文档的原话是"你的成败有时就悬在一个氢原子上",配体请认准SDF格式,质子化状态务必检查。
坑二:对接盒子的单位搞错。从AutoDock4转过来的老用户特别容易犯:AutoDock4用"网格点"(1点=0.375埃),而Vina直接以**埃(Angstrom)**为单位。把27000立方埃当成了27000个网格点,搜索空间瞬间爆表,Vina会直接警告你。
坑三:追求"完全一致"的结果。Vina的搜索算法是随机的,每次运行的种子不同,输出构象就会有差异。这不是bug,是特性。你要判断的不是"这次和上次分毫不差",而是"统计上能不能稳定命中正确构象"。
下面这篇文章的实战主线会把这3个坑全部演示一遍:正确的姿势是什么、出错长什么样、怎么补救。
环境搭建:3条路,选最快的那条
装Vina的方式不止一种,按"省事程度"排序:
路线A:预编译可执行文件(最省事)去官方发布页下载对应操作系统的二进制包,解压就能跑。vina --help能弹出参数说明就算装好了。如果你只想命令行试水,走这条路。
路线B:Python绑定(做自动化的推荐)
pip install -U numpy vina注意:Python绑定和命令行可执行文件是两套独立安装,pip装完并不附带vina可执行文件,反之亦然——这是文档里明确标注过的坑。
路线C:Conda环境(最干净,科研向)
conda create -n vina python=3 conda activate vina conda config --env --add channels conda-forge conda install -c conda-forge numpy swig boost-cpp libboost pip install vina除了Vina本体,你还得装一个关键的辅助包Meeko,它负责把受体和配体加工成Vina能吃的PDBQT格式:
pip install -U numpy scipy rdkit vina meeko gemmi prody装完验证一下,终端能敲出这三个命令就算齐活:
mk_prepare_ligand.py --help mk_prepare_receptor.py --help mk_export.py --help💡提示:如果你想让管线可复现、不污染系统环境,就无脑选路线C。官方示例全部基于Conda环境。
实战主线:伊马替尼 × c-Abl,一条命令一条命令跑通
下面用官方基础示例example/basic_docking/里的真实数据走一遍。这套数据仓库里现成就有:受体是data/1iep_receptorH.pdb,配体是data/1iep_ligand.sdf,全部示例输入输出在example/basic_docking/目录下可对照。
第一棒:受体预处理,一条命令生成三个文件
mk_prepare_receptor.py -i 1iep_receptorH.pdb -o 1iep_receptor -p -v \ --box_size 20 20 20 --box_center 15.190 53.903 16.917这段代码做什么?-i指定输入PDB,-o指定输出文件名前缀,-p要求生成受体PDBQT,-v配合盒子的中心坐标和尺寸,额外写出盒子的TXT和PDB文件。
跑完后你会看到目录里多出:
1iep_receptor.pdbqt:受体对接文件,只含极性氢和部分电荷1iep_receptor.box.txt:盒子配置,可以直接当Vina的配置文件用1iep_receptor.box.pdb:盒子可视化文件,扔进PyMOL里能直接看到搜索空间长啥样
⚠️注意:如果你的受体是刚从PDB数据库下载的原始结构,里面通常带着水分子、配体、金属离子等杂物,用--delete_residues参数把不需要的残基删掉,别让杂物干扰对接。
第二棒:配体预处理,认准SDF格式
mk_prepare_ligand.py -i 1iep_ligand.sdf -o 1iep_ligand.pdbqt这段代码做什么?把SDF格式的小分子转成Vina专用的PDBQT。这就是我们在"坑一"里强调的:千万别用PDB格式喂小分子。如果起始结构缺氢,先用scrub.py补氢再转格式。
第三棒:选力场,两条路各跑一遍
Vina支持两种力场,对应两种不同的跑法:
用Vina力场(默认,最快,无需预计算)
盒子配置文件1iep_receptor.box.txt的内容长这样:
center_x = 15.190 center_y = 53.903 center_z = 16.917 size_x = 20.0 size_y = 20.0 size_z = 20.0然后一条命令开跑:
vina --receptor 1iep_receptor.pdbqt --ligand 1iep_ligand.pdbqt \ --config 1iep_receptor.box.txt \ --exhaustiveness=32 --out 1iep_ligand_vina_out.pdbqt这段代码做什么?指定受体、配体、盒子配置,把搜索强度exhaustiveness从默认的8提到32,输出对接结果。伊马替尼这个体系比较刁钻,默认参数下Vina偶尔找不到正确构象,加大exhaustiveness能让结果更稳定。
用AutoDock4力场(需要先跑AutoGrid4算亲和图谱)
mk_prepare_receptor.py -i 1iep_receptorH.pdb -o 1iep_receptor -p -v -g \ --box_size 20 20 20 --box_center 15.190 53.903 16.917 autogrid4 -p 1iep_receptor.gpf -l 1iep_receptor.glg第一行多了个-g参数,让Meeko额外生成AutoGrid4需要的GPF文件;第二行用autogrid4根据GPF算出各原子类型的亲和力图谱(会生成.maps.fld和一堆.map文件)。之后对接命令就不需要受体和盒子了,改用图谱:
vina --ligand 1iep_ligand.pdbqt --maps 1iep_receptor --scoring ad4 \ --exhaustiveness 32 --out 1iep_ligand_ad4_out.pdbqt第四棒:结果导出,SDF才是给"人"看的格式
PDBQT是给机器看的,键级信息不完整。要看结果,转成SDF:
mk_export.py 1iep_ligand_vina_out.pdbqt -s 1iep_ligand_vina_out.sdf这段代码做什么?用Meeko把对接结果转成SDF。Meeko的聪明之处在于它会读PDBQT头部里的SMILES字符串,用RDKit重建分子,这样键级和形式电荷不会丢。相比之下,OpenBabel那种"猜键级"的做法在部分分子上会翻车。
结果判读:看懂那一张表格,别被数字带偏
对接跑完,终端会输出一张这样的表:
mode | affinity | dist from best mode | (kcal/mol) | rmsd l.b.| rmsd u.b. -----+------------+----------+---------- 1 -13.23 0 0 2 -11.29 0.9857 1.681 3 -11.28 3.044 12.41怎么读?
- affinity(结合能):负值越大越稳。这个案例里,Vina力场的最佳构象应该落在-13 kcal/mol 附近,AutoDock4力场大约-14 kcal/mol。注意两个力场的分数不能互相比较,这是官方反复强调的。
- RMSD:第1行永远是0,因为它以最优构象为参照;后续构象的RMSD越小,说明和最优构象越接近。
- mode数量:exhaustiveness=32时通常只给出1个高置信构象;默认8时反而可能蹦出好几个能量较差、头尾翻转的构象——这是文档里明确描述的现象。
怎么判断"成功了"?把对接出的最佳构象和晶体结构里的配体叠一叠:如果RMSD小于2埃,基本可以认定复现成功。如果差得远,先别怀疑人生,往下看排查清单。
怎么优化?
- exhaustiveness:默认8,搜不准就提到16、32甚至更高,代价是耗时线性上涨。
- 盒子大小:能小就小,别超过30×30×30埃,否则搜索算法会"逛不完"。
- 结果带不动:多跑几次看统计分布,而不是盯着单次结果。
- 改力场权重:比如想加强氢键贡献,可以在命令里加
--weight_hydrogen -1.2(文档里的现成例子,把氢键强度翻倍)。
避坑手册:5个高频事故现场还原
事故1:提示 "can not open conf.txt",但文件明明存在。十有八九是文件管理器把扩展名藏了——你建的其实是conf.txt.txt。用ls(Mac/Linux)或dir(Windows)核实真实文件名。
事故2:搜索空间体积超27000立方埃的警告。你十有八九把"网格点"当成单位了。Vina的盒子单位是埃,不是0.375埃的网格点。如果是故意设的大空间,把exhaustiveness调大补偿。
事故3:结果和教程对不上。先确认是不是随机种子不同(正常现象),再看是不是配体/受体质子化状态错了。文档列了一长串"为什么得不到正确构象"的原因,头两名就是"单位搞错"和"质子化错误"。
事故4:跑了很久一个构象都不出。检查exhaustiveness和盒子尺寸是否合理,另外看看是不是把20×20×20(埃)误写成了以网格点计算的大盒子。
事故5:氢原子位置看起来怪怪的。这不是bug。Vina的评分函数是united-atom模型,只关心重原子,输出里的氢位置是任意摆的。但输入结构的质子化状态仍然重要——它决定了哪些原子算氢键供体/受体。
进阶玩法:从"跑通一个"到"跑通一批"
玩法一:柔性对接,让侧链动起来
刚性受体是这类方法最大的局限。Vina允许指定某些残基侧链参与柔性移动,典型做法是让关键残基"半动半不动"。官方示例example/flexible_docking/里就是把Thr315设为柔性残基,命令区别就在多了两个参数:
mk_prepare_receptor.py -i 1fpu_receptorH.pdb -o 1fpu_receptor -p -v \ --box_size 20 20 20 --box_center 15.190 53.903 16.917 \ -f A:315 -a-f A:315指定链A、残基号315为柔性,-a忽略那些部分解析、对不上模板的残基。运行后受体被拆成两个文件:1fpu_receptor_rigid.pdbqt(刚性部分)和1fpu_receptor_flex.pdbqt(Thr315侧链),对接命令里用--flex指过去即可。
玩法二:水合对接,把水分子算进去
真实生理环境里蛋白质泡在水里,配体结合时会把大部分水挤走,但少数水分子"赖着不走",相当于靶标的一部分。官方水合对接示例(example/hydrated_docking/,配体是尼古丁,受体是AChBP)的做法是:先用scrub.py -w给配体挂上显式水分子,再mk_prepare_ligand.py -w转格式,最后用AutoDock4力场跑。官方测试表明,对碎片级小分子,水合对接的RMSD整体有明显改善。
玩法三:Python脚本批量对接
最爽的玩法。仓库里example/python_scripting/first_example.py是现成模板:
from vina import Vina v = Vina(sf_name='vina') v.set_receptor('1iep_receptor.pdbqt') v.set_ligand_from_file('1iep_ligand.pdbqt') v.compute_vina_maps(center=[15.190, 53.903, 16.917], box_size=[20, 20, 20]) # Score the current pose energy = v.score() print('Score before minimization: %.3f (kcal/mol)' % energy[0]) # Minimized locally the current pose energy_minimized = v.optimize() print('Score after minimization : %.3f (kcal/mol)' % energy_minimized[0]) v.write_pose('1iep_ligand_minimized.pdbqt', overwrite=True) # Dock the ligand v.dock(exhaustiveness=32, n_poses=20) v.write_poses('1iep_ligand_vina_out.pdbqt', n_poses=5, overwrite=True)这段代码做什么?创建Vina对象 → 载入受体和配体 → 计算Vina网格 → 先给当前构象打分 → 局部能量最小化 → 正式对接,保留20个构象、输出前5个。
运行后会看到类似输出:
Score before minimization: -4.567 (kcal/mol) Score after minimization : -8.234 (kcal/mol)还有一个小技巧:如果先调compute_vina_maps()再载入配体,Vina会按力场里全部22种原子类型计算图谱,这样批量对接不同配体时就不用每个都重算网格——这正是虚拟筛选管线的标准姿势。
虚拟筛选的场景就是把这个脚本套上循环:读化合物库 → 逐个对接 → 按分数排序。结合--num_modes、energy_range这些参数控制输出数量,一套初筛管线就成型了。
下一步行动清单
这篇文章帮你打通了三层能力:看懂Vina的定位与原理(它是AutoDock4的"新一代"而非升级版,评分函数和算法都是新的);独立跑通一次完整对接(受体预处理→配体预处理→选力场对接→结果导出,全程真实命令);具备排查和自动化的意识(单位、格式、质子化、随机性四大雷区,以及Python批量对接的入口)。
接下来你可以按这个顺序动起来:
- 从仓库拉取项目:
git clone https://gitcode.com/gh_mirrors/au/AutoDock-Vina - 照着
example/basic_docking/跑通基础对接,对照solution/目录里的预期输出验证自己 - 换一个你自己的配体-受体体系,从PDB下载结构,重复本文流程
- 跑熟之后尝试
example/flexible_docking/和example/hydrated_docking/,最后用Python脚本把你的流程自动化
如果你觉得这篇实战笔记对你有用,把它收藏起来——下次跑对接前翻一遍"避坑手册",能帮你省下半天排查时间;也欢迎分享给身边刚入坑分子对接的朋友。祝你的第一个分子对接实验一次通过,早日找到下一个潜力药物分子。
【免费下载链接】AutoDock-VinaAutoDock Vina项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考