评分函数基础:能量、得分与热力学

评分函数是什么?说白了,它就是Rosetta用来评估分子结构好坏的“裁判”。我刚接触Rosetta时,以为评分函数是个黑盒子,其实它背后的物理很清晰。本质上,它是一套能量方程,能把分子的三维坐标换算成单一的能量值。

你想想看,一个蛋白质-配体复合物的构象可能有几万个自由度。怎么判断哪个构象更稳定、结合更强?用直觉?不行。用实验?太慢。这时候评分函数就派上用场了——它快速给出一个分数,分数越低,代表体系越稳定。

Rosetta的评分函数,我习惯叫它“全原子能量函数”。它不依赖经验打分表,而是尽量用物理项去逼近真实的热力学状态。这和传统的分子力学力场(比如AMBER、CHARMM)有点像,但Rosetta更强调计算效率和可微调性。

能量项物理来源典型函数形式
范德华(fa_atr)原子间色散与排斥Lennard-Jones 6-12势
静电(fa_elec)电荷间库仑作用库仑定律 + 距离相关介电
溶剂化(fa_sol)疏水效应与溶剂暴露Lazaridis-Karplus隐式溶剂模型
氢键(hbond)方向性静电与极化角度依赖的12-10势
二面角(rama)主链/侧链构象偏好基于统计势的查表/多项式
旋转异构体(dunbrack)侧链构象的偏好项基于 Dunbrack 库的查表

为什么要这么多项?因为真实的热力学能量本身就是多体效应的叠加。我在项目中遇到过一个问题:只用范德华和静电项去优化一个蛋白-多肽对接,结果总是出现非物理的紧密接触。后来加上溶剂化项和氢键项,结果才合理。记住,每个项都有它的“管辖范围”,缺了谁都不行。

能量与得分:从物理量到可比较的数值

Rosetta计算出的能量值,我们通常叫它“得分”。但这并不是真实的自由能,而是一个“打分值”。它的单位既不是kcal/mol,也不是kJ/mol,而是Rosetta Energy Unit(REU)。

REU的绝对值没有物理意义,但相对值有意义。一个构象比另一个构象低了5 REU,就意味着它更稳定。我在做结合亲和力预测时,从来不看单点能量的绝对值,只看突变前后或对接前后的打分差。

关于正负号——我见过不少新手搞混。Rosetta的规则是:负值越低(越负),能量越稳定。没错,-50 REU比-30 REU更好。但如果出现正值,通常代表严重的空间冲突或非物理构象,需要排查。这一点和多数力场是一致的。

经验之谈:我在蛋白质-小分子对接项目中发现,范德华项的能量差往往占ΔG预测的主导,但静电项对突变非常敏感。如果你想优化一个结合位点的静电互补性,优先看fa_elec项的变化。

有人问过我:“Rosetta的得分能直接当作结合自由能ΔG用吗?”我的回答是:不能直接,但有办法逼近。Rosetta的评分函数是在气态下计算的,缺少熵的估计和溶剂化效应。我们在做结合亲和力预测时,通常会用能量差 + 溶剂化校正 + 构象熵估计的组合来近似ΔG。

热力学基础:评分函数为什么能预测结合亲和力

热力学是评分函数打分的根基。结合亲和力的经典表达式是:

ΔG = -RT ln Kd

ΔG越负,结合越强,Kd越小。但Rosetta不能直接算Kd,它只能算构象能量的差值。这里面有一个关键的近似:我们认为结合态(complex)和未结合态(unbound)之间的能量差,大致反映ΔG的变化趋势。

换句话说,Rosetta评分函数假设:能量(E)≈ 焓(H),并且忽略熵变(ΔS)的相对差异。这种近似在刚性体系里很准,但在柔性大的蛋白-多肽体系里就容易翻车。

避坑指南:我曾经在一个项目中算了一个蛋白-多肽复合物的结合自由能,直接拿Rosetta score差值当ΔG,结果与实验偏差很大。后来才意识到,Rosetta输出的是gas-phase能量,必须经过溶剂化校正和熵估计才能与ΔG近似。后来加入了“interface analyzer”模块算溶剂化变化,相关性才从0.3升到0.7。

把评分函数和热力学挂钩,最常用的方法是:

  1. 计算结合态的能量(E_complex)
  2. 拆开两个分子,分别算未结合态能量(E_protein + E_ligand)
  3. 能量差 ΔE = E_complex - (E_protein + E_ligand)
  4. 加溶剂化校正项(如LIE或MM/PBSA类似的方法)
  5. 加构象熵估计(通常用harmonic approximation或quasi-harmonic)
  6. 最终得到近似的结合自由能

Rosetta社区提供了一个叫score_jd2的模块,可以批量输出各项能量。我个人习惯写一个Python脚本,从silent文件中提取每个构象的各项分数,然后做后处理。下面是个简单的示例:

# 从Rosetta silent文件提取能量项
# 假设已经得到 output.silent 文件
from pyrosetta import *
from pyrosetta.rosetta.core.io.silent import SilentFileIO

init()
sf = ScoreFunctionFactory.create_score_function("ref2015")
silent_struct = SilentFileIO.read("output.silent")

for pose in silent_struct:
    sf(pose)
    total_energy = pose.energies().total_energy()
    # 提取各项
    fa_atr = pose.energies().total_energies()["fa_atr"]
    fa_elec = pose.energies().total_energies()["fa_elec"]
    fa_sol = pose.energies().total_energies()["fa_sol"]
    print(f"能量差值: {total_energy:.2f}  REU")

但注意,这个直接输出的total_energy绝对不能代替ΔG。它只能用来比较构象的优劣,不能定量预测结合亲和力。

技巧:在Rosetta的官方文档里,你经常见到“score vs energy”的讨论。我的理解是:score是经过特定权重缩放后的值,energy是原始的物理项。两者本质一样,但score经过优化,更适合做打分比较。所以直接用score做氨基酸突变分析会更灵敏。

讲到这里,你可能会问:既然Rosetta的评分函数只是近似,为什么还要用它?因为快。一个结合模式可以在几分钟内算完,实验验证要几周。对药物设计中的虚拟筛选来说,速度就是生命。

评分函数核心概念与知识体系 评分函数核心概念 能量项分解 能量→得分 热力学基础 范德华 静电 溶剂化 氢键 二面角 说明: 评分函数将分子结构分解为多个能量项,每个项有对应的物理势能函数。 能量累加后得到总分,用于比较不同构象的稳定性。 热力学基础决定了这些能量差值与真实结合自由能的映射关系。

你看这个框架图:评分函数从能量项分解开始,再到如何把能量转化为可比较的得分,最终落脚到热力学基础。这三块缺一不可。我们在实际项目里也总是沿着这条路径走的——先确认用了哪些能量项,再看得分差异,最后用热力学关系检验预测是否合理。