ThermoMPNN
v1.0.0Predict mutation ΔΔG values and identify stabilizing substitutions for protein engineering.
ThermoMPNN online on ProteinIQ predicts the stability change (ΔΔG, in kcal/mol) of every single amino acid substitution in one protein chain, from a PDB structure. It runs the Kuhlman Lab's published analysis/custom_inference.py entry point at a pinned source commit with the default ThermoMPNN checkpoint, and returns the native CSV of site-saturation predictions together with a provenance file.
ThermoMPNN is a graph neural network from Henry Dieckhaus and colleagues at the University of North Carolina, published in PNAS in 2024. It reuses the structural embeddings of ProteinMPNN and adds a small prediction module trained on the Megascale stability dataset. The sections below cover the input, the one setting, the output table, and how to read the ΔΔG values.
A ThermoMPNN job costs a flat 20 credits. The price does not depend on protein length or on the chain selected, and the quote appears before submission.
| Input | Accepted formats | Notes |
|---|---|---|
Protein Structure | .pdb, .ent, or a PDB ID such as 1HSG | One structure, up to 50 MiB. PDB IDs are fetched from RCSB in PDB format. mmCIF is not accepted |
The native parser reads fixed PDB columns, which is why mmCIF files are refused. A structure predicted with ESMFold or AlphaFold2 can be used directly, since both return PDB files.
| Parameter | Type | Default | Description |
|---|---|---|---|
Chain to analyze | string | A | One single-character chain ID. Leave blank to use the first chain. A missing chain is refused early |
There are no model or sampling settings. The run always uses the default ThermoMPNN checkpoint shipped with the source.
| Output | Description |
|---|---|
Data tab | Spreadsheet of every predicted substitution, sortable and filterable |
ThermoMPNN_inference_<name>.csv | The native ThermoMPNN CSV, returned unchanged |
ThermoMPNN_provenance_<name>.json | Source repository, commit, model checksum, submitted file name, and chain used for the run |
The table has 20 rows per residue: the 19 substitutions plus the self-mutation.
| Column | Native field | Description |
|---|---|---|
Model | Model | Model label, ThermoMPNN |
Dataset | Dataset | Dataset label taken from the submitted structure name |
Predicted ΔΔG (kcal/mol) | ddG_pred | Predicted change in folding free energy for the substitution |
Position (zero-based) | position | Position counted from the chain's first residue, starting at 0 |
Wild type | wildtype | Original amino acid, one-letter code |
Mutation | mutation | Substituted amino acid, one-letter code |
PDB | pdb | Structure label written by the native code |
Chain | chain | Chain that was analyzed |
ThermoMPNN reports ΔΔG so that negative values are stabilizing. The model was trained on the negated Megascale ddG_ML values, and its own helper for picking the best mutants takes the most negative predictions.
| Predicted ΔΔG (kcal/mol) | Reading |
|---|---|
| below −0.5 | Predicted stabilizing; the threshold used in the paper's benchmark |
| −0.5 to +0.5 | Within the model's error; treat as neutral |
| above +0.5 | Predicted destabilizing |
| above +2 | Strongly destabilizing; usually buried or structural positions |
The model's training data spans roughly −5 to +5 kcal/mol, so values far outside that range carry little extra meaning. On held-out Megascale proteins the paper reports an RMSE of about 0.7 kcal/mol, which is why differences of a few tenths between two substitutions are not informative.
Each residue also has a row where the mutation equals the wild type (for example A→A) with a ΔΔG of exactly 0. ThermoMPNN computes every ΔΔG as the mutant prediction minus the wild-type prediction at the same position, so the self-mutation is zero by construction. It is not a check on the model, and it can be filtered out.
Position (zero-based) is not the residue number in the PDB file. The parser counts from the chain's first residue number, so a chain starting at residue 25 has residue 25 at position 0. Gaps in the numbering still occupy positions, and those positions get no rows. Residues that are not one of the 20 standard amino acids are skipped too; selenomethionine (MSE) is read as methionine and other HETATM residues are ignored.
To map a row back to the structure, add the chain's first residue number to the position.
The native code builds the PDB label by stripping the characters ., p, d and b from both ends of the file name, so a file called bpd1.pdb is labelled 1. The label is cosmetic; the provenance file keeps the original file name.
Position (zero-based) as the PDB residue number.Sort Predicted ΔΔG (kcal/mol) ascending and drop the self-mutations to get a ranked list of candidate stabilizing substitutions. Positions where most substitutions are strongly destabilizing are usually buried core residues; positions where many substitutions are near zero are tolerant surface sites. For a protein engineering shortlist, check each candidate in the structure, avoid functional residues, and confirm with a second method such as the sequence-based protein stability predictor or Stab-DDG before ordering variants.
ThermoMPNN is distributed as source code in the Kuhlman-Lab/ThermoMPNN repository; there is no official web server. Running it locally means setting up the Python environment and ProteinMPNN weights, then calling custom_inference.py with a PDB file, chain, and model path.
ProteinIQ runs that same entry point at commit 2b04fd3 on a GPU and returns the native CSV unchanged, with a provenance file recording the commit and model checksum. Results open in a sortable table, jobs are kept in the workspace history, and paid plans can submit jobs through the ProteinIQ API.
Only the default single-mutant checkpoint is available. ThermoMPNN-D, the double-mutant model the same lab released later, and the experimental insertion and deletion variant are not offered on ProteinIQ.
ThermoMPNN combines a frozen, pretrained ProteinMPNN feature extractor with a lightweight stability module. ProteinMPNN treats the protein as a graph in which residues are nodes and edges connect each residue to its 48 nearest neighbours, with distances encoded by radial basis functions.
A light attention block reweights the extracted per-residue embeddings, and a multilayer perceptron with hidden layers of 64 and 32 units predicts a ΔG for each of the 20 amino acids at a position. The ΔΔG of a substitution is the mutant value minus the wild-type value.
The model was trained on the Megascale dataset from Tsuboyama et al., 272,712 proteolysis-based stability measurements across 298 natural and designed domains. It was also tested on Fireprot, a set of 3,438 traditional biophysical measurements across 100 proteins with a wider range of −9 to +12 kcal/mol.
| Test set | Pearson correlation | RMSE (kcal/mol) |
|---|---|---|
| Megascale | 0.754 | 0.708 |
| Fireprot (homologue-free) | 0.650 | 1.51 |
| Ssym (direct) | 0.72 | not reported |
For stabilizing mutations (ΔΔG below −0.5 kcal/mol), the reported positive predictive value is about 56% on Fireprot and 46% on Megascale. Roughly half of the predicted stabilizers are expected to be real.
Score single and multi-site protein mutations with evolutionary and inverse-folding profiles.
Predict protein stability changes across single amino acid substitutions.
Analyze aggregation-prone regions in a protein structure.
Predict protein aggregation nucleation propensity from amino acid sequences.
Predict pKa values of ionizable groups in proteins based on 3D structure.
Predict protein solubility from sequence with feature-level and windowed profile outputs.
Characterize nanobody developability with sequence, structure, and surface-property metrics.
Predict metal and water binding sites in proteins with 3D CNN models.
Generate 30 sequence-derived spatial descriptors for paired antibody variable domains.
Screen paired antibody Fv sequences for high-concentration viscosity risk.