利用Gromacs实现蛋白质-小分子复合体的分子动力学模拟全流程解析
1. 从对接结果到模拟起点文件准备与预处理很多刚接触分子动力学模拟的朋友尤其是做药物设计或者蛋白功能研究的常常会卡在第一步我拿到了一个对接软件比如AutoDock Vina预测出的蛋白质-小分子复合物结构一个.pdb文件接下来该怎么把它变成Gromacs能“吃”得下去、并且能“消化”好的格式呢这个过程就像你要做一道大餐不能直接把菜市场买来的、带着泥的食材扔进锅里得先清洗、切配、腌制。文件预处理就是这道至关重要的“备菜”工序。原始文章提到了用PyMOL来处理这确实是个好工具直观又强大。我自己的习惯是拿到对接后的复合物.pdb文件后第一步永远是肉眼检查。别笑这真的很重要。用PyMOL或者ChimeraX打开看看小分子是不是稳稳地坐在你预期的活性口袋里面有没有原子穿模比如苯环插进了蛋白质的疏水核心里氢键方向是否合理。有时候对接算法为了追求打分会给出一些在物理上不太可能的构象如果直接用这个构象去跑模拟很可能一开始能量就炸了或者小分子在预平衡阶段就“飞”出去了。确认结构大体合理后我们再开始“分家”。蛋白质部分的处理相对直接。就像原文说的用gmx pdb2gmx这个神器。但这里有个细节坑我踩过好几次注意质子化状态和末端处理。-ignh参数是忽略输入.pdb文件中的氢原子让Gromacs根据自己的力场规则重新加氢。这对于标准氨基酸没问题但对于一些特殊的质子化状态比如组氨酸是HID、HIE还是HIP天冬氨酸和谷氨酸是质子化还是去质子化就需要你根据模拟体系的pH值来手动指定或者事后修改.top文件。我一般会先用pdb2gmx跑一遍生成.top文件后仔细检查一下[ atoms ]段里那些可能带电荷的残基如ASP, GLU, HIS, LYS, ARG的电荷是否正确。另一个坑是链的识别和末端封端。如果你的蛋白质是多条链或者有缺失的残基pdb2gmx可能会报错或者处理得不合你意。这时候可能需要先用其他工具如PDBfixer, Modeller补全缺失残基或处理链的连续性。小分子部分是真正的难点也是新手最容易懵的地方。Gromacs本身不认识你的小分子它需要一份详细的“说明书”也就是拓扑文件.itp来告诉它这个分子由哪些原子组成原子之间怎么连接键、角、二面角以及每个原子用什么力场参数电荷、范德华半径等。原文提到了用Sobtop这是一个非常优秀的、由国内学者开发的图形化工具特别适合有机小分子和药物分子。我补充一点实战经验在生成拓扑前务必确保你的小分子初始结构是合理的。最好先用化学信息学软件如Open Babel或者量子化学计算软件如Gaussian对小分子进行一个简单的几何优化和电荷计算。尤其是电荷Sobtop内置的AM1-BCC方法对于大多数药物分子已经足够好但如果你研究的是金属配合物或者有特殊电子效应的分子可能需要更高级的电荷拟合方法如RESP电荷。生成.itp文件后一定要打开看一眼检查[ atomtypes ]部分定义的原子类型是否与你选用的蛋白质力场兼容。比如你蛋白质用了AMBER力场那小分子的原子类型命名如c3,ha等最好也保持AMBER风格否则后续合并力场参数时会很麻烦。2. 合二为一构建复合物拓扑与体系定义当你好不容易分别拿到了protein.gro、protein.top包含protein.itp和ligand.gro、ligand.itp下一步就是要把它们“组装”成一个完整的模拟体系。这个过程有点像拼乐高得严丝合缝不能多一块也不能少一块。第一步合并坐标文件.gro。原文的方法很手工复制粘贴改原子数。这方法没问题但对于原子数很多的大体系手动操作容易出错。我更喜欢用Gromacs自带的gmx editconf命令来合并虽然多一步但更稳妥。你可以先分别处理蛋白质和小分子的.gro文件确保它们处于你想要的相对位置通常就是对接给出的位置然后用一个文本编辑器或者简单的脚本按照.gro文件的格式要求把蛋白质的坐标块和小分子的坐标块拼在一起最后更新文件头尾的原子数和盒子向量。这里的关键是检查坐标是否重叠。合并后务必用可视化软件如VMD或PyMOL打开新的complex.gro确保小分子没有“嵌”进蛋白质原子内部两者之间有合理的空隙。第二步也是核心且最容易出错的步骤合并拓扑文件.top。原文提到了需要手动修改力场文件这是一个非常重要的点但解释得可以更直白些。我这么理解Gromacs在模拟时需要一个总的“物料清单”complex.top这个清单里会引用各种“子清单”.itp文件和“原料标准”力场文件。问题在于蛋白质的力场文件比如amber99sb-ildn.ff/forcefield.itp里只定义了20种天然氨基酸的“原料标准”它不认识你的小分子这种“新原料”。所以你必须把小分子这种“新原料”的“原料标准”即原子类型参数告诉整个体系。具体操作上我通常这么做创建complex.top先把protein.top的内容复制过来作为基础。处理力场包含语句原文说要修改#include路径这取决于你把修改后的力场文件夹放在哪。更常见的做法是不修改系统力场文件夹而是复制一份力场文件夹例如amber99sb-ildn.ff到你的工作目录重命名为myforcefield.ff然后在这个副本里进行修改。这样不会污染系统安装的力场也便于管理。然后在complex.top里将所有的#include “amber99sb-ildn.ff/...”改为#include “myforcefield.ff/...”。合并原子类型打开你的ligand.itp找到[ atomtypes ]部分如果有的话。将这一整块内容复制到myforcefield.ff目录下的ffnonbonded.itp文件的[ atomtypes ]部分末尾。然后必须从ligand.itp中删除这个[ atomtypes ]部分。这是因为同一个原子类型的定义在全系统只能出现一次否则Gromacs会报错“Duplicate atomtype”。包含小分子拓扑在complex.top文件中在包含离子和水拓扑的语句之后添加一行#include “ligand.itp”。这行代码告诉Gromacs“嘿除了蛋白质、水、离子我这里还有一种叫ligand的分子它的具体结构在ligand.itp里写着呢。”定义体系中的分子找到complex.top文件末尾的[ molecules ]部分。这里列出了体系中所有分子的种类和数量。你应该会看到类似[ molecules ] ; Compound #mols Protein_chain_A 1 SOL XXXX NA Y CL Z你需要在这里加上你的配体。但配体在ligand.itp里的“分子名”是什么打开ligand.itp看最开头的[ moleculetype ]部分后面跟的名字比如LIG就是它的分子名。所以你在[ molecules ]里添加一行LIG 1。注意这个分子名必须和.itp文件里定义的完全一致大小写敏感。检查电荷最后手动计算一下整个体系的净电荷。蛋白质的净电荷可以从gmx pdb2gmx的终端输出里看到。小分子的净电荷是你之前赋予它的各原子电荷之和。把蛋白质、小分子、以及你后面要添加的离子的电荷加起来确保整个体系是电中性的或者你打算通过添加离子来中和。如果净电荷不是0后续gmx genion步骤会失败。3. 构建模拟世界溶剂化、中和与能量最小化现在我们有了一个“干巴巴”的蛋白质-小分子复合物它漂浮在真空里。但生命发生在水溶液中所以我们得给它创造一个接近生理环境的“小世界”。这个过程就是溶剂化通俗讲就是“泡在水里”。创建盒子gmx editconf -f complex.gro -o complex_box.gro -bt dodecahedron -d 1.0。这个命令做了两件事第一-bt dodecahedron指定盒子形状为十二面体。为什么不用简单的立方体因为对于近似球形的蛋白质十二面体在体积相同的情况下需要更少的水分子来填充能显著节省计算量。第二-d 1.0意味着蛋白质表面距离盒子边界至少1.0纳米。这个距离很重要太近了比如0.5 nm在周期性边界条件下蛋白质可能会和自己的“镜像”发生非物理相互作用太远了比如2.0 nm又会浪费计算资源。1.0-1.2 nm是一个常用的平衡值。添加水分子gmx solvate -cp complex_box.gro -cs spc216.gro -p complex.top -o complex_solv.gro。这里-cs spc216.gro指定了使用SPC/E水模型spc216.gro是Gromacs自带的一个包含216个SPC/E水分子的坐标文件用作填充模板。命令执行后Gromacs会用水分子填满盒子中蛋白质和小分子以外的空间。打开complex_solv.gro看看你的复合物已经被水分子包围了。添加离子中和电荷这是非常关键的一步。首先我们需要生成一个输入文件.tpr来为添加离子做准备gmx grompp -f ions.mdp -c complex_solv.gro -p complex.top -o ions.tpr。这里的ions.mdp是一个极其简单的参数文件通常只包含几行定义一下积分步长和短程截断目的只是为了生成一个结构文件。然后运行添加离子的命令gmx genion -s ions.tpr -o complex_solv_ions.gro -p complex.top -neutral -conc 0.15。-neutral参数告诉程序“先添加足够的正离子或负离子让整个体系净电荷为零”。-conc 0.15则进一步要求“然后再添加钠离子和氯离子直到离子浓度达到0.15 mol/L”这模拟了生理盐浓度。程序会提示你选择用哪些原子来替换为离子通常选择“SOL”水分子因为水分子是最多的替换掉一些对体系影响最小。能量最小化EM想象一下你刚搭建好的这个体系可能有些水分子和蛋白质原子靠得太近产生了严重的范德华排斥或者某些键长、键角偏离了平衡值。如果直接开始动力学模拟这些局部的“高应力”会导致计算不稳定。能量最小化就是一个“放松”的过程通过调整原子位置找到体系在当前位置附近的一个能量最低点局部极小值。我们通常分两步真空中的EM可选但推荐在加水加离子之前先对复合物本身进行一个快速的能量最小化消除一些明显的冲突。使用steep最陡下降法跑个几百到几千步。溶剂环境中的EM这是必须的。对整个溶剂化体系进行能量最小化。此时可以使用更精细但更慢的cg共轭梯度法。.mdp文件里需要设置emtol力的收敛阈值如1000 kJ/mol/nm和emstep初始步长。跑完后一定要检查输出文件em.log或em.edr看势能是否顺利下降并最终收敛。如果能量不降反升或者最后几步还在剧烈震荡说明体系可能存在问题如拓扑错误、原子冲突太严重需要回头检查。4. 预平衡让体系“热热身”并找到合适的密度能量最小化后的体系处于0K的“冰冻”状态我们需要把它“加热”到目标温度比如310K人体温度并且让体系的压力也达到平衡1个大气压。但是如果一下子把温度升到310K蛋白质可能会因为局部应力而扭曲甚至展开。所以我们需要位置限制性预平衡。NVT平衡恒温恒容这个阶段的目标是让体系的温度达到目标值同时固定蛋白质和小分子重原子非氢原子的位置只让水分子和离子自由运动。为什么固定重原子是为了防止在温度还没均匀时蛋白质骨架就因为热运动而偏离了我们感兴趣的初始结合构象。在NVT的.mdp文件中关键参数是define -DPOSRES ; 启用位置限制 tcoupl V-rescale ; 温度耦合方法推荐v-rescale ref_t 310 ; 参考温度 310 K tau_t 0.1 ; 温度耦合时间常数0.1 ps gen_vel yes ; 生成初始速度 gen_temp 310 ; 按310K的麦克斯韦分布生成速度POSRES位置限制是通过一个额外的.itp文件实现的这个文件在gmx pdb2gmx生成蛋白质拓扑时就会附带posre.itp并在蛋白质拓扑中被引用。对于小分子你需要用gmx genrestr命令为其生成一个类似的位置限制文件并在complex.top中包含它。NVT平衡通常跑100-200 ps就够了。用gmx energy -f nvt.edr命令提取温度随时间变化的曲线确认温度在目标值附近平稳波动。NPT平衡恒温恒压温度平衡后我们放开位置限制或者使用更弱的限制让整个体系包括蛋白质在恒定压力1 bar下进行平衡。这个阶段的主要目的是让体系的密度达到平衡。在加水的时候我们给了一个固定的盒子大小但那个大小未必是水在目标温度和压力下的自然密度。NPT平衡允许盒子体积涨缩直到内部压力与设定的1 bar外压平衡。关键参数pcoupl Parrinello-Rahman ; 压力耦合方法PR方法对于复杂体系更稳定 ref_p 1.0 ; 参考压力 1 bar tau_p 2.0 ; 压力耦合时间常数通常2.0 ps compressibility 4.5e-5 ; 水的等温压缩系数单位 bar^-1NPT平衡需要比NVT更长的时间因为密度弛豫较慢。通常需要跑500 ps到1 ns。同样用gmx energy分析压力、密度、盒子体积随时间的变化。当这些量围绕平均值平稳波动没有明显的漂移趋势时就说明体系已经达到了平衡。特别要注意从NPT平衡中选取一个盒子尺寸稳定的构象作为后续成品模拟的起始结构和盒子尺寸。你可以用gmx energy -f npt.edr -o box.xvg输出盒子体积观察其何时稳定。5. 成品模拟与关键参数设置经过漫长的准备和平衡终于可以开始“正式”的分子动力学模拟了也就是成品模拟。这个阶段的目标是采集无偏的轨迹用于后续分析蛋白质-小分子复合物的动态行为、结合稳定性等。成品模拟通常是在NPT系综下进行不再施加任何位置限制。.mdp参数文件详解成品模拟的.mdp文件是前面所有步骤的集大成者每一个参数都可能影响结果的可靠性和计算效率。我挑几个最容易出问题也最重要的说说积分步长dt通常设为2 fs。这是基于使用LINCS算法约束所有化学键键长constraints h-bonds对于全原子力场实际约束所有键的前提。如果设为更大的值如4 fs可能导致能量漂移或不稳定。温度与压力耦合继续使用V-rescale恒温器和Parrinello-Rahman恒压器。tau_t和tau_p保持与平衡阶段一致即可。长程静电相互作用必须使用PME粒子网格埃瓦尔德方法。这是目前处理周期性边界条件下长程静电力的标准方法。关键参数fourierspacing建议设为0.12-0.16 nmpme_order设为4立方插值。邻居列表更新nstlist决定了多久更新一次邻居列表即判断哪些原子对之间需要计算短程非键相互作用。这个值需要和rlist短程力截断以及verlet-buffer-toleranceVerlet缓冲容差配合。一个安全的设置是nstlist 20每20步更新一次rlist 1.2 nmverlet-buffer-tolerance 0.005 kJ/mol/ps。Gromacs会根据缓冲容差自动判断是否需要提前更新列表。输出频率nstxout、nstvout、nstfout坐标、速度、力的输出频率通常设为0不在.trr轨迹文件中记录以节省磁盘空间。nstenergy能量输出和nstlog日志输出可以设为1000每2 ps一次。最重要的是nstxout-compressed压缩坐标输出这决定了你最终用于分析的.xtc轨迹文件的帧间隔。设为500意味着每1 ps保存一帧。对于100 ns的模拟如果每1 ps一帧轨迹文件大约有10万帧对于分析来说通常足够了。太频繁如每10步会导致文件巨大太稀疏如每100 ps又会丢失很多动态细节。运行命令与性能优化运行成品模拟的命令很简单gmx mdrun -deffnm md -v。但如果你想充分利用计算资源比如多核CPU或GPU就需要一些优化选项。对于GPU加速命令可能是gmx mdrun -deffnm md -v -pin on -nb gpu -pme gpu -bonded gpu。这指定了将非键计算-nb、PME计算-pme和键合项计算-bonded都卸载到GPU上。-pin on有助于将线程绑定到特定的CPU核心减少缓存失效提升多核性能。在运行前强烈建议先用gmx tune_pme工具自动寻找PME网格计算与实空间计算在CPU/GPU上最优的任务分配或者用gmx mdrun -ntmpi 1 -ntomp 8假设一个节点8核这样的参数测试不同线程配置的性能。我个人的经验是对于中等大小的体系5-10万原子使用一块现代GPU模拟速度可以达到每天几十到上百纳秒使得百纳秒级别的模拟在可接受的时间内完成。6. 模拟结果分析从轨迹中挖掘信息跑完了模拟得到了庞大的轨迹文件.xtc或.trr和能量文件.edr就像拍了一部超长的分子运动电影。分析就是从中剪辑出有价值的片段和统计信息。这里介绍几个最核心、最常用的分析手段。均方根偏差RMSD这是衡量蛋白质或小分子整体结构相对于初始结构或某个参考结构偏离程度的指标。计算RMSD时必须先进行叠合fitting以消除体系的整体平动和转动只关注内部构象变化。命令如gmx rms -s md.tpr -f md.xtc -o protein_rmsd.xvg -tu ns。这里的-tu ns让X轴单位显示为纳秒更直观。分析RMSD图我们关注的是曲线是否在模拟早期快速上升后进入一个稳定的平台期平台期的RMSD值是多少通常小于0.2-0.3 nm对于折叠良好的蛋白质是可以接受的如果RMSD持续上升或出现大幅跃迁可能意味着蛋白质发生了部分去折叠或者小分子发生了显著的位移需要结合可视化仔细检查。均方根涨落RMSFRMSD看整体RMSF则看局部。它反映了蛋白质每个氨基酸残基或小分子每个原子在模拟过程中的柔性。命令gmx rmsf -s md.tpr -f md.xtc -o rmsf.xvg -res。-res参数表示按残基输出。生成的图中峰值高的区域通常对应环区loop、末端N/C端等柔性区域低谷则对应α螺旋、β折叠等刚性二级结构。对于蛋白质-小分子复合物特别要关注结合口袋周围残基的RMSF。如果结合后口袋残基的柔性显著降低了RMSF值变小这往往是小分子结合起到稳定作用的信号。回旋半径Rg衡量蛋白质整体紧密程度的指标。一个紧密折叠的球状蛋白Rg较小而部分去折叠或延展的构象Rg较大。命令gmx gyrate -s md.tpr -f md.xtc -o gyrate.xvg。稳定的Rg值表明蛋白质整体结构紧凑性保持良好。如果Rg随时间持续增大可能是蛋白质逐渐膨胀甚至去折叠的迹象。蛋白质-小分子相互作用分析这是复合物模拟的核心。除了上述整体指标我们更关心两者是如何结合的。氢键分析gmx hbond可以统计轨迹中特定给体与受体之间形成氢键的数目、存在时间等。你可以分析小分子与蛋白质之间形成了哪些稳定的氢键这些氢键对结合的贡献有多大。接触面积SASAgmx sasa可以计算蛋白质、小分子以及复合物的溶剂可及表面积。结合前后SASA的减少量大致反映了埋藏的表面积是结合亲和力的一个粗略指标。相互作用能使用gmx energy从.edr文件中提取LJ-SR短程范德华、LJ-14、Coulomb-SR短程静电、Coulomb-14等能量项可以分别计算蛋白质-小分子间的范德华和静电相互作用能。更精细的做法是利用gmx mdrun的-rerun功能或者使用gmx mindist结合轨迹处理脚本进行分解。结合模式可视化一切分析都要结合可视化用VMD或PyMOL打开轨迹制作动态视频直观地观察小分子在口袋中是否稳定有没有发生翻转、平移关键相互作用氢键、π-π堆积、盐桥等是否一直维持。我习惯将模拟起始帧和结束帧的结构叠合在一起特别关注结合口袋区域看看发生了哪些细微但可能重要的构象调整。分析是一个迭代和探索的过程。往往一个异常的分析结果比如RMSD突然跳变会驱使你回到可视化中去发现轨迹里某个关键事件从而对复合物的动态特性有更深刻的理解。记住模拟的目的不是得到一个“漂亮”的稳定曲线而是理解分子间相互作用的动态本质。