第四节 配置文件详解:Vina 配置文件 (.conf) 的书写规则
说实话,我刚开始用 AutoDock Vina 的时候,最头疼的不是分子对接本身,而是那个 .conf 配置文件。这玩意儿看着简单,但稍微写错一个参数,结果就可能一塌糊涂。
先给大家看一个典型的 .conf 文件长什么样:
receptor = receptor.pdbqt
ligand = ligand.pdbqt
center_x = 15.0
center_y = 20.0
center_z = 10.0
size_x = 25
size_y = 25
size_z = 25
energy_range = 4
exhaustiveness = 8
num_modes = 9
seed = 12345
out = output.pdbqt
log = docking.log
cpu = 0
看着是不是挺直观?但里面门道可不少。我把各个参数拆开来讲,每个都是我踩过的坑。
4.1 中心坐标 —— 你找对地方了吗
中心坐标 center_x、center_y、center_z,说白了就是定义你希望配体往哪个位置去对接。我见过好多新手直接把坐标设成 (0,0,0),结果配体跟蛋白隔了十万八千里,怎么算都算不出合理构象。
坐标怎么定?我个人习惯用 PyMOL 或者 Discovery Studio 先打开蛋白结构,把结合位点周围的关键残基选出来,然后看这些残基的中心在哪。举个例子,我去年做过一个激酶项目,已知活性位点里有 Lys72 和 Glu91,我就用这两个残基的 Cα 坐标取了个平均值。
prepare_receptor4.py 脚本看看蛋白的质心,然后手动调整到你认为的结合位点附近。但不建议直接用质心,因为结合位点往往不在质心上。
我曾经犯过一个低级错误:把一个蛋白的质心坐标直接复制粘贴过来,结果对接出来的构型全部在蛋白表面,根本不是想要的结果。后来我一查,发现结合口袋在蛋白深处,和质心差了十几埃。所以,坐标一定要手摸结合口袋的位置来确定。
4.2 盒子大小 —— 别太小,也别太大
size_x、size_y、size_z 定义搜索盒子的边长,单位是埃(Å)。这个参数的物理意义是什么?其实就是告诉 Vina:“你只能在这么大的区域内找配体的位置。”
我见过最典型的坑是这样的:盒子太小,配体放不进去,或者蛋白质表面上合适的构象根本进不了盒子。我也遇到过盒子太大,搜索空间太大导致计算量飙升,跑几个小时都出不来结果。
怎么选盒子大小? 我个人给个参考:
- 如果你知道活性口袋的精确位置,盒子边长取 15-25 Å 就够了。我一般用 20。
- 如果你只知道大概区域,或者做的是盲对接(blind docking),盒子就得覆盖整个蛋白或者至少主要结构域。边长可能得到 40-60 Å。
- 还有一种情况:你的配体本身很大(比如糖链或者多肽),那盒子就得能容纳整个配体旋转的空间。配体最长链的 1.5 倍,一般不会错。
我记得有个学生做了一个 GPCR 的对接,配体分子量只有 400 左右,结果他把盒子设成 50×50×50,exhaustiveness 设为 20,硬是用工作站跑了一整天。最后我一问,其实已知结合位点就在 TM3-TM5 跨膜螺旋附近,盒子只用 20×20×20 就够用了。你看看,一个参数选错,浪费多少时间?
4.3 能量范围与排数 —— 要多少个结果?
energy_range 和 num_modes 这哥俩是配合着用的。
energy_range 表示:Vina 输出的最优构象和最差构象之间的能量差上限。比如我设 energy_range = 4,那输出的所有构象中,得分最高的和得分最低的,两者能量差绝对不能超过 4 kcal/mol。
num_modes 是输出多少个构象。我常用的值是 9,因为 Vina 默认最多输出 9 个,而且 9 个构象已经能覆盖大部分有意义的结果了。
为什么要设这两个参数?原因很简单:你不想看到能量上相差很大的结果混在一起,也没必要输出几百个无效构象。
举个例子:你跑了一个对接,最优结果 -9.3 kcal/mol,如果 energy_range=4,那么输出的 9 个结果的能量必须在 -9.3 到 -5.3 之间。如果某个构象能量是 -3.0,它直接被过滤掉了——即使它的 RMSD 跟最优构象很像,能量差太大也没意义。
energy_range=3 就够用了,因为你要的只是每个配体的最优得分。如果做结合模式分析,我建议 energy_range=4 或 5,因为你可能需要看次优构象之间的竞争关系。排数 num_modes 建议统一设 9,不要小于 5。
你想想看:如果一个对接只输出 2 个结果,你拿什么来分析结合模式的多样性?我曾经在一次激酶抑制剂项目中,明明最优构象得分很好,但次优构象的能量差只有 0.3 kcal/mol,空间构象却差很多。要不是我当时设了 num_modes=9,根本发现不了这两种结合模式的差异。
4.4 exhaustiveness —— 搜索深度
exhaustiveness 参数控制的是 Vina 用于全局搜索的随机种子数。说白了就是:Vina 会在盒子里随机取点,然后从这个点出发去优化,取多少随机起点,就由这个参数决定。
默认值是 8。但如果你在做一个精密的结合模式分析,我建议你设到 16 或 24。如果只是跑虚拟筛选的初筛,8 就够用了。我曾经在论文里看到有人设 64,说实话我觉得没必要,除非你用的是超级计算机,不在乎时间。
这里有个坑:exhaustiveness 和盒子大小是正相关的。盒子越大,需要的 exhaustiveness 越高。我一般按这个原则:
盒子体积 (ų) 推荐 exhaustiveness
< 8000 (≈20³) 8 - 12
8000 - 27000 12 - 20
27000 - 64000 20 - 32
> 64000 32 - 48
4.5 seed —— 随机种子
这个参数可能最容易被忽略,但它其实挺重要。如果你设了一个固定的 seed(比如 12345),那么每次跑这个配置文件,结果都是完全一样的。这有什么好处?
- 可复现性:评审的时候别人可以精确重复你的结果。
- 调试:调参数时能确定变化是由参数引起的,而不是随机因素。
如果 seed 不写或者设为负数,Vina 会用系统时间作为种子,每次结果都不一样。
我个人习惯:在研究阶段不设 seed,多跑几轮看稳定性;在最终确定参数后,固定 seed 来生成正式结果。
4.6 其他参数
cpu = 0 表示使用所有 CPU。如果你的机器是 16 核,Vina 会启动 16 个线程来跑。如果你只设 cpu=4,只会在 4 核上跑。
out 和 log 是输出文件路径,注意扩展名必须是 .pdbqt 和 .txt(或 .log)。我见过有人写成 .pdb,结果 Vina 直接报错。
4.7 一个完整的配置文件示例
下面这个配置是我去年做的一个 JAK2 抑制剂项目的实际配置文件,你可以直接参考:
receptor = jak2_kinase.pdbqt
ligand = inhibitor_33.pdbqt
center_x = 12.56
center_y = -3.22
center_z = 8.74
size_x = 20
size_y = 20
size_z = 20
energy_range = 4
exhaustiveness = 16
num_modes = 9
seed = 20230520
out = inhibitor_33_docked.pdbqt
log = inhibitor_33_docking.log
cpu = 0
你可能会发现中心坐标有点小数点。是的,我强烈建议你从结构里精确测量坐标,不要手动凑整数。Vina 对坐标精度很敏感——0.1 埃的偏移都可能改变结果的 RMSD。
知识结构:配置文件核心参数一览
4.8 避坑清单
聊了这么多,我最后把最容易踩的坑汇总一下。这清单是我从这些年帮同事、学生排查对接问题的经验里提炼出来的。
| 参数 | 常见错误 | 正确做法 |
|---|---|---|
| center | 直接复制蛋白质心坐标 | 手动测量结合口袋内残基位置,取平均值 |
| size | 设得太小(配体放不进去)或太大(计算量暴增) | 看配体最大尺寸,加 5-10 Å 余量;盲对接记得要覆盖整个蛋白 |
| energy_range | 设为 0 或不写,结果只有一个构象 | 设 3-5;分析结合模式最好用 4 |
| exhaustiveness | 长期用默认值 8,不确定是否充分 | 根据盒子大小调整;深度分析至少 16 |
| seed | 从不设定,无法复现结果 | 正式实验固定种子,测试阶段不设 |
| cpu | 写成 cpu=-1 或遗漏整行 | 设 0(全核)或明确写核数(不要超过机器物理核心数) |
| 文件路径 | 路径含空格、中文或写错扩展名 | 路径全英文、无空格;receptor/ligand 必须是 .pdbqt |
最后的真心话:配置文件这东西,写一遍容易,写好需要积累。每次我接到新的对接任务,第一件事不是开 PyMOL 看结构,而是先把之前做过的同类项目配置文件找出来,改几个参数就直接跑。为什么?因为好的配置是有模式可循的。你做得多了,会形成自己的直觉——"这个口袋的盒子应该设多大","这个配体需要多少 exhaustiveness"。
所以,别怕被参数搞晕。我到现在偶尔还会遇到"咦,这次对接怎么得了这么奇怪的分数",然后回头一查,发现 center_z 写错了一位小数。嗯,这种低级错误谁都可能犯,但多检查一次配置文件,能省你后面三天的时间。