盒子参数:中心坐标与尺寸设置不当
盒子参数这关,我见过太多人翻车了。说实话,它就是个"定位问题"——你让程序在一个错误的盒子里找小分子,那结果能对吗?
中心坐标:你放对了吗?
先问个问题:你的盒子中心,到底在哪?
很多新手直接拍脑袋填坐标。或者从文献里抄一段,也不检查。其实盒子中心应该落在你预想的对接位点上。
我自己习惯这么干:先打开蛋白结构,找到对接位点附近的关键残基。比如某个已知的催化位点残基,或者文献里提过的关键口袋残基。用这些残基的几何中心来定盒子中心,比用整个蛋白质心靠谱得多。
举个例子,你在做CDK2的对接,活性位点是Glu51、Leu83、Phe80这圈残基形成的口袋。那就把这几个残基的alpha碳坐标取平均值。
# 用PyMOL取中心坐标
cdk2 pocket residues: Glu51, Leu83, Phe80, Asp86, Lys89
pymol> select pocket, resi 51+83+80+86+89
pymol> center_of_mass pocket
# 输出: x=12.34 y=-5.67 z=22.10 # 假设值
然后把这三个数填进盒子中心坐标里。
尺寸设置:大一点?小一点?
盒子太大的话,搜索空间指数级膨胀。计算慢是一回事,更关键是假阳性暴增——小分子可能在蛋白表面到处蹭。盒子太小呢?小分子被盒子边缘截断,或者根本塞不进真正的结合位点。
我记得有一次帮同事排查一个对接结果:得分很高但对接姿势完全不合理。我一看盒子尺寸:24×24×24 Å,但配体是个柔性分子,长度将近15 Å。盒子边缘离配体最近的原子只有4.5 Å。这意味着配体稍微旋转就撞到盒子边界,能量打分全乱套。
那怎么定尺寸?我的经验公式是这样:
- 先量配体的最大尺寸(用RDKit或PyMOL算一下)。
- 在每个方向上至少加5 Å的缓冲空间。
- 如果你用格点方法(比如AutoDock),格点必须覆盖整个结合口袋至少向外延伸2-3层溶剂层。
快速检查方法:
把配体手动放在预期位姿上,然后看看配体最外缘原子到盒子边界的最短距离。如果小于2 Å,有较大概率碰到边界效应。我通常要求至少3-4 Å。
常用软件的盒子参数对照
| 软件 | 参数名称 | 常见取值 | 我的踩坑记录 |
|---|---|---|---|
| AutoDock Vina | center_x, center_y, center_z; size_x, size_y, size_z | 尺寸一般20-30 Å | 曾经设成40×40×40找小分子,结果跑了7小时,找出一堆蛋白表面假阳性。 |
| AutoDock 4.2 | gridcenter; npts | 格点数60-80,间距0.375 Å | 有一次npts设成40×40×40,配体都在盒子外,对接根本卡住。 |
| Glide (Schrödinger) | Grid box center; inner/outer box | inner box覆盖口袋,outer box覆盖配体 | 我用默认outer box太小,长配体直接报错。 |
| DOCK | Center; Box (sphere radius) | 半径8-12 Å | 半径设了5 Å,小分子和蛋白根本没有有效碰撞,所有打分都是0。 |
边界效应的真实案例
去年跑一个药物优化项目,目标蛋白有个很深的疏水口袋。我把盒子中心对准了口袋中心,尺寸设成22×22×22 Å。跑完后得分最高的姿势,配体疏水尾巴被逼得翘起来,刚好卡在盒子对角线上。那个姿势给的能量非常低,但化学上根本不可能——尾巴应该平铺在口袋里,但它被盒子墙挤歪了。
我后来把盒子尺寸扩大到28×28×28 Å,再跑,正常了。那个假姿势的得分直接跌出前十。
技巧:如果你发现最好的对接姿势里有原子离盒子边界很近(比如2 Å以内),你就得加盒子尺寸重新跑。不要相信那个姿势。
怎么才算"设置得当"?三个步骤
- 目视确认:用小分子或已知配体画个盒子,肉眼看看有没有遮挡。
- 数格子:格点间距0.375 Å时,npts=60对应22.5 Å。配体长度+2个原子半径+5 Å缓冲,你大概心里就有数了。
- 做个短测试:设置小尺寸,先用2-3个姿态快速跑一圈。如果姿势全往一个方向挤,或者得分异常,八成是盒子问题。
常见错误速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 所有对接姿势都挤在盒子角落 | 盒子中心远离结合位点 | 重新计算口袋中心,检查坐标单位是Å还是nm |
| 得分异常高但姿势不合理 | 盒子太小,配体被边界排斥 | 加大盒子尺寸或换个结合位点定义 |
| 对接耗时莫名增加 | 盒子过大,格点数太多 | 缩小盒子至合理范围,用配体尺寸+5 Å的原则 |
| 配体原子和蛋白原子有严重重叠(steric clash) | 中心坐标偏移,盒子没覆盖正确口袋 | 检查坐标读取是否错了残基名称 |
避坑指南:我曾经……
我曾经因为单位问题抓狂了一整天。一个合作方给的坐标是nm,我当成Å填进去了。结果盒子中心偏了10倍,所有对接全废。所以每次拿到坐标,一定要确认单位。一般pdb文件里的坐标是Å,但有些软件内部用nm,你得换算好。
# 典型错误配置(nm当Å用)
# 实际口袋中心在2.5, 1.2, -0.3 nm → 25, 12, -3 Å
# 但我误填了:
center_x = 2.5
center_y = 1.2
center_z = -0.3
# 实际跑出来的格点覆盖的是蛋白左上角一片空气
还有一次,我把centre拼成了center。听着可笑,但AutoDock读参数文件,拼错了就默认用(0,0,0)。然后盒子原点落在(0,0,0),离蛋白几百埃远。那次浪费了三个节点的计算资源。现在我写配置前都会用grep检查一下关键词拼写。
快速验证方法:跑一个短对接(exhaustiveness=1),把输出的姿势保存为pdb,和蛋白一起在PyMOL里打开。盒子边界用网格线画出来,肉眼检查配体是否在合理位置。两步就能发现问题。
# PyMOL中显示格点范围(假设Vina盒子中心12, -5, 20,尺寸24, 24, 24)
pymol> pseudoatom box_center, pos=[12,-5,20]
pymol> show spheres, box_center
pymol> set grid_mode, 1
# 然后手动检查配体是否有原子超出或紧贴边界
盒子参数与搜参效率的关系
你想想看,格点数量是三维乘积。尺寸从24→30 Å,在0.375 Å间距下,格点数从64³增加到80³,体积直接翻倍。计算时间也翻倍。所以不是越大越好。精准定位盒子中心和合理尺寸,比盲目扩盒子有效一百倍。
我自己有个"两轮法":第一轮用小盒子(覆盖口袋+5 Å)和低exhaustiveness,快速找top 10姿势。第二轮把盒子中心对准第一轮最好姿势的质心,尺寸稍微放大一点(+4 Å),用高exhaustiveness精跑。这样又准又快。
# 第一轮:快速粗筛
center_x = 12.0 center_y = -5.0 center_z = 20.0
size_x = 24 size_y = 24 size_z = 24
exhaustiveness = 4
# 分析第一轮结果,发现最好姿势中心在 12.8, -4.2, 19.5
# 第二轮:精跑
center_x = 12.8 center_y = -4.2 center_z = 19.5
size_x = 28 size_y = 28 size_z = 28
exhaustiveness = 16
硬件上的小提醒
如果你用GPU加速(比如vina-gpu或gnina),盒子尺寸太大会把显存撑爆。我有一块6GB的卡,设成40×40×40的格点,间距0.375,直接out of memory。后来减到30×30×30才跑起来。所以显存不够时别硬来,先缩小盒子或者增大间距。
# 显存不够时的妥协方案
# 保持盒子尺寸不变,增大格点间距
# 从0.375 Å 改为 0.5 Å,格点数量减少一半
# 精度稍有下降但还能接受
center_x = 12.0 center_y = -5.0 center_z = 20.0
size_x = 30 size_y = 30 size_z = 30
spacing = 0.5 # 默认0.375,觉得可以改到0.5
最后说一句:盒子参数看着简单,但它是对接流程的第一道坎。迈不对,后面的活全白干。我每次启动一个新项目,第一件事就是花10分钟确认盒子。这10分钟往往能省下后面好几天的弯路。