Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
4b7c53d
BRENDA data files: ship xz-compressed instead of raw TSV
edkerk Sep 8, 2026
c7096f6
brenda_loader: read the xz-compressed TSVs (missed from previous commit)
edkerk Sep 8, 2026
c64ff4d
Drop examples/yeast-GEM, a config sample with no test coverage relyin…
edkerk Sep 8, 2026
2cbf08e
BRENDA data: xz-compress at build time instead of storing xz in git
edkerk Sep 9, 2026
8476c1f
cli: default brenda-refresh --cache-dir to the OS user cache dir
edkerk Sep 9, 2026
827d91e
fuzzy_kcat_matching: select among EC numbers by search order, matchin…
edkerk Sep 11, 2026
b2252e4
load_conventional_gem: read YAML with raven-toolbox's read_yaml_model
edkerk Sep 11, 2026
f93ac4d
databases: add download_phyl_dist for RAVEN's keggPhylDist.mat
edkerk Sep 11, 2026
f336137
full_ecModel tutorial: full PhylDist, KEGG EC fallback, ecFVA and lig…
edkerk Sep 11, 2026
a7506bb
docs: evotune weight descriptions, PhylDist and YAML loading, changelog
edkerk Sep 11, 2026
977e190
docs: point the MATLAB/Python comparison links at a page that exists
edkerk Sep 11, 2026
17cc7b0
Merge pull request #54 from SysBioChalmers/fix/fuzzy-origin-rank-and-…
edkerk Sep 11, 2026
998c2cb
Apply evotune's trust tiers to fuzzy-matched kcats
edkerk Sep 17, 2026
a8929be
Read a metabolite's SMILES whatever shape the annotation is in
edkerk Sep 20, 2026
050ed49
fix: divide a BRENDA kcat by the substrate it was measured on
edkerk Sep 20, 2026
dda36d9
Merge pull request #55 from SysBioChalmers/fix/evotune-source-tier-ma…
edkerk Sep 20, 2026
416f085
Read the SMILES annotation in the OKP result parser too
edkerk Sep 20, 2026
6aec35a
Merge remote-tracking branch 'origin/develop' into fix/smiles-annotat…
edkerk Sep 20, 2026
206e02c
Merge pull request #56 from SysBioChalmers/fix/smiles-annotation-roun…
edkerk Sep 20, 2026
2ce94b2
Merge pull request #57 from SysBioChalmers/fix/kcat-matched-substrate…
edkerk Sep 20, 2026
fcfb0b8
BRENDA: filter implausible SA-derived kcats; default top_origin_limit…
edkerk Sep 23, 2026
ddaea51
Add sweep_tunable_mask_size/recommend_target_impact_share (#59)
edkerk Sep 23, 2026
a725bb3
Fix Complex Portal search paging; correct the corrections() docs exam…
edkerk Sep 24, 2026
53273fa
Point repository, documentation and RAVEN data links to CompMetEng (#65)
edkerk Oct 17, 2026
faac3bc
Share model_adapter.toml with GECKO (#61)
edkerk Oct 17, 2026
fbaceba
Read CatRange predictions returned as class ranges (#62)
edkerk Oct 17, 2026
9938784
Complex levelling, per-complex relaxation and relax_enz_concs (#63)
edkerk Oct 17, 2026
a2db645
Keep gathered kcats as kcat source files, one per source (#64)
edkerk Oct 17, 2026
40b4cb8
Assign kcats from the kcat source files, as model_adapter.toml sets (…
edkerk Oct 17, 2026
7a2e4fc
Estimate kcats from the EC tree; make brenda_ec_tree the default pres…
edkerk Oct 17, 2026
900f63e
Kcat strategies, BRENDA from toolbox-assets and GECKO 3 project upgra…
edkerk Oct 19, 2026
ebc83e3
feat: record the ecModel format and geckopy release in saved ecModels…
edkerk Oct 24, 2026
b87ce74
Match GECKO on EC cell separators, zero-bound capacity, the flexibili…
edkerk Oct 24, 2026
7a2ca5c
get_conc_control_coeffs: read the reduced cost of each usage bound, c…
edkerk Oct 24, 2026
d9b0d94
Match GECKO on rounding ties in truncate_values, the detail text of a…
edkerk Oct 25, 2026
d6ec54d
fit_sigma and sensitivity_tuning follow sigmaFitter and sensitivityTu…
edkerk Oct 25, 2026
1f84c1a
Merge the sigma fit and sensitivity tuning changes
edkerk Oct 25, 2026
d04efd8
get_conc_control_coeffs keeps a reduced cost by the rise it predicts;…
edkerk Oct 25, 2026
59bc30b
get_conc_control_coeffs: check every nonzero reduced cost and skip a …
edkerk Oct 25, 2026
ff60a1e
apply_kcat_constraints treats an empty update list as all reactions, …
edkerk Oct 25, 2026
32e5e32
make_ec_model refuses what makeEcModel refuses and splits only revers…
edkerk Oct 25, 2026
9a83297
get_conc_control_coeffs: read the reduced cost from the HiGHS bound m…
edkerk Oct 25, 2026
0cddf12
Merge the make_ec_model refusals and the set_kcat_for_reactions defaults
edkerk Oct 25, 2026
c8d41b4
Merge the scipy dual path of get_conc_control_coeffs
edkerk Oct 25, 2026
f109c6a
flexibilize_enz_concs scores units by probes when the solver returns …
edkerk Oct 25, 2026
9ebc61a
Merge pull request #70 from CompMetEng/parity/round-2
edkerk Oct 28, 2026
c07b5ce
Same results as GECKO for subsets, subsystems, uniprot cells, FSEOF a…
edkerk Oct 30, 2026
edb3422
Remove the references to the retired Bayesian kcat tuning
edkerk Oct 30, 2026
342f67b
Return the infeasible solution from every solve instead of raising (#75)
edkerk Oct 31, 2026
9858210
KEGG database, solver tolerance and zero-total f factor as in GECKO (…
edkerk Oct 31, 2026
d982091
get_conc_control_coeffs takes the finite-difference coefficients by d…
edkerk Oct 31, 2026
dad777a
get_enzyme_bottlenecks ranks by the re-solved change of the objective…
edkerk Nov 1, 2026
f4550b2
Edge cases of geckopy agree with GECKO (#78)
edkerk Nov 1, 2026
42610cc
README: shorter, with the GECKO logo and the protocol citation (#79)
edkerk Nov 1, 2026
6d816c4
pfba_enzymes: fraction_of_optimum for a negative or minimised objecti…
edkerk Nov 2, 2026
1ead274
Release 4.0.0b2 (#82)
edkerk Nov 2, 2026
7827ad2
Merge main into develop for the release 4.0.0b2
edkerk Nov 2, 2026
576ea9f
Fix the ruff findings: unused imports, an unused variable, a lambda a…
edkerk Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@
*.txt text eol=lf
*.xml text eol=lf
*.md text eol=lf

# A fixture that must keep its byte-order mark and CRLF line endings.
tests/data/kcatSourceFixture.tsv -text
4 changes: 0 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ name: release
# https://pypi.org/manage/project/geckopy/settings/publishing/ , pointing
# at this repo, workflow filename `release.yml`, and environment `pypi`.
# 2. Create a `pypi` environment in this repo's Settings -> Environments.
# Also note: geckopy's `raven-toolbox` dependency is currently a git direct
# reference (see pyproject.toml), which PyPI rejects on upload -- the
# pypi-publish job below will fail until that's switched to a released
# version pin.

on:
release:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ htmlcov/
# Tutorial build outputs (the source yeast-GEM.yml is tracked).
tutorials/full_ecModel/models/ecYeastGEM*.yml
tutorials/full_ecModel/output/
# Downloaded on first run by the tutorial (download_phyl_dist).
tutorials/full_ecModel/data/PhylDist.mat

# BRENDA bulk download (user drops the tarball here; derived TSVs are tracked).
src/geckopy/data/brenda/_cache/
168 changes: 168 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

151 changes: 32 additions & 119 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,148 +1,61 @@
# geckopy

[![tests](https://github.com/SysBioChalmers/geckopy/actions/workflows/test.yml/badge.svg)](https://github.com/SysBioChalmers/geckopy/actions/workflows/test.yml)
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/CompMetEng/geckopy/develop/img/gecko-logo-white.png">
<img src="https://raw.githubusercontent.com/CompMetEng/geckopy/develop/img/gecko-logo.png" alt="GECKO" width="400px">
</picture>

Enzyme-constrained genome-scale metabolic modelling in Python.
[![tests](https://github.com/CompMetEng/geckopy/actions/workflows/test.yml/badge.svg)](https://github.com/CompMetEng/geckopy/actions/workflows/test.yml)
[![Release](https://img.shields.io/github/v/release/CompMetEng/geckopy?include_prereleases)](https://github.com/CompMetEng/geckopy/releases/)
[![Documentation](https://readthedocs.org/projects/gecko-docs/badge/?version=latest)](https://gecko-docs.readthedocs.io/en/latest/)
[![GitHub Discussions](https://img.shields.io/github/discussions-search?query=repo%3ACompMetEng%2Fgeckopy&label=GitHub%20Discussions)](https://github.com/CompMetEng/geckopy/discussions)

> **Full documentation for both MATLAB GECKO and geckopy — the six-stage
> protocol, installation, troubleshooting, and complete API reference —
> lives at [gecko-docs.readthedocs.io](https://gecko-docs.readthedocs.io/).**
> This README only covers install and a quick orientation; that site is
> the place to actually learn or look things up.
**[Documentation](https://gecko-docs.readthedocs.io/en/latest/)** · [Installation](https://gecko-docs.readthedocs.io/en/latest/installation/) · [Guide](https://gecko-docs.readthedocs.io/en/latest/guide/) · [API reference](https://gecko-docs.readthedocs.io/en/latest/api/) · [Migrate](https://gecko-docs.readthedocs.io/en/latest/migrate.html) · [Citations](https://gecko-docs.readthedocs.io/en/latest/references.html)

> **Disambiguation.** This is a new, from-scratch port of the
> [GECKO Toolbox](https://github.com/SysBioChalmers/GECKO) (MATLAB). It is unrelated to
> the earlier and separate `geckopy` Python package
> ([on PyPI as release 2.0.2 and earlier](https://pypi.org/project/geckopy/2.0.2/))
> described in Carrasco Muriel, Long & Sonnenschein, *Microbiology Spectrum*
> 11(6):e01705-23 (2023), [doi:10.1128/spectrum.01705-23](https://doi.org/10.1128/spectrum.01705-23).
# geckopy

## What this is
Enzyme-constrained genome-scale metabolic modelling in Python: the Python port of the [GECKO Toolbox](https://github.com/CompMetEng/GECKO) (MATLAB). It builds on [cobrapy](https://github.com/opencobra/cobrapy) and [raven-toolbox](https://github.com/CompMetEng/raven-toolbox), and reads and writes the same ecModel YAML files as GECKO, so ecModels move between the two toolboxes without conversion.

Genome-scale metabolic models (GEMs) describe an organism's chemistry as a
big network of reactions. A standard GEM lets each reaction run as fast as
its substrates allow. In reality, enzymes catalyse those reactions, and
each enzyme has a finite capacity (its kcat) and a finite supply (the
cell's total protein budget). An *ec*Model (enzyme-constrained model)
adds those limits to the network.
An *ec*Model adds the limits of enzymes to a genome-scale model: each enzyme has a finite capacity (its kcat) and the cell has a finite protein budget. geckopy fetches kcats from BRENDA, predicts them with DLKcat, tunes them against growth and flux data with CMA-ES, applies custom curations and integrates proteomics.

geckopy is a Python port of the [GECKO Toolbox](https://github.com/SysBioChalmers/GECKO)
(MATLAB). It builds on [cobrapy](https://github.com/opencobra/cobrapy) for
the standard modelling layer, then layers GECKO's enzyme-constraint machinery
on top: it fetches kcat values from BRENDA, predicts them with DLKcat, tunes
them against experimental growth/flux data with CMA-ES, applies custom
curations, and integrates proteomics measurements.
> **Status: beta (`4.0.0b2`).** The yeast-GEM tutorial runs end to end. The major and minor version follow GECKO, which is why it starts at 4.

> **Status: beta (`4.0.0b1`).** All the MATLAB GECKO 3.2.5 functions used in
> the standard ecModel build are ported, and the yeast-GEM tutorial runs
> end-to-end. geckopy's major and minor version number (x.y.-) will follow
> the MATLAB GECKO numbering, justifying a jump to version 4.
> **Not the older geckopy.** This is a new port of GECKO. It is unrelated to the earlier `geckopy` on PyPI (release 2.0.2 and earlier), described in Carrasco Muriel, Long & Sonnenschein, *Microbiology Spectrum* 11(6):e01705-23 (2023), [doi:10.1128/spectrum.01705-23](https://doi.org/10.1128/spectrum.01705-23).

## Install

geckopy depends on [raven-toolbox](https://github.com/SysBioChalmers/raven-toolbox)
(the Python port of the RAVEN Toolbox). Both are currently pre-releases on
PyPI, so a plain `pip install geckopy` will install the wrong version — `--pre` is
required:
Both geckopy and raven-toolbox are pre-releases, so pip needs `--pre`:

```bash
pip install --pre geckopy
```

`raven-toolbox` doesn't need to be named separately: geckopy's own dependency
on it already specifies `>=3.0.0b1`, and a specifier that names a pre-release
opts pip into matching pre-releases for that package too, `--pre` or not. To
pin the exact versions this was written against instead of "whatever's
newest," name both explicitly:

```bash
pip install raven-toolbox==3.0.0b1 geckopy==4.0.0b1
```

Optional extras:

```bash
# Adds matplotlib (needed to render plots from the tutorial)
pip install --pre "geckopy[tutorial]"

# Adds cma (needed for CMA-ES kcat tuning, geckopy.kcat_tuning.evotune)
pip install --pre "geckopy[evotune]"

# Adds pytest + ruff (only needed if you're contributing)
pip install --pre "geckopy[dev]"
```

Requires Python 3.11 or newer.
Extras: `geckopy[tutorial]` (matplotlib), `geckopy[evotune]` (cma, for kcat tuning) and `geckopy[dev]` (pytest and ruff). Python 3.11 or newer.

## Quick start

A minimal end-to-end build, assuming you have a project folder set up the
way the tutorial expects (`model_adapter.toml` + `models/` + `data/`):
A minimal build, for a project folder with `model_adapter.toml`, `models/` and `data/`:

```python
from geckopy import (
ModelAdapter,
load_conventional_gem,
load_uniprot_tsv,
make_ec_model,
save_ec_model,
)

# 1. The adapter holds organism-specific parameters (taxonomy id,
# biomass reaction, average enzyme saturation, etc.). They live in
# model_adapter.toml so they're easy to swap per organism.
adapter = ModelAdapter.from_folder("my_project")
from geckopy import ModelAdapter, load_conventional_gem, load_uniprot_tsv, make_ec_model, save_ec_model

# 2. Load the starting GEM (the regular metabolic model you want to
# extend) and a cached UniProt query (for enzyme MW and sequence).
adapter = ModelAdapter.from_folder("my_project")
model = load_conventional_gem(adapter)
uniprot = load_uniprot_tsv(adapter.params.path / "data" / "uniprot.tsv")

# 3. Build the ecModel. This adds protein pseudo-metabolites, a shared
# protein pool, and per-enzyme usage reactions on top of the GEM.
ec_model = make_ec_model(model, adapter, uniprot_db=uniprot)

# 4. Save in geckopy's YAML format.
save_ec_model(ec_model, "ecModel.yml", adapter=adapter)
```

Every public function (loaders, kcat fetchers, FBA/FVA helpers,
YAML I/O, ...) is reachable as `from geckopy import X` -- the
subpackages exist for code organisation but you don't have to use
them. See `geckopy.__all__` for the full list (~80 names).

The full protocol (which adds kcat curation from BRENDA and DLKcat,
proteomics integration, and Crabtree-effect simulation) is in
[`tutorials/full_ecModel/protocol.py`](tutorials/full_ecModel/protocol.py).
That script reproduces the MATLAB GECKO Nature Protocols tutorial in
Python, step by step, and is the easiest way to see geckopy in action.

Fitting kcats against measured growth rates and exchange fluxes (rather
than looking them up) is a separate workflow, `geckopy.kcat_tuning.evotune`
— see [`docs/evotune_kcat_tuning.md`](docs/evotune_kcat_tuning.md).

## On-disk format

geckopy reads and writes ecModels as **YAML**: a canonical,
human-readable format that is a strict superset of cobrapy's YAML
schema, with three extra top-level keys for the ec data (`ec-rxns`,
`ec-enzymes`, `gecko_light`). Standard cobrapy tools (escher, memote,
...) can read the cobra portion and silently ignore the GECKO
extensions. The same format is read and written by MATLAB GECKO /
RAVEN, so ecModels exchange between the two toolboxes with no
translator. The schema and the parsing live in raven-toolbox.

See [`docs/yaml_format.md`](docs/yaml_format.md) for the YAML
specification and how it differs from the legacy MATLAB / RAVEN format.

## Relationship to MATLAB GECKO

geckopy is a function-by-function port: algorithmic fidelity comes
first, Pythonic idiom second. Each ported source file carries a
`Ported from GECKO MATLAB: <path>` docstring header. For current
MATLAB ↔ Python behavioural differences, see [gecko-docs.readthedocs.io](https://gecko-docs.readthedocs.io/), the
shared documentation site for both toolboxes.
The guide covers each step: [Getting started](https://gecko-docs.readthedocs.io/en/latest/guide/getting-started.html), [Building an ecModel](https://gecko-docs.readthedocs.io/en/latest/guide/building-ec-model.html) and [Gathering kcats](https://gecko-docs.readthedocs.io/en/latest/guide/gathering-kcats.html). Every public function is available as `from geckopy import X`; `geckopy.__all__` lists them, and the [API reference](https://gecko-docs.readthedocs.io/en/latest/api/) documents them. The full protocol, with kcat curation, proteomics and Crabtree-effect simulation, is [`tutorials/full_ecModel/protocol.py`](tutorials/full_ecModel/protocol.py). Fitting kcats to measured growth and fluxes is described in [`docs/evotune_kcat_tuning.md`](docs/evotune_kcat_tuning.md).

## Documentation and parity with GECKO

The protocol, installation, troubleshooting and API reference for both toolboxes are at [gecko-docs](https://gecko-docs.readthedocs.io/). The ecModel YAML format is described in the [guide](https://gecko-docs.readthedocs.io/en/latest/guide/yaml-format.html) and in [`docs/yaml_format.md`](docs/yaml_format.md). geckopy ports GECKO function by function, and each source file names its MATLAB original. The [parity ledger](https://github.com/CompMetEng/raven-gecko-parity) records, for every public function, whether the two agree and why where they do not.

## Cite us

If you have used geckopy in your work, please cite the GECKO protocol:

> Chen Y, Gustafsson J, Tafur Rangel A, Anton M, Domenzain I, Kittikunapong C, Li F, Yuan L, Nielsen J & Kerkhoven EJ. Reconstruction, simulation and analysis of enzyme-constrained metabolic models using GECKO Toolbox 3.0. *Nature Protocols* **19**, 629-667 (2024). doi:[10.1038/s41596-023-00931-7](https://doi.org/10.1038/s41596-023-00931-7).

## License

MIT. See [`LICENSE`](LICENSE), or the `license` field of
[`pyproject.toml`](pyproject.toml).
MIT. See [`LICENSE`](LICENSE).
8 changes: 7 additions & 1 deletion docs/evotune_kcat_tuning.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,10 +319,16 @@ leverage_by_rxn = dict(zip(screen["rxn_id"], screen["leverage"]))
leverage = [leverage_by_rxn.get(r, 0.0) for r in result.rxns]

annotations = annotate_from_model(model, result.rxns)
rows = result.corrections(leverage=leverage, **annotations)
rows = result.corrections(
leverage=leverage,
names=annotations["names"], ec_codes=annotations["ec_codes"],
)
open("corrections.tsv", "w").write(corrections_tsv(rows))
```

`annotate_from_model` also returns `sources`, which `corrections()`
takes from `result.groups` itself rather than as a keyword.

`cumulative_share` on each row is the running fraction of total leverage
the list has accounted for so far, so a reader can stop where it stops
climbing rather than reading every row. This is the tuning-time
Expand Down
6 changes: 4 additions & 2 deletions docs/future_improvements.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ weren't blocking. Three audiences:
spotted while comparing the two implementations side by side. For
the current, maintained list of MATLAB ↔ Python behavioural
differences (broader than just what's tracked here), see the
[MATLAB ↔ Python translation guide](https://gecko-docs.readthedocs.io/en/latest/api/translation/)
[GECKO vs. geckopy](https://gecko-docs.readthedocs.io/en/latest/gecko-to-geckopy.html) page
on [gecko-docs.readthedocs.io](https://gecko-docs.readthedocs.io/).
- **anyone hitting a strange dependency bug** — section
"Third-party library gotchas".
Expand Down Expand Up @@ -134,7 +134,9 @@ Notable items:
the docstring's origin ranking implies origin 4 should win. Either
swap the search order so any-no-subs-kcat is tried before org-SA,
or update the docstring to match the search order. geckopy
replicates the current MATLAB behavior; see the note in
replicates the current MATLAB behavior, both within one EC number
and when selecting among the EC numbers of one reaction; see
`SEARCH_LEVELS` and `SEARCH_RANK` in
`fuzzy_kcat_matching/_brenda_query.py`.
- Delete `updateProtPool` from MATLAB GECKO. The function has been
obsolete since GECKO 3.2.0 (all enzymes, measured and unmeasured,
Expand Down
4 changes: 2 additions & 2 deletions docs/gecko_light_status.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ smaller models (yeast, *E. coli*), full is usually fine.

```python
ec_model = make_ec_model(model, adapter, gecko_light=True)
set_kcat_for_reactions(ec_model, ["R2"], 5.0) # broadcasts to all isozyme rows
set_kcat_for_reactions(ec_model, ["001_R2", "002_R2"], 5.0) # one row per isozyme
apply_kcat_constraints(ec_model) # picks cheapest isozyme per cobra rxn
set_prot_pool_size(ec_model)
ec_model.optimize()
Expand Down Expand Up @@ -67,7 +67,7 @@ isn't checked out next to geckopy.
| `src/geckopy/ec_model/make_ec_model.py` | dispatches stage 5 (isozyme split) and stages 9/11 (per-enzyme prot mets + usage rxns) off; calls `allocate_ec_and_coupling_light` instead of the full stages 6/8 |
| `src/geckopy/ec_model/pipeline/populate_ec.py` | `allocate_ec_and_coupling_light` builds `ec.rxns` (one row per isozyme with the `###_` prefix) and `ec.rxn_enz_mat` in one pass; `split_light_rxn_id` is the inverse |
| `src/geckopy/ec_model/pipeline/apply_kcat.py` | `_apply_kcat_constraints_light` groups ec rows by cobra reaction, picks the lowest-cost isozyme, writes `-MW_sum / (kcat * 3600)` as the `prot_pool` coefficient; same clear-then-write idempotency contract as full |
| `src/geckopy/ec_model/pipeline/set_kcat.py` | recognises the `###_` prefix as the light analogue of `_EXP_<N>`; bare base names broadcast to every isozyme row |
| `src/geckopy/ec_model/pipeline/set_kcat.py` | the `###_` prefix is part of the id in a light model: `001_R2` matches that one row and a bare cobra id such as `R2` matches nothing |
| `src/geckopy/ec_model/enzyme.py` | `Enzyme.reactions` strips the prefix and dedupes; `Enzyme.mw` setter passes ec.rxns ids (not cobra ids) to `apply_kcat_constraints`; `_repr_html_` catches the light NotImplementedError |
| `src/geckopy/gather_kcats/fuzzy_kcat_matching.py` | strips the `###_` prefix for cobra lookups |
| `src/geckopy/gather_kcats/get_standard_kcat.py` | `_ec_rxn_to_cobra_id` handles both forms |
Expand Down
2 changes: 1 addition & 1 deletion docs/internal/raven_inventory.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# RAVEN function inventory

GECKO MATLAB is built on top of
[RAVEN](https://github.com/SysBioChalmers/RAVEN), a MATLAB toolkit
[RAVEN](https://github.com/CompMetEng/RAVEN), a MATLAB toolkit
for genome-scale metabolic modelling. RAVEN handles all the
low-level work: parsing SBML files, editing reactions and
metabolites, solving FBAs, manipulating gene-protein-reaction
Expand Down
6 changes: 3 additions & 3 deletions docs/kcat_aggregation.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# kcat aggregation: how far is `max` from `median` on BRENDA?

The bundled BRENDA snapshot ships **both** the per-(ec, substrate,
The BRENDA files (toolbox-assets release `brenda-2026.1-1`) carry **both** the per-(ec, substrate,
organism) max and the per-triple median of all raw measurements that
fell into the triple. They live in the same `kcat.tsv` / `sa.tsv` file
distinguished by an `aggregation` column; `load_brenda_data` splits
Expand All @@ -20,7 +20,7 @@ diffusion-limited filter in `parse_brenda_json`):
- [`scripts/kcat_aggregation_raw.py`](../scripts/kcat_aggregation_raw.py)
walks the raw JSON and answers both questions below.
- [`scripts/kcat_aggregation_compare.py`](../scripts/kcat_aggregation_compare.py)
reads only the bundled TSV (no 710 MB JSON needed) and compares
reads only the BRENDA TSV (no 710 MB JSON needed) and compares
per-EC max-of-max vs median-of-median over the pre-aggregated views.

> **3.4.21.4 (trypsin) is excluded** from these analyses: its BRENDA
Expand Down Expand Up @@ -158,5 +158,5 @@ python scripts/kcat_aggregation_raw.py # raw-JSON, both layers
python scripts/kcat_aggregation_compare.py # snapshot-only, per-EC
```

Raw-JSON takes ~6 min on the bundled snapshot (limited by 710 MB JSON
Raw-JSON takes ~6 min on the BRENDA 2026.1 dump (limited by 710 MB JSON
load via WSL2 /mnt/c); snapshot-only runs in ~10 s.
Loading
Loading