评分函数基础:能量、得分与热力学
评分函数是什么?说白了,它就是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更好。但如果出现正值,通常代表严重的空间冲突或非物理构象,需要排查。这一点和多数力场是一致的。
有人问过我:“Rosetta的得分能直接当作结合自由能ΔG用吗?”我的回答是:不能直接,但有办法逼近。Rosetta的评分函数是在气态下计算的,缺少熵的估计和溶剂化效应。我们在做结合亲和力预测时,通常会用能量差 + 溶剂化校正 + 构象熵估计的组合来近似ΔG。
热力学基础:评分函数为什么能预测结合亲和力
热力学是评分函数打分的根基。结合亲和力的经典表达式是:
ΔG = -RT ln Kd
ΔG越负,结合越强,Kd越小。但Rosetta不能直接算Kd,它只能算构象能量的差值。这里面有一个关键的近似:我们认为结合态(complex)和未结合态(unbound)之间的能量差,大致反映ΔG的变化趋势。
换句话说,Rosetta评分函数假设:能量(E)≈ 焓(H),并且忽略熵变(ΔS)的相对差异。这种近似在刚性体系里很准,但在柔性大的蛋白-多肽体系里就容易翻车。
把评分函数和热力学挂钩,最常用的方法是:
- 计算结合态的能量(E_complex)
- 拆开两个分子,分别算未结合态能量(E_protein + E_ligand)
- 能量差 ΔE = E_complex - (E_protein + E_ligand)
- 加溶剂化校正项(如LIE或MM/PBSA类似的方法)
- 加构象熵估计(通常用harmonic approximation或quasi-harmonic)
- 最终得到近似的结合自由能
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的评分函数只是近似,为什么还要用它?因为快。一个结合模式可以在几分钟内算完,实验验证要几周。对药物设计中的虚拟筛选来说,速度就是生命。
你看这个框架图:评分函数从能量项分解开始,再到如何把能量转化为可比较的得分,最终落脚到热力学基础。这三块缺一不可。我们在实际项目里也总是沿着这条路径走的——先确认用了哪些能量项,再看得分差异,最后用热力学关系检验预测是否合理。