OmegaTherm 使用指南:蛋白质突变稳定性预测与输入检查
一个蛋白质突变体可能同时改变折叠自由能和熔解温度,但这两种测量回答的问题不同。OmegaTherm 将它们纳入同一个基于序列的建模框架,同时保留独立输出。第一次使用时,先弄清分数含义、突变如何表示,以及公开工作流程中哪些部分已经具备运行条件。
本文核查原始研究与公开实现,并提供一个小型输入准备工具。资料核查日期为 2026 年 10 月 8 日。该研究是 2026 年 9 月 28 日发布的 bioRxiv 预印本;下文性能数字来自作者报告,不是本文重新跑出的基准结果。
1. OmegaTherm 预测什么
| 输出 | 含义 | 论文中的单位 |
|---|---|---|
| ΔΔG | 突变引起的折叠自由能变化 | kcal/mol |
| ΔTm | 突变引起的熔解温度变化 | °C |
两项输出有关联,但不能互换。不要将它们直接平均,也不要用固定倍数相互换算。尤其要注意,ΔTm 是变化量,不是突变体的绝对熔解温度。
排序前先确认符号约定。 论文的 ΔΔG 分类将大于 +0.5 kcal/mol 视为稳定化,小于 −0.5 视为去稳定化,中间区间视为中性。与采用相反符号约定的工具对比时,不能直接混用。这些阈值用于论文的分类任务,不是通用的实验验收标准。见论文 ΔΔG 结果部分。
2. 模型如何结合两种测量
官方方法说明介绍了三个主要部分:
- 共享的蛋白质语言模型分别编码野生型与突变型序列,并提供从序列推断的接触信息。
- 各测量任务专用的突变中心编码器整合改变位点附近的上下文,也纳入较远的接触邻居。
- 自蒸馏与交叉蒸馏在配对不完整的 ΔΔG、ΔTm 数据之间传递监督信息,同时过滤不一致的伪标签。
反对称设计使交换野生型与突变型时,预测符号相应反转。这是有用的一致性约束,但不能证明预测在实验上准确。多个替换位点会一起建模;把独立的单突变预测值相加,不是同一个计算过程。
因此,基于序列输入并不意味着模型忽略空间上下文。它使用预测接触信息,不要求用户提供实验解析的结构。
3. 论文报告了哪些结果
作者用 S461、M223 评估单突变和多突变的 ΔΔG,用 S571、M286 评估 ΔTm。报告的单突变 ΔΔG Pearson 相关系数为 0.83,单突变 ΔTm 的 MAE 为 4.89 °C。Methods 中说明,测试蛋白与对应训练蛋白的序列一致性经过不超过 25% 的过滤。见论文 Results 与 Methods。
这些数字应放在论文的评估协议下理解。与其他模型对比前,要对齐数据集、突变方向、排除规则和指标。整个数据集上的相关系数,也不能直接说明模型能否排好你关心的某个蛋白的候选变体。
自己的实验应避免同源蛋白和正反向突变对泄漏到不同数据划分中。针对实际需要的测量,同时报告绝对误差和排序表现,并保留独立测试集。本站的蛋白质分组划分教程说明了普通随机按行划分可能产生的问题。
4. 选择在线服务器或本地代码
公开服务器接受 CSV 上传,并要求填写邮箱。其链接的帮助页使用 name、wt_seq、mut_seq、pH、temp,蛋白质序列采用大写字母,温度单位为 °C。
这里有一个重要的界面差异:核查当天,上传表单明确要求每行恰好改变一个残基;本地预测脚本则支持多个替换。组合突变应在获得权重后使用本地流程,或向作者确认服务器当前是否支持。不要把模型框架的能力直接等同于网页表单已经开放的功能。
本地实现也接受突变字符串,不过本文生成明确的野生型与突变型序列对,便于提交前直接检查改动是否正确。
5. 准备一份经过检查的小型输入
下载 prepare_omegatherm.py。它只使用 Python 标准库,Python 3.10 或更新版本即可。在新的目录中运行:
python3 prepare_omegatherm.py --help
python3 prepare_omegatherm.py variants.csv \
--sequence ACDEFGHIKLMNPQRSTVWY \
--mutation D3N \
--mutation 'A1V;Y20F' \
--ph 7 --temp 25
程序输出 Wrote 2 variants to variants.csv,并生成:
name,wt_seq,mut_seq,pH,temp
variant_1,ACDEFGHIKLMNPQRSTVWY,ACNEFGHIKLMNPQRSTVWY,7.0,25.0
variant_2,ACDEFGHIKLMNPQRSTVWY,VCDEFGHIKLMNPQRSTVWF,7.0,25.0
这条 20 残基序列是虚构的格式示例,不是经过生物学验证的蛋白,也不包含预测结果。D3N 表示按 1 起算的位置 3 由 D 变为 N。第二行把位置 1 和 20 的改变放在同一个变体中,用于本地多突变流程,不适用于当前只接受单突变的上传表单。
真实任务应使用实际研究的序列构建体和条件。PDB 文件、成熟链或带标签构建体中的残基编号,未必与提交序列中的位置一致。
下面的工具有意只接受 20 种标准氨基酸的大写字母,拒绝重复位置和没有改变残基的写法,也不会覆盖已有输出。1,000 残基上限是本教程采取的保守规则,不是论文公布的模型性能边界。
"""Build a validated OmegaTherm CSV; this does not run the prediction model."""
import argparse
import csv
import math
from pathlib import Path
import re
AMINO_ACIDS = set("ACDEFGHIKLMNPQRSTVWY")
def make_mutant(sequence, mutations):
if not sequence or len(sequence) > 1000 or set(sequence) - AMINO_ACIDS:
raise ValueError("Use 1-1000 uppercase standard amino-acid residues")
tokens = mutations.split(";")
result = list(sequence)
used = set()
for token in tokens:
match = re.fullmatch(r"([ACDEFGHIKLMNPQRSTVWY])([1-9][0-9]*)([ACDEFGHIKLMNPQRSTVWY])", token)
if match is None:
raise ValueError(f"Invalid substitution: {token!r}")
old, position, new = match.groups()
index = int(position) - 1
if index >= len(sequence) or sequence[index] != old:
raise ValueError(f"Wild-type residue or position mismatch: {token}")
if index in used or old == new:
raise ValueError(f"Repeated position or unchanged residue: {token}")
used.add(index)
result[index] = new
return "".join(result)
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("output", type=Path, help="new CSV path; parent must exist")
parser.add_argument("--sequence", required=True)
parser.add_argument("--mutation", action="append", required=True,
help="one variant per flag; use semicolons within a variant")
parser.add_argument("--ph", type=float, required=True)
parser.add_argument("--temp", type=float, required=True, help="degrees Celsius")
args = parser.parse_args()
try:
if not math.isfinite(args.ph) or not 0 <= args.ph <= 11:
raise ValueError("pH must be finite and between 0 and 11")
if not math.isfinite(args.temp) or not 0 <= args.temp <= 120:
raise ValueError("Temperature must be finite and between 0 and 120 Celsius")
rows = []
for number, mutations in enumerate(args.mutation, start=1):
mutant = make_mutant(args.sequence, mutations)
rows.append([f"variant_{number}", args.sequence, mutant, args.ph, args.temp])
with args.output.open("x", encoding="utf-8", newline="") as handle:
writer = csv.writer(handle, lineterminator="\n")
writer.writerow(["name", "wt_seq", "mut_seq", "pH", "temp"])
writer.writerows(rows)
except (OSError, ValueError) as exc:
parser.exit(1, f"error: {exc}\n")
print(f"Wrote {len(rows)} variants to {args.output}")
if __name__ == "__main__":
main()
本地预测脚本可能将缺失或非数值的条件字段替换成默认值。其数据集代码在内部缩放前,将 pH 限制到 0–11,将温度限制到 0–120 °C。本文工具要求显式提供这两个区间内的有限数值,避免这些转换悄悄改变提交条件。这些软件取值区间不等于经过验证的模型适用范围。见固定版本的输入处理代码与数据集实现。
6. 本地推理还需要哪些文件
下面的命令对应核查过的仓库提交 423b16a2361500a44c1afe7e383ad5167a8fabf7。这是根据源码检查的安装流程;本文没有运行完整模型推理。
git clone https://github.com/CSUBioGroup/OmegaTherm.git
cd OmegaTherm
git checkout 423b16a2361500a44c1afe7e383ad5167a8fabf7
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements.txt
python predict_mutations.py --help
默认集成预测需要 ESM-2 编码器,以及三个训练后的检查点:
weights/
esm2_t33_650M_UR50D/
single_ddG_LocalTransformer_AntiSym_rank_FullFT_pseudo_finetune_final.pt
single_dTm_LocalTransformer_AntiSym_rank_FullFT_pseudo_finetune_final.pt
joint_fullft_localtransformer_cross_pseudo_final.pt
核查版本中的 weights 目录只有文件放置说明,没有检查点二进制文件。顶层 README 列出了文件名,但没有完整的检查点下载步骤。继续之前,需要从作者的正式发布渠道获得匹配文件;仅克隆仓库或下载 ESM-2 并不足以运行 OmegaTherm。
依赖列表没有固定版本,因此应保存最终能与权重配合运行的环境。不要为了掩盖检查点不匹配而关闭严格加载。
所需文件就绪后,把自己的 variants.csv 复制到仓库根目录,再运行:
python predict_mutations.py \
--input-csv variants.csv \
--output-csv variants_predictions.csv \
--batch-size 1 \
--precision fp32
预测脚本在 CUDA 可用时选择 CUDA,否则选择 CPU。批量大小 1 是起点设置,不保证模型一定适合你的硬件。数据集启用了 tokenizer 截断,默认 --max-length 为 1022 个 token;处理长序列前,要核查分词长度和突变位点是否仍在输入范围内。
7. 读取输出并测试输入准备步骤
本地 CSV 区分单任务输出列 ddG_fullft、dTm_fullft 与联合模型输出列 ddG_joint、dTm_joint。最终的 ddG_pred、dTm_pred 对可用的单任务和联合预测取平均。这些是点估计,不是置信区间。服务器示例使用正向与逆向列名,不要假设两个接口的输出格式相同。见本地输出代码和服务器结果示例。
把下面的检查代码保存为 check_input.py,与下载的工具放在一起,运行 python3 check_input.py:
from prepare_omegatherm import make_mutant
sequence = "ACDEFGHIKLMNPQRSTVWY"
assert make_mutant(sequence, "D3N") == "ACNEFGHIKLMNPQRSTVWY"
assert make_mutant(sequence, "A1V;Y20F") == "VCDEFGHIKLMNPQRSTVWF"
for invalid in ["A3N", "D3D", "D3N;N3A", "Y21F"]:
try:
make_mutant(sequence, invalid)
except ValueError:
pass
else:
raise AssertionError(f"Accepted invalid substitution: {invalid}")
print("PASS: single/multiple substitutions and invalid inputs")
输入准备工具通过了六项本地测试,包括两个有效示例与上游突变构建函数的结果一致、拒绝非法条件,以及保留已有输出文件。这些测试只验证输入处理,不验证神经网络预测,也不复现论文准确率。
8. 排错与第一次实验
| 问题 | 下一步 |
|---|---|
| 野生型残基不匹配 | 检查序列版本、构建体边界和从 1 起算的编号。 |
| 找不到检查点文件 | 获取指定的训练权重;只有 ESM-2 不等于具备 OmegaTherm。 |
| 序列很长或突变靠近末端 | 推理前检查分词长度与截断行为。 |
| pH 或温度被意外改变 | 显式提供合法数值条件,并检查输出 CSV。 |
| 多突变上传被拒绝 | 遵守当前服务器限制,或使用本地预测脚本。 |
| 与其他工具的预测不一致 | 先对齐测量类型、方向、符号、条件和序列构建体。 |
先从少量已有可比条件下实验测量的变体开始,检查排序和绝对误差对该蛋白是否有用。预测稳定性提高,不应被当成亲和力、表达量或活性测量。
9. 小结
OmegaTherm 为两种不同的稳定性响应提供共享建模框架,本地实现支持联合评估多个替换位点。先准备正确的序列对和明确的条件,再检查接口限制与权重要求。用分数帮助安排实验优先级,并围绕自己的蛋白和目标测量验证结果。
- 原文作者:春江暮客
- 原文链接:https://www.bobobk.com/omegatherm-protein-stability-guide.html
- 版权声明:本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。