ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FEP结合自由能计算全流程解析:从原理到GROMACS实战

FEP结合自由能计算全流程解析:从原理到GROMACS实战 1. 为什么我劝你先搞懂FEP再去跑结合自由能计算小分子和蛋白的结合自由能手段很多MM/PBSA、分子对接打分、解算动力学轨迹的熵贡献甚至是深度学习的预测模型。但真到了发文章、做药化决策、判断一个系列化合物哪个值得合成的时候很多人最后还是会落到FEP自由能微扰Free Energy Perturbation上。原因不复杂——它严格基于统计力学在路径上做热力学积分理论上能给出和实验误差接近的结合自由能估值这是打分函数和MM/PBSA这类“快速但近似”的方法给不了的。但这套东西劝退的人也多。FEP的数学不复杂真正劝退的是工程细节拓扑怎么准备、Lambda窗口怎么放、mdp里那一堆软核参数是什么意思、为什么MD跑到一半配体直接飞出去了。网上能找到的教程不少但要么是翻译腔浓重的理论推导要么就是“照着敲出了问题自己猜”。这篇教程不打算在这个层面含糊过去。我会从零开始把完整流程过一遍体系怎么搭建、配体怎么参数化、FEP的mdp每一行到底在干嘛、窗口怎么跑、结果怎么分析每个步骤给足理由和参数。读完之后你能直接拿去跑自己的体系遇到报错也知道从哪里开始排查。适合谁看正在做虚拟筛选、先导化合物优化、或者只是想把自由能计算加进自己技能树的研究生和从业者。有一点计算化学基础最好但即使你是MD新手只要愿意花时间把参数一行行弄明白也能把流程跑通。不过我要先说一句劝退的话FEP不是点击即用的工具它对体系准备和采样时长的要求很高跑错了结果比不打分函数还离谱。2. 方案选型与理论基线为什么FEP要“先走一遍热力学循环”2.1 一个公式看懂FEP在算什么FEP的核心公式长这样ΔG -kBT ln ⟨exp(-ΔU/kBT)⟩₀其中ΔU是体系从状态0到状态1的势能差⟨...⟩₀表示在状态0的系综里做平均kBT是热动能。换句话说FEP干的事是在参考态(λ0)的平衡轨迹里反复计算“如果此刻体系瞬间变成目标态(λ1)能量会变多少”然后把这些能量差取指数平均。这个公式不是近似是严格的热力学关系只要采样足够充分结果就收敛到真实的自由能差。问题是如果直接把配体从“完整存在”硬生生变成“完全消失”大多数采样构象里ΔU都会是一个巨大的正值指数平均会被几个极端构象主导差之毫厘谬以千里。这就是FEP工程实践必须引入“中间态”的原因把一条路切成几十段每一段只做很小的变化让体系在每个窗口里都能充分松弛。这一段段“中间态”就是靠mdp里的lambda值控制的。2.2 为什么计算结合自由能需要跑两个独立的FEP很多人第一次接触FEP时会问直接模拟“配体从水环境中进到蛋白口袋里”不就行了想法很直接但计算上几乎不可行。配体进入口袋的过程涉及去溶剂化、构象变化、蛋白形变这些在纳米级模拟里根本采不完样。更关键的是直接模拟两个物理状态水中的配体 vs 结合态的配合物不是一个“可逆路径”没法在有限的模拟时长里收敛。所以实际操作中我们走的是热力学循环体系A配体在纯水溶液里FEP把配体“关掉”从有相互作用变成无相互作用得到ΔG_solv。体系B配体与蛋白结合形成的复合物在溶液里同样FEP把配体“关掉”得到ΔG_complex。结合自由能ΔG_bind ΔG_complex - ΔG_solv。注意这个“关掉”是热力学上的“解耦”不是真的把原子删掉而是把所有非键相互作用LJ和静电逐渐置零。所以配体原子始终都在但其“物理存在感”被慢慢抹掉。这就是FEP计算里常说的双拓扑思想的雏形——我们并不需要在模拟中把配体物理移除只需要调整它和环境的耦合程度。由于两个体系的起点和终点在热力学循环中互相抵消中间剩下的就是配体结合和去溶剂化的自由能差值。这套流程的天然优势是两个体系各自的统计误差不会简单叠加而且所有中间过渡态都是非物理的不需要担心它们没有实际意义。2.3 FEP和MM/PBSA的边界在哪里MM/PBSA的做法是从一条平衡轨迹里提取大量构象然后对每个构象算作用能再用隐式溶剂模型估计溶剂化自由能。它快因为它只需要一条轨迹但它坏也坏在“一条轨迹”——它假设配体的结合态和自由态在势能面上采样充分且隐式溶剂的描述对这个体系足够准确。小分子高度暴露在溶剂里的情况、结合口袋水分子介导的情况MM/PBSA经常不准。FEP的优点是它通过“炼金术路径”逐步变换压根不依赖显式/隐式溶剂的近似直接统计力学严格求解。所以当你需要区分一个甲基和一个氟原子的结合自由能差异通常只有1~2 kcal/molMM/PBSA那±2 kcal/mol的误差会直接淹没信号而FEP只要采样充足可以做到±0.5 kcal/mol以内。代价也很真实计算成本一般是MM/PBSA的几十倍而且对体系准备极其敏感。结论是初筛阶段用对接和MM/PBSA没有问题但到了需要做SAR决策的最后一公里FEP几乎是唯一靠谱的选择。理解了为什么之后我们开始干活。3. 体系构建蛋白、配体、拓扑文件一个都不能错3.1 蛋白结构准备的下限要求蛋白结构可以从PDB拿但不能拿来就用。第一件事是清理结构去掉水分子晶体水一般删掉除非你确认某个水分子在结合位点起到关键作用后续再用SOL模型加回来、去掉配体以外的异种分子、补缺失loop和侧链。GROMACS里经典流程是pdb2gmx配合力场参数自动加氢、补齐原子。这里必须强调一个常见意识错误FEP对质子化状态极其敏感。蛋白残基的质子化状态直接决定静电势分布而静电势是配体结合的驱动力之一。建议用Propka或者PDB2PQR先算一遍关键残基的pKa再看生理pH下的质子化状态。我以前跑过一组化合物把His质子化状态选反了计算结果明显偏离实验改过来之后排序就正常了。这类错误比mdp参数错误还隐蔽因为程序不会报错只会给你一个可重复但不正确的答案。另外FEP计算中不建议对蛋白做粗粒度或者任何对称性简化。GROMACS的FEP模块要求原子级的拓扑信息简化模型会破坏范德华和静电相互作用的精确计算。蛋白力场选AMBER99SB-ILDN或者CHARMM36m都行重点是你必须保证配体的力场参数和蛋白在同一套兼容体系下。最稳妥的是用GAFF2general AMBER force field配合AMBER力场蛋白用CGenFF配合CHARMM力场蛋白混搭是灾难的源头。3.2 配体参数化的三条路线配体参数化是FEP流程里最容易翻车的环节。GROMACS本身不自带配体力场生成器你需要外部工具把配体的mol2或PDB转成GROMACS拓扑。主流路线有三条acpype基于ANTECHAMBER生成GAFF/GAFF2参数的GROMACS拓扑流程成熟兼容性好适合有机小分子。CGenFFcgenff_charmm2gmx.pyCHARMM力场用户常用前体程序对带特殊官能团的分子比如硼酸酯、含硫杂环错误率低但步骤略繁琐。ParamFit/FFGen手动拟合灵活但门槛高普通体系没必要。我日常主力路线是antechamberacpype。过程大致是用小分子三维结构注意加氢后需要正确的质子化状态跑antechamber -i mol.pdb -fi pdb -o mol.mol2 -fo mol2 -c bcc -s 2然后acpype -i mol.mol2输出文件里就有.itp和.top。这里有几个高频坑。一个是AM1-BCC电荷对构象敏感输入构象不同会导致部分原子电荷出现0.1~0.2 e量级波动对FEP的静电项影响不小。所以配体初始构象尽量用半经验方法例如antechamber里的-gv选项生成或者从头算优化别直接用对接构象。另一个是原子类型命名冲突——acpype生成的原子类型和蛋白力场的原子类型可能同名不同义除非你确认两个拓扑来自同一个力场家族否则至少在最终复合物拓扑里仔细核对一遍LJ参数是否和蛋白一致。3.3 拓扑合并与双拓扑思路FEP的精髓在于“变换同一个分子的相互作用”所以配体对应的耦合参数来自单独的拓扑条目。在GROMACS里一般把配体定义为一个独立的分子类型默认名是MOL然后通过couple-moltype告诉mdrun要对哪个分子类型做炼金术变换。把配体分子类型的名称写错会让mdrun直接忽略所有FEP设置白白跑完整条模拟却只有单一状态的能量这是新手最常犯的静默错误。合并复合物拓扑时典型的做法是先用pdb2gmx生成蛋白部分的.top和.gro然后手动添加配体残基和相关.itp文件。如果你的配体和蛋白之间有共价连接请立刻停下——常规FEP流程处理共价配体需要额外设计“链接原子”方法和对应约束不在本教程范围内。有一件容易被忽视但必须做的事确认配体的原子序号和残基名在.gro文件里与.top文件严格对应。GROMACS的FEP代码按原子索引找配体原子任何一个错位都意味着一部分蛋白原子被错误地耦合结果直接作废。我习惯在生成完整复合物之后用gmx check或直接在.gro里grep配体原子名核对一遍花三十秒省一周。4. FEP的mdp配置逐行拆解你抄过去就能用的完整模板4.1 FEP专用关键词的版本差异先说一个能让老手也头疼的问题GROMACS的FEP关键词在不同版本之间变过一轮。2016.3之前写法是init-lambda加delta-lambda配合多个离散状态来跑2016.3到2019版引入了couple-moltype、couple-lambda0、couple-lambda1这组写法一直沿用到现在的2020系列。新版还额外多了fep-lambda、vdw-lambdas、coul-lambdas这些更细碎的参数。如果你搜到一个2018年的教程照着写在新版上mdrun大概率报“Unknown parameter”。后面所有配置我都基于GROMACS 2021及以后版本老版本用户需要自行对照迁移。新老写法的关键区别在于旧版里配体的逐步消失是通过修改“原子类型到原子的映射”实现的新版则直接把你指定的couple-moltype在couple-lambda0完整状态和couple-lambda1解耦状态之间线性/非线性插值。默认情况下couple-lambda0vdw-q表示这个状态下配体拥有完整的范德华和静电相互作用couple-lambda1vdw表示只有范德华、没有静电如果你想让配体完全消失就应该设置couple-lambda1none。我跑结合自由能时习惯让终点保留微弱的LJ用none会导致完全消失点附近出现数值不稳定后面会细说。4.2 平衡阶段mdp不要在上面省时间FEP正式采样之前体系必须先平衡到合理的密度和温度分布。这一步不跑直接上production的话体系会在最初的几个窗口里剧烈弛豫前几个纳秒的轨迹对自由能估计几乎提供不了有效数据相当于浪费算力。平衡阶段我一般分三步。第一步NVTintegrator md dt 0.002 nsteps 500000 constraints h-bonds tcoupl v-rescale tc-grps System tau-t 0.1 ref-t 300第二步NPT这里开始加压力耦合integrator md dt 0.002 nsteps 500000 constraints h-bonds pcoupl berendsen pcoupl-type isotropic tau-p 2.0 ref-p 1.0 compressibility 4.5e-5 tcoupl v-rescale tc-grps System tau-t 0.1 ref-t 300第三步是解除位置限制的预平衡把define -DPOSRES去掉再跑一段500 ps的NPT。不要越过第三步直接上production因为蛋白侧链和配体在限制力拆除后会重新排布这一步能帮你提前发现体系是否稳定比如配体是否会从口袋掉出来。4.3 Production阶段mdp完整示例与逐行解读这是核心部分。下面这份mdp是我在跑小分子结合自由能项目里的常用模板专门为单配体双拓扑FEP优化过。你复制过去后至少要根据自己的力场和体系微调温度、压力耦合组和步数但FEP核心参数可以直接使用。; FEP production settings free-energy yes couple-moltype MOL couple-lambda0 vdw-q couple-lambda1 vdw couple-intramol no init-lambda-state 0 calc-lambda-neighbors -1 ; soft-core parameters sc-alpha 0.5 sc-r-power 6 sc-coul no sc-sigma 0.3 ; lambda schedule for 11 windows fep-lambda 0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 ; integrator integrator md dt 0.002 nsteps 25000000 nstxout-compressed 5000 nstlog 1000 nstcalcenergy 100 nstenergy 1000 ; temperature coupling tcoupl v-rescale tc-grps Protein_MOL SOL tau-t 0.1 0.1 ref-t 300 300 ; pressure coupling pcoupl berendsen pcoupl-type isotropic tau-p 2.0 ref-p 1.0 compressibility 4.5e-5 ; nonbonded settings cutoff-scheme Verlet vdwtype cutoff vdw-modifier potential-switch rvdw-switch 0.9 rvdw 1.0 coulombtype PME rcoulomb 1.0 ; constraints constraints h-bonds现在逐行解释关键点couple-lambda1 vdw我特意保留了vdw而不用none理由我在4.1说过完全解耦的原子在空间上和别的原子重叠时LJ势能会趋近于零而不是无穷大这能避免数值发散。但这样做的代价是终点状态不是“完全不存在”而是“一个不带电的小泡”。如果你最终想用BAR分析得到严格的热力学值终点不一致会影响结果。所以更标准的做法其实是couple-lambda1 none配合足够的软核参数和短采样步长数值上也能稳定。两者我都跑过差异主要体现在体系里是否还有配体周围水分子主导的行为对最终ΔG的影响通常在0.3 kcal/mol以内。为求稳妥默认模板用vdw但要明白这里的取舍。couple-intramol no这个参数决定配体内部原子之间的相互作用是否也随着lambda改变。结合自由能计算中配体的内部能量键、角、二面角以及内部LJ/静电在溶剂态和结合态中理论上应该相同如果让它们随lambda变化等于你在过程中人为改变了配体的内能会污染结果。所以统一设为no只让配体与环境的分子间相互作用被解耦。calc-lambda-neighbors -1这要求mdrun对每个窗口都计算所有相邻lambda窗口的势能差这样你后续可以用一组轨迹同时做BAR和MBAR分析。如果你设成0只有当前窗口的dhdl.xvg会被记录分析时各种问题层出不穷。这个参数强烈建议保持-1代价只是多几次能量计算收益是多份可以交叉验证的统计样本。sc-alpha 0.5软核参数alpha控制势能变形。值越大势能曲线被压低得越厉害粒子可以在中间态更加“无痛”地穿过彼此。设得太小比如0.1~0.3中间窗口里LJ排斥项会导致能量剧烈波动设得太大比如1.0以上又会扭曲物理势能面。0.5是GROMACS文档给的经验值绝大多数体系都能直接使用。sc-coul no静电相互作用默认不做软核处理因为PME的静电长程项在λ0和λ1之间变化时用普通插值就足够平滑。我见过有人为了加速把sc-coul设成yes结果在中间窗口引入了巨大的人为偏差。记住对静电项做软核不是一个默认必选如果你不是处理特殊的长程静电发散问题保持no。sc-sigma 0.3这个参数是软核相互作用的参考距离。原则上它应该等于体系中典型的原子LJ半径0.3 nm对很多有机分子来说是合适的但我遇到过含卤素配体时需要把它调到0.5才能避免中间窗口发散。为什么因为碘、溴这类原子的LJ半径比碳氢大不少软核势的“软化半径”如果小于真实排斥半径粒子之间还是会撞上数值壁垒。遇到这种情况检查一下中间窗口的能量是否出现尖峰如果一直下不去优先调sc-sigma。fep-lambda 0.00 0.10 ... 1.00这一行写的是所有lambda窗口的数值。11个窗口是最低配置我实际跑项目时通常是16个窗口0到1步长0.0625或者在某些难收敛的配体上放到21个窗口。窗口越多每个窗口的采样时长可以适当缩短总计算量并不会线性增长太多因为相邻窗口的势能差变小收敛更快。窗口间距的选择理论上是“让相邻窗口之间的自由能差尽量均匀”如果你发现某一对相邻窗口的dhdl均值差异特别大比如超过3 kJ/mol中间必须加密窗口。4.4 为什么说mdp里的NPT和NVT耦合组需要按体系分开很多模板里tc-grps System一个组通吃这在普通MD里没有问题但在FEP里却可能造成微妙的采样偏差。FEP通过逐步改变配体与环境的相互作用来改变能量分布如果整个体系只有单一温度耦合组那么配体在解耦过程中异常高的构象能量会被温控机制强行“吸收”这相当于人为引入了一个非物理的热浴端影响自由能估计的准确性。更稳妥做法是参考上面的模板把蛋白和配体作为一个耦合组Protein_MOL溶剂单独作为一个耦合组SOL。这是因为配体和蛋白的耦合状态在lambda变换中始终一致把它们放在同一温度组里可以通过相同的热浴动态耦合避免配体单独温度过高或过低。溶剂作为单独一组温度波动不会直接影响配体相空间采样。虽然这个区分在短时间模拟里看不出来但长时程production中正确的耦合组分会让自由能估计的方差更小。5. 实操流程从准备体系到批量跑窗口的完整命令链5.1 生成盒子、加溶剂、加离子的标准操作假设你手上已经有一个处理好的蛋白结构比如protein_clean.pdb和一个优化好的配体结构ligand.mol2。第一步用pdb2gmx生成蛋白拓扑gmx pdb2gmx -f protein_clean.pdb -o protein_processed.gro -ff amber99sb-ildn -water tip3p -ignh然后定义盒子。盒子大小要保证蛋白任意原子到盒子边缘至少1.2 nm防止镜像作用干扰。典型的做法是gmx editconf -f protein_processed.gro -o protein_box.gro -c -d 1.2 -bt cubic接下来把配体坐标和蛋白坐标合并。注意配体的坐标要落在口袋内如果你对蛋白坐标准确性有信心可以直接把对接得到的复合物PDB作为输入分别给蛋白和配体生成拓扑后再合并。合并的topol.top文件里需要包含蛋白的#include、配体的#include以及分子类型定义。一个典型的手动合并结果如下; Include forcefield parameters #include amber99sb-ildn.ff/forcefield.itp #include amber99sb-ildn.ff/tip3p.itp ; Include protein #include topol_protein.itp ; Include ligand #include ligand.itp [ system ] Protein_Ligand complex [ molecules ] Protein_chainA 1 MOL 1 SOL 0后面加溶剂用gmx solvate然后加离子中和gmx solvate -cp complex_box.gro -cs spc216.gro -o complex_sol.gro -p topol.top gmx grompp -f ions.mdp -c complex_sol.gro -p topol.top -o ions.tpr gmx genion -s ions.tpr -o complex_ions.gro -p topol.top -pname NA -nname CL -neutral这里要特别注意加溶剂后topol.top里的溶剂分子数量会被自动更新但如果你加的是复合物体系蛋白配体solvate命令可能无法正确识别配体所在的区域导致配体周围没有被溶剂覆盖或覆盖过密。我建议溶剂化前先gmx editconf手动将盒子中心对准配体口袋再检查生成的complex_sol.gro里配体周围有没有水分子。5.2 批量生成lambda窗口的脚本思路不要在命令行里一个个手敲grompp和mdrunFEP项目一跑就是几十上百个窗口写脚本是基本素养。下面是一个bash循环生成11个窗口的production TPR并提交for i in 0 1 2 3 4 5 6 7 8 9 10; do gmx grompp -f mdprod.mdp -c npt_eq.gro -t npt_eq.cpt -p topol.top \ -o fep_window_${i}.tpr -n index.ndx \ -define -Dinit_lambda_state${i} 2/dev/null # 或者更稳妥的方式在mdp里用 init-lambda-state ${i} 直接指定 done注意GROMACS 2021以后mdrun在指定lambda窗口时更推荐在命令行用-lambda参数而不是在mdp里写死init-lambda-state。原因很简单你要跑多个窗口如果每个窗口的mdp内容都一模一样只需要在命令行覆盖lambda值即可。执行如下for i in 0 1 2 3 4 5 6 7 8 9 10; do gmx grompp -f mdprod.mdp -c npt_eq.gro -p topol.top \ -o window_${i}.tpr -n index.ndx gmx mdrun -deffnm window_${i} -multidir ./lambda_${i} -lambda ${i} \ -dhdl dhdl_${i}.xvg done-multidir配合多个lambda目录更高效每个目录里放好相同gro和topmdrun会根据-lambda在运行时计算对应的FEP状态。5.3 多窗口并行与资源规划要点FEP计算的一个好消息是窗口之间完全独立天然适合并行。如果你在集群上最简单的方式是用作业调度器把不同窗口分到不同节点上跑。例如SLURM脚本里用job array一个任务对应一个窗口#$ -t 0-10 gmx mdrun -deffnm window_${SGE_TASK_ID} -v但要注意CPU核心分配和设备映射问题。GROMACS的线程MPI模式在多窗口并行时资源利用率不错但如果每个窗口只分配4核心、同时跑11个窗口调度器可能会分配11*444个核心实际节点间通信开销也不小。我这里建议每个窗口至少给足8个核心窗口之间通过作业数组并行单窗口内部再开-ntomp 8这样单个窗口40 ns的模拟大概能在1~2天内完成取决于配体大小和蛋白体系规模。如果你的体系超过6万原子且时间紧张优先考虑GPU加速的-nb gpu选项。5.4 分析阶段用BAR得到最终的ΔG跑完所有窗口每个窗口会输出一个dhdl.xvg文件因为calc-lambda-neighbors-1里面包含当前lambda和相邻lambda之间的势能差。最常用的分析工具是gmx bargmx bar -f window_0/dhdl.xvg window_1/dhdl.xvg ... -o bar.xvg -g bar.logBAR方法通过迭代求解Bennett acceptance ratio给出自由能差和统计误差。如果你的体系有良好的重叠分布BAR的误差通常会落在0.3~1.0 kJ/mol。另一个更强大的选择是alchemical-analysis.py由OpenMM社区维护支持MBAR估算对重叠较差的窗口更稳健。我在多配体比较项目里常用它因为一次可以导入所有窗口的dhdl.xvg自动做前后向收敛检查。最终结合自由能ΔG_bind ΔG_complex - ΔG_solv。注意你需要在“配体纯水”体系和“配体蛋白复合物”体系分别跑一遍上述所有流程才能得到两个Delta G。5.5 一个关键经验先做配体水溶液FEP再跑复合物不要上来就同时启动两个体系的全部窗口。先跑配体水溶液的FEP因为这个体系更简单、更容易收敛能帮你快速检验参数选择是否合理。如果水溶液体系的结果都发散了复合物体系一定更糟。我通常的检查标准是配体水溶液的FEP差值一般在0附近因为配体只是被“关掉”总自由能变化正负取决于溶剂化状态但应该在0到10 kJ/mol范围内。如果结果超过15 kJ/mol说明配体的电荷或者力场参数可能有严重问题先回头查拓扑而不是硬着头皮跑复合物。6. 常见报错与“静默错误”踩过的坑都整理在这里6.1 运行期报错速查表下面这些是我在实际项目里高频遇到的报错整理成一个表格方便你直接对照。报错/异常现象可能原因排查方向ERROR: Unknown parameter free-energy版本太旧或输入关键词拼写错误确认GROMACS版本新版关键词有变化Fatal error: Coupled molecule MOL not foundcouple-moltype与拓扑里分子名不一致检查topol.top里的[ molecules ]和.itp的[ moleculetype ]名能量出现NaN或数值爆炸软核参数设置不当或初始构象重叠检查sc-alpha、sc-sigma用gmx check查看初始能量中间窗口dhdl均值跳变异常窗口间距过大或配体构象在中间态剧烈变化加密窗口检查calc-lambda-neighbors是否开启自由能结果方向错误结合能为正值两个体系的ΔG符号算反再次核对ΔG_bind ΔG_complex - ΔG_solv配体从口袋逃逸初始平衡不够或配体与蛋白结合本来就不稳定加位置限制平衡跑更长的预平衡使用GPU时速度反而下降小体系或窗口过小导致GPU通信开销大仅在体系原子数大于3万时用GPU结果多次运行差异超过1 kcal/mol采样不足或窗口数不够延长采样时间增加窗口数提高多窗口启动的随机种子6.2 最隐蔽的静默错误静模跑完但结果完全错误这类错误最让人头疼因为没有报错输出看起来完全正常。我举三个实际踩过的例子。第一个例子是配体原子名错误导致拓扑里配体原子类型全部被识别为X哑原子GROMACS没有报错能量也没发散但最终结果完全偏离实验。排查方法是一个氢原子一个氢原子地核对.gro里的原子名和.itp里的原子类型是否对应。第二个例子是复合物体系里残留了晶体结构里无关的杂原子比如旧配体碎片、金属离子这些原子参与了非键相互作用却因为不是在FEP变换范围内而被当成“固定背景”导致最终ΔG偏移。删除这些杂原子后结果立刻正常。第三个例子是MD模拟里常见但容易被忽略的所用周期性盒子太小。如果配体解耦后体积最小接近“消失”它的周期性镜像会靠近真实配体位置导致重复计算相互作用。跑之前务必用gmx editconf确认蛋白到盒子边缘的最小距离大于1.2 nm而且配体在解耦状态下的扩展体积不会超出盒子。6.3 收敛性判断别只盯着一个数值FEP结果的可靠性评估是很多新手忽略的环节。只看一个总ΔG就发文章是有风险的至少要做四件事检查每个窗口的dhdl.xvg看看平均势能差随lambda是否平滑变化如果有窗口跳变超过3 kJ/mol基本可以断定是采样不足或窗口间距过大。做“正反跑”验证把FEP方向反过来从none到vdw-q再跑一遍两个方向得到的总自由能差如果在统计误差内一致说明路径可逆性好、结果可信。检查蛋白骨架的RMSD。如果复合物体系的蛋白在FEP过程中发生大规模构象变化尤其是口袋张开或闭合说明初始结构可能不是真正的结合态或者是配体在与蛋白“失配”。多随机种子重复。同一个窗口用不同随机种子跑2次看θ收敛是否一致。尽管MD轨迹对初始速度敏感但自由能差应该在误差范围内可重复。我在实际项目中还发现一个附加技巧如果你在AL化学分析软件里做MBAR它会给每个窗口一个“有效采样量”当你发现某个窗口的有效采样量不到名义采样量的一半那说明该窗口的体系处于被困在局部最小值中需要单独延长采样时间或增加窗口数。7. 一点个人体会做FEP算自由能这件事说难也难说不难也不难。难在它是一个系统工程从蛋白处理、配体参数化、体系平衡、窗口设置到结果判读任何一环出错都会让你拿到一个“看起来很美”但经不起检验的数字。说它不难是因为只要严格按流程走不自作聪明地跳过任何一步它其实是一个非常成熟的工具GROMACS社区的文档和论坛积累完备能帮你解决绝大多数技术问题。我个人最大的体会是不要一上来就对自豪的系统追求极致的精度。第一次完整跑通一个已知结合自由能的小分子比如苯酚或者苯并咪唑类对照实验值检验整个pipeline是否可靠再逐步扩展到你的目标系列。我见过太多人直接拿全新化合物开跑FEP结果跑出个-15 kcal/mol的荒谬值整个项目卡一个多月才发现是配体拓扑里少了两个氯原子的电荷。从现在开始给自己设置一个“先复现已知结果”的流程关卡这会帮你在后续所有真正的研究任务里节省大量时间。
返回列表