Predicting protein stability and enzyme kinetics through the physics of molecular vibrations. A multimodal deep learning framework combining vibrational spectroscopy, graph neural networks, and protein language models.
Traditional models treat proteins as static structures. But catalysis depends on dynamics — the collective vibrations that gate conformational changes. QDD is the first framework to explicitly encode the Vibrational Density of States (VDOS) as a predictive feature.
Normal Mode Analysis extracts vibrational frequencies from protein structures. These encode the thermodynamic landscape that governs stability and function.
Each protein has a unique VDOS spectrum — a 1D signal encoding all vibrational modes. Our 1D CNN learns patterns invisible to sequence-only models.
VibroPredict fuses sequence (ProtT5), spectral (CNN on VDOS), and chemical (ChemBERTa + DRFP) encodings with learned attention gating.
The VibroPredict hybrid model processes protein sequence, vibrational spectrum, and substrate chemistry in parallel, then fuses them through learned attention gates.
Adjust the broadening parameter to see how Lorentzian convolution transforms discrete normal modes into a continuous Density of States. This is exactly what the CNN encoder sees.
VibroPredict targets R² > 0.75 on the KinHub-27k benchmark, a substantial improvement over existing enzyme kinetics models.
| Model | Year | R² | Features |
|---|---|---|---|
| TurNuP | 2022 | 0.62 | Seq + FP |
| DLKcat | 2021 | 0.64 | Seq + Graph |
| UniKP | 2023 | 0.68 | ProtT5 + SMILES |
| MPEK | 2023 | 0.70 | ESM-2 + SMILES |
| VibroPredict | 2025 | >0.75 | Seq + VDOS + Chem |
from vibropredict.models import VibroPredictHybrid
model = VibroPredictHybrid(fusion_dim=512)
logkcat, gates = model(
sequences=["MKTIIALSYIF..."],
vdos=vdos_tensor, # (1, 1, 1000)
substrate_smiles=["CC(=O)O"],
)
print(f"k_cat = {10**logkcat:.1f} s⁻¹")
print(f"Attention: seq={gates[0,0]:.2f} "
f"spec={gates[0,1]:.2f} "
f"chem={gates[0,2]:.2f}")
from vibropredict.training import (
TrainerWithMMDrop,
MutantRankingLoss,
)
trainer = TrainerWithMMDrop(
model=model,
optimizer=optimizer,
device="cuda",
)
# MM-Drop: randomly drops spectral
# branch 25% of the time for robustness
best_loss = trainer.fit(
train_loader, val_loader,
loss_fn=MutantRankingLoss(lambda_rank=0.1),
epochs=50, p_drop=0.25,
)
Full pipeline overview: data → NMA → model → prediction
Vibrational analysis on Ubiquitin with entropy curves
Enzyme stability prediction with Spearman evaluation
Multi-label GO term prediction with F-max optimization
Tri-modal architecture overview and inference demo
KinHub-27k + EnzyExtractDB standardization pipeline
Train with MM-Drop and MutantRankingLoss
Branch contribution analysis and SOTA comparison