第四章 对接盒参数:中心与大小,决定了搜索空间
这一章我们聊对接盒(Grid Box)的参数设置。很多初学者觉得这个简单,不就是画个框吗?但实际项目里,我见过因为盒子位置偏了2Å,结果排名第一的构象完全不对。所以这个环节,真的值得认真对待。
4.1 理解对接盒的作用
AutoDock Vina的对接盒,说白了就是限定配体移动范围的搜索空间。你想想看,如果盒子太小,配体进不去真实结合位点;如果盒子太大,计算量暴增,而且容易产生假阳性。我个人的经验是:盒子大小要刚好包裹住整个结合口袋,同时留出适当边界。
为什么需要边界?因为配体在结合过程中可能会产生一定程度的构象摆动,如果盒子边界紧贴蛋白原子,Vina会在边界处出现能量跳跃,导致结果不合理。
4.2 中心坐标(center_x, center_y, center_z)
中心坐标一般来自蛋白晶体结构中的参考配体**或**已知关键残基**。如果没有参考配体,怎么办?
我记得有一次做GPCR项目,蛋白没有共结晶配体。我用了已知的结合位点残基中心坐标,取这些残基所有重原子的平均坐标作为盒子中心。后来跟文献对照,偏差只有0.3Å。这个方法现在我还在用。
设置中心坐标的常用手段:
- 从PDB文件直接取:用PyMOL或Chimera选中参考配体,查看中心坐标。
- 残基中心法:手动计算结合口袋关键残基的Cα平均值。
- 脚本法:用Python读取PDB,计算配体或残基质心。
下面是一个我常用的Python脚本片段:
# 计算PDB中某个链上所有原子坐标的平均值,作为对接盒中心
import numpy as np
def get_center(pdb_file, chain_id, res_ids=None):
coords = []
with open(pdb_file) as f:
for line in f:
if line.startswith("ATOM"):
chain = line[21]
resseq = int(line[22:26].strip())
if chain == chain_id:
if res_ids is None or resseq in res_ids:
x = float(line[30:38])
y = float(line[38:46])
z = float(line[46:54])
coords.append([x,y,z])
return np.mean(coords, axis=0)
# 使用示例:获取链A上残基100-120的中心
center = get_center("protein.pdb", "A", range(100,121))
print(f"center_x = {center[0]:.3f}")
print(f"center_y = {center[1]:.3f}")
print(f"center_z = {center[2]:.3f}")
4.3 盒子大小(size_x, size_y, size_z)
尺寸参数直接决定计算量。Vina的搜索空间是网格点数,默认每个方向网格间距约1Å。如果你把盒子设为20×20×20,大约8000个网格点,计算很快。但如果设为30×30×30,就是27000个点,计算时间会翻倍不止。
设置策略:
- 最小尺寸:刚好包住配体所有可能构象。一般取配体最长原子间距 + 4~6Å(两侧各2~3Å)。
- 标准尺寸:配体最长距离 + 8Å(每侧4Å),适合大多数柔性对接。
- 宽松尺寸:配体最长距离 + 12Å以上,用于探索非常规结合模式或大构象变化。
如果你不知道该设多大,可以用ADT的自动检测功能。但我个人更推荐用下面的命令快速估算:
# 计算配体.pdb的几何范围
obabel ligand.pdb -O ligand.xyz
# 然后用awk读取坐标范围
awk 'NR>2{for(i=1;i<=NF;i++){if(i==1)x=$i;if(i==2)y=$i;if(i==3)z=$i;if(x<xmin||xmin=="")xmin=x;if(x>xmax)xmax=x;if(y<ymin||ymin=="")ymin=y;if(y>ymax)ymax=y;if(z<zmin||zmin=="")zmin=z;if(z>zmax)zmax=z}}END{print "size_x=" int(xmax-xmin+8); print "size_y=" int(ymax-ymin+8); print "size_z=" int(zmax-zmin+8)}' ligand.xyz
4.4 实际操作流程
完整的对接盒配置文件长这样:
receptor = protein.pdbqt
ligand = ligand.pdbqt
center_x = 10.500
center_y = 25.300
center_z = 30.100
size_x = 22
size_y = 20
size_z = 18
num_modes = 10
exhaustiveness = 8
写完后用vina --config config.txt运行。如果你想手动验证盒子是否覆盖到结合位点,可以用PyMOL可视化:先把PDB载入,然后用show box命令画出盒子的轮廓。
4.5 常见错误与避坑
其他常见错误:
- 盒子中心放在溶剂区域:如果蛋白表面有凹陷但结合位点在内部,盒子中心必须深入内部。
- 各向异性设置不匹配:如果配体是长条形的,size_x和size_y应该比size_z大,但有人不检查直接设成一致,导致搜索空间浪费。
- 忘记检查姿态:我建议每次设置后,都用Vina自带的
--score_only模式快速测试一个构象,确认盒内没有空洞。
4.6 对接盒参数与计算效率
| 盒子尺寸(ų) | 网格点数(约) | 平均计算时间(CPU min,exhaustiveness=8) | 适用场景 |
|---|---|---|---|
| 18×18×18 | 5,832 | 3~5 | 精确口袋,配体小 |
| 24×24×24 | 13,824 | 8~12 | 标准柔对接 |
| 30×30×30 | 27,000 | 20~30 | 探索性对接 |
| 40×40×40 | 64,000 | 60~90 | 大配体或不确定位点 |
注意:上表时间基于单核Intel i7-9700K,实际会因机器而异。但趋势是明确的——盒子尺寸增大1倍,时间增大约4~5倍。
exhaustiveness=4快速筛选盒子位置,找到最佳中心后再用exhaustiveness=16做精确跑。4.7 一张图理清对接盒的几何关系
下面这张SVG图帮助大家理解对接盒与配体、蛋白口袋之间的空间关系。蓝色方框是对接盒,紫色球体是蛋白表面,橙色配体分子处于盒内。绿色箭头标出中心坐标误差导致的结果偏差。
图中可以看到:配体被放在盒子内部,盒子边界需留出足够空隙。如果中心坐标偏移(红色箭头方向),配体可能会超出盒子,导致Vina计算结果失效。
4.8 避坑清单
- 检查盒中是否有蛋白原子:可以用
vina --center_only模式显示盒子内原子数。 - 对于初次对接,先用宽松盒子(+10Å)跑一次,观察配体偏爱区域,再缩小盒子做精跑。
- 多配体对接:如果同时对接多个配体,盒子需覆盖所有配体的低能构象区,建议用最大配体的尺寸+12Å。
- 柔性侧链:如果蛋白有柔性残基,盒子需要把这些残基的侧链摆动范围也包括进去。