Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions Dockerfile.envs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ RUN --mount=type=cache,target=/opt/conda/pkgs,sharing=locked \
mamba create -n realkcat_env python=3.9 -c conda-forge -y \
&& conda run -n realkcat_env pip install -r docker-requirements/realkcat_requirements.txt

FROM base AS env-catrange
COPY docker-requirements/catrange_requirements.txt ./docker-requirements/
RUN --mount=type=cache,target=/opt/conda/pkgs,sharing=locked \
--mount=type=cache,id=webkinpred-pip-py310,target=/root/.cache/pip,sharing=locked \
mamba create -n catrange_env python=3.10 -c conda-forge -y \
&& conda run -n catrange_env pip install -r docker-requirements/catrange_requirements.txt

FROM base AS env-pseq2sites
RUN --mount=type=cache,target=/opt/conda/pkgs,sharing=locked \
--mount=type=cache,id=webkinpred-pip-py37,target=/root/.cache/pip,sharing=locked \
Expand Down Expand Up @@ -161,6 +168,7 @@ COPY --from=env-mmisakm /opt/conda/envs/mmisakm_env /opt/conda/envs/mmisakm_e
COPY --from=env-omniesi /opt/conda/envs/omniesi_env /opt/conda/envs/omniesi_env
COPY --from=env-iecata /opt/conda/envs/iecata_env /opt/conda/envs/iecata_env
COPY --from=env-realkcat /opt/conda/envs/realkcat_env /opt/conda/envs/realkcat_env
COPY --from=env-catrange /opt/conda/envs/catrange_env /opt/conda/envs/catrange_env
COPY --from=env-pseq2sites /opt/conda/envs/pseq2sites /opt/conda/envs/pseq2sites
COPY --from=env-esm /opt/conda/envs/esm /opt/conda/envs/esm
COPY --from=env-esmc /opt/conda/envs/esmc /opt/conda/envs/esmc
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Open Kinetics Predictor is a production web interface for predicting enzyme kine
| CataPro | Protein sequence + substrate SMILES | kcat, Km, or kcat/Km | [Wang et al., Nat Commun 2025](https://www.nature.com/articles/s41467-025-58038-4) ([GitHub](https://github.com/zchwang/CataPro)) |
| CatPred | Protein sequence + substrate SMILES | kcat or Km | [Boorla et al., Nat Commun 2025](https://www.nature.com/articles/s41467-025-57215-9) ([GitHub](https://github.com/maranasgroup/CatPred)) |
| OmniESI | Protein sequence + substrate SMILES | kcat or Km | [Nie et al., arXiv 2025](https://doi.org/10.48550/arXiv.2506.17963) ([GitHub](https://github.com/Hong-yu-Zhang/OmniESI)) |
| RealKcat | Protein sequence + substrate SMILES | kcat or Km | [Sajeevan et al., bioRxiv 2025](https://doi.org/10.1101/2025.02.10.637555) ([GitHub](https://github.com/TKAI-LAB-Mali/RealKcat)) |
| CatRange | Protein sequence + substrate SMILES | kcat or Km | [Sajeevan et al., bioRxiv 2025](https://doi.org/10.1101/2025.02.10.637555) ([GitHub](https://github.com/ssbio/CatRange)) |
| IECata | Protein sequence + substrate SMILES | kcat/Km | [Wang et al., Brief Bioinform 2025](https://doi.org/10.1093/bib/bbaf283) ([GitHub](https://github.com/zhaoyanpeng208/IECata)) |
| MMISA-KM | Protein sequence + substrate SMILES | Km | [Song & Wang, DDCLS 2025](https://doi.org/10.1109/DDCLS66240.2025.11064981) ([GitHub](https://github.com/kaiwang-group/MMISA-KM)) |

Expand Down
36 changes: 36 additions & 0 deletions api/methods/catrange.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from api.methods.base import MethodDescriptor, SubprocessEngineConfig


descriptor = MethodDescriptor(
key="CatRange",
display_name="CatRange",
authors=(
"Karuna Anna Sajeevan, Abraham Osinuga, Arunraj B, Sakib Ferdous, "
"Nabia Shahreen, Shashank Koneru, Laura Mariana Santos-Correa, "
"Rahil Salehi, Niaz Bahar Chowdhury, Randy Aryee, Brisa Calderon-Lopez, "
"Supantha Dey, Ankur Mali, Rajib Saha, and Ratul Chowdhury"
),
publication_title="CatRange Enables Robust Prediction of Enzyme Variant Kinetic Regimes",
citation_url="https://doi.org/10.1101/2025.02.10.637555",
repo_url="https://github.com/ssbio/CatRange",
supports=["kcat", "Km"],
input_format="single",
output_cols={
"kcat": "Predicted kcat range: kcat (1/s)",
"Km": "Predicted KM range: kM (M)",
},
max_seq_len=1024,
col_to_kwarg={"Substrate": "substrates"},
target_kwargs={
"kcat": {"kinetics_type": "KCAT"},
"Km": {"kinetics_type": "KM"},
},
subprocess=SubprocessEngineConfig(
python_path_key="CatRange",
script_key="CatRange",
data_path_env={
"CATRANGE_REPO_ROOT": "CatRange",
"CATRANGE_MODELS_DIR": "CatRange",
},
),
)
33 changes: 1 addition & 32 deletions api/methods/realkcat.py
Original file line number Diff line number Diff line change
@@ -1,32 +1 @@
from api.methods.base import MethodDescriptor, SubprocessEngineConfig

descriptor = MethodDescriptor(
key="RealKcat",
display_name="RealKcat",
authors="Sajeevan AK, Osinuga A, Mali A, et al.",
publication_title="Robust Prediction of Enzyme Variant Kinetics with RealKcat",
citation_url="https://doi.org/10.1101/2025.02.10.637555",
repo_url="https://github.com/TKAI-LAB-Mali/RealKcat",

supports=["kcat", "Km"],
input_format="single",
output_cols={"kcat": "kcat (1/s)", "Km": "Km (M)"},
max_seq_len=1022, # ESM2 context limit

col_to_kwarg={"Substrate": "substrates"},
target_kwargs={
"kcat": {"kinetics_type": "KCAT"},
"Km": {"kinetics_type": "KM"}
},

subprocess=SubprocessEngineConfig(
python_path_key="RealKcat",
script_key="RealKcat",
data_path_env={
"REALKCAT_DATA": "RealKcat_DATA",
"REALKCAT_EMBED_CACHE_DIR": "realkcat_esm2_last_mean",
},
),

embeddings_used=["realkcat_esm2_last_mean"],
)
"""Legacy RealKcat module retained as an empty stub after the method was replaced by CatRange."""
12 changes: 12 additions & 0 deletions docker-requirements/catrange_requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
numpy==1.26.4
pandas==2.2.3
tqdm==4.19.0
joblib==1.4.2
scikit-learn==1.1.3
transformers==4.44.2
tokenizers==0.19.1
huggingface-hub==0.24.7
safetensors==0.4.5
# CatRange runtime uses the local ESM-C package from the repo checkout; install it from source.
esm @ git+https://github.com/evolutionaryscale/esm.git
torch==2.4.0
2 changes: 1 addition & 1 deletion docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Open Kinetics Predictor
<article class="feature-card">
<p class="feature-kicker">Compare</p>
<h2>Use published engines</h2>
<p>Access KinForm, UniKP, DLKcat, TurNup, EITLEM, CataPro, CatPred, OmniESI, RealKcat, IECata, and MMISA-KM through one interface.</p>
<p>Access KinForm, UniKP, DLKcat, TurNup, EITLEM, CataPro, CatPred, OmniESI, CatRange, IECata, and MMISA-KM through one interface.</p>
</article>
<article class="feature-card">
<p class="feature-kicker">Extend</p>
Expand Down
2 changes: 1 addition & 1 deletion docs/project/supported_methods.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Supported engines
- CatPred, kcat and Km.
- OmniESI, kcat and Km.
- OmniESI + O2DENet, kcat and Km.
- RealKcat, kcat and Km.
- CatRange, kcat and Km.
- IECata, kcat/Km.
- MMISA-KM, Km.

Expand Down
8 changes: 4 additions & 4 deletions frontend/src/components/ApiDocs/ApiDocs.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ export default function ApiDocs() {
"KinForm-L": 0,
"CatPred": 0,
"OmniESI": 0,
"RealKcat": 0,
"CatRange": 0,
"IECata": 1,
"MMISA-KM": 0,
"Server": 0
Expand All @@ -589,7 +589,7 @@ export default function ApiDocs() {
"KinForm-L": 1500,
"CatPred": 2048,
"OmniESI": 1000,
"RealKcat": 1022,
"CatRange": 1024,
"IECata": 1000,
"MMISA-KM": 500,
"Server": 10000
Expand Down Expand Up @@ -905,10 +905,10 @@ export default function ApiDocs() {
<td>1,000 residues</td>
</tr>
<tr>
<td><code>RealKcat</code></td>
<td><code>CatRange</code></td>
<td>kcat or Km</td>
<td><code>Protein Sequence</code>, <code>Substrate</code></td>
<td>1,022 residues</td>
<td>1,024 residues</td>
</tr>
<tr>
<td><code>IECata</code></td>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const FORMAT_SPECS = [
{
key: 'single',
name: 'Single Substrate',
methods: ['CataPro', 'CatPred (Km)', 'DLKcat', 'EITLEM', 'IECata', 'KinForm-H', 'KinForm-L', 'MMISA-KM', 'OmniESI', 'RealKcat', 'UniKP'],
methods: ['CataPro', 'CatPred (Km)', 'CatRange', 'DLKcat', 'EITLEM', 'IECata', 'KinForm-H', 'KinForm-L', 'MMISA-KM', 'OmniESI', 'UniKP'],
columns: [
{ col: 'Protein Sequence', desc: 'full amino-acid sequence' },
{ col: 'Substrate', desc: 'SMILES or InChI — one per row' },
Expand Down
37 changes: 37 additions & 0 deletions models/CatRange/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
__pycache__/
*.py[cod]
.ipynb_checkpoints/
.DS_Store
.pytest_cache/
*.log
.venv/
envs/*/

# CatRange XGBoost model binaries are hundreds of MB and should be released
# through Zenodo/Hugging Face/GitHub Releases or another model host.
inference/models/*.pkl
inference/models/*fold*.pt
catrange_model/outputs/
catrange_model/logs/
catrange_model/data/processed/
catrange_model/data_robust_v1/
catrange_model/data_robust_v1
reproducibility_runs/

# External benchmark caches/checkpoints are generated, very large, and
# reproducible from the scripts plus manifests.
benchmarks/retrained_comparators/**/catpred_esm2_cache/
benchmarks/retrained_comparators/**/checkpoints/
benchmarks/retrained_comparators/**/*.pt
benchmarks/retrained_comparators/**/*.pth
benchmarks/retrained_comparators/**/*.pkl
benchmarks/retrained_comparators/**/*.joblib
benchmarks/retrained_comparators/tmp*/
benchmarks/retrained_comparators/vendor/

# Local model/package build products.
*.egg-info/
build/
dist/

ignore/
Loading