From 4ae69c48598fc2ffbce6a770e0c67704213daa94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 17:42:38 +0100 Subject: [PATCH 1/4] Update pydata-sphinx-theme requirement from >=0.15 to >=0.23.0 (#37) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates the requirements on [pydata-sphinx-theme](https://github.com/pydata/pydata-sphinx-theme) to permit the latest version.
Release notes

Sourced from pydata-sphinx-theme's releases.

v0.23.0

What's Changed

Improvements

Fixes

Maintenance

Dependencies

New Contributors

Full Changelog: https://github.com/pydata/pydata-sphinx-theme/compare/v0.22.0...v0.23.0

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2000382..cde1921 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ sphinx>=9.2.0 -pydata-sphinx-theme>=0.15 +pydata-sphinx-theme>=0.23.0 myst-parser>=5.1.0 sphinx-design>=0.7.0 sphinx-copybutton>=0.5.2 From 12b5cb48b50de3083155c1a887b1a98ba79fb423 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Fri, 6 Nov 2026 23:29:39 +0100 Subject: [PATCH 2/4] Replace decides, carries, picked, ships and handles in the guide and migration pages --- docs/gecko3-to-gecko4.md | 2 +- docs/gecko3-upgrade-project.md | 8 ++++---- docs/gecko4-kcat-assignment.md | 6 +++--- docs/gecko4-project-format.md | 4 ++-- docs/guide/applying-kcats.md | 10 +++++----- docs/guide/basic-model-operations.md | 2 +- docs/guide/building-ec-model.md | 4 ++-- docs/guide/data-folder-files.md | 2 +- docs/guide/gathering-kcats.md | 8 ++++---- docs/guide/gecko-light.md | 2 +- docs/guide/growth-rate-tuning.md | 2 +- docs/guide/introduction.md | 2 +- docs/guide/model-adapter-parameters.md | 4 ++-- docs/guide/proteomics-integration.md | 2 +- docs/guide/relaxing-constraints.md | 4 ++-- docs/guide/simulation-and-analysis.md | 2 +- docs/guide/tuning-against-experimental-data.md | 10 +++++----- 17 files changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/gecko3-to-gecko4.md b/docs/gecko3-to-gecko4.md index 7f9944a..c3ad91d 100644 --- a/docs/gecko3-to-gecko4.md +++ b/docs/gecko3-to-gecko4.md @@ -22,7 +22,7 @@ A GECKO 3 script keeps running after each change in this box and returns a diffe | --- | --- | --- | --- | | Direction of protein reactions | `usage_prot_` and `prot_pool_exchange` run in reverse and carry negative flux | both run forward, and the usage of an enzyme is the positive flux of its usage reaction | Reverse the sign of bounds and fluxes read from these reactions. `upgradeEcModel` turns a GECKO 3 ecModel (see [Upgrade a GECKO 3 project](gecko3-upgrade-project.md)) | | Substrate of a BRENDA kcat | the kcat is divided by the smallest coefficient in the reaction | the kcat is divided by the coefficient of the substrate that matched | Rebuild the kcat list. Reactions that are not written per the measured substrate get a lower kcat | -| Default kcat assignment | `selectKcatValue` (`assignKcatValues` in GECKO 4) merges a DLKcat list and a BRENDA list | `assignKcats` decides from the kcat source files in `data/kcats` with the preset `brenda_ec_tree` | Set `preset = "gecko_classic"` in `[kcat_assignment]` to keep the GECKO 3 order (see [Kcat assignment](gecko4-kcat-assignment.md)) | +| Default kcat assignment | `selectKcatValue` (`assignKcatValues` in GECKO 4) merges a DLKcat list and a BRENDA list | `assignKcats` determines the kcat from the kcat source files in `data/kcats` with the preset `brenda_ec_tree` | Set `preset = "gecko_classic"` in `[kcat_assignment]` to keep the GECKO 3 order (see [Kcat assignment](gecko4-kcat-assignment.md)) | | Protein fraction `f` | `calculateFfactor` averages over all samples, so a protein missing in one sample is left out of both totals | the average is over the samples in which the protein is measured | Recalculate `f` when the proteomics file has missing values | | Sigma fit | `sigmaFitter` returns the sigma with the smallest error | it returns the smallest sigma whose percent error is within a relative 1e-9 of the smallest error (geckopy `fit_sigma`: no tolerance in the default grid) | Refit when the growth rate is flat over a range of sigma | diff --git a/docs/gecko3-upgrade-project.md b/docs/gecko3-upgrade-project.md index 9a6e871..0975f38 100644 --- a/docs/gecko3-upgrade-project.md +++ b/docs/gecko3-upgrade-project.md @@ -1,6 +1,6 @@ # Upgrade a GECKO 3 project -An existing GECKO 3 project is converted to [project format 4](gecko4-project-format.md) in one call that first lists its steps and then carries them out. The function is `upgradeGECKOproject` in MATLAB and `geckopy upgrade` (`upgrade_project`) in Python. +An existing GECKO 3 project is converted to [project format 4](gecko4-project-format.md) in one call that first lists its steps and then performs them. The function is `upgradeGECKOproject` in MATLAB and `geckopy upgrade` (`upgrade_project`) in Python. ## Functions @@ -13,10 +13,10 @@ An existing GECKO 3 project is converted to [project format 4](gecko4-project-fo ## Steps of the upgrade -`upgradeGECKOproject` carries out these steps for a project made with GECKO 3 or with an earlier GECKO 4: +`upgradeGECKOproject` performs these steps for a project made with GECKO 3 or with an earlier GECKO 4: -1. Adapter: in MATLAB, an adapter class without `model_adapter.toml` gets one (`convertAdapterToToml`), and the methods that the class overrides are listed, because they need to be carried over by hand. The class stays. `geckopy upgrade` lists the adapter as a step to do by hand and skips steps 2 and 3 for such a project. -2. Custom kcats: `data/customKcats.tsv` becomes `data/kcats/custom.tsv` (`convertCustomKcats`). The kcats are those that `applyCustomKcats` gives the ecModel, including which of two entries for the same reaction applies. The column `stoicho` is not carried over, because the complex stoichiometry comes from `applyComplexData`. +1. Adapter: in MATLAB, an adapter class without `model_adapter.toml` gets one (`convertAdapterToToml`), and the methods that the class overrides are listed, because they need to be converted by hand. The class stays. `geckopy upgrade` lists the adapter as a step to do by hand and skips steps 2 and 3 for such a project. +2. Custom kcats: `data/customKcats.tsv` becomes `data/kcats/custom.tsv` (`convertCustomKcats`). The kcats are those that `applyCustomKcats` gives the ecModel, including which of two entries for the same reaction applies. The column `stoicho` is not copied, because the complex stoichiometry comes from `applyComplexData`. 3. Stored predictions: `data/DLKcat.tsv` and stored OpenKineticsPredictor results become kcat source files (`kcatsFromDLKcat`, and `kcatsFromOKP` with `'useStored'`). No prediction is run. 4. Saved ecModels: The ecModels in `models/*.yml` made with GECKO 3 get their protein usage and pool reactions turned forward (`upgradeEcModel`). 5. Project format: `project_format = 4` is written to `model_adapter.toml`. diff --git a/docs/gecko4-kcat-assignment.md b/docs/gecko4-kcat-assignment.md index f8d426d..e3e47f0 100644 --- a/docs/gecko4-kcat-assignment.md +++ b/docs/gecko4-kcat-assignment.md @@ -2,13 +2,13 @@ -GECKO 4 assigns the kcat of each reaction from kcat source files, in an order that `model_adapter.toml` sets. `collectKcats` decides the kcats and does not change the model. `assignKcats` applies the decisions and the kcat constraints. [Gathering kcats](guide/gathering-kcats.md) describes how the sources are gathered, and [Applying kcats](guide/applying-kcats.md) the steps after the assignment. +GECKO 4 assigns the kcat of each reaction from kcat source files, in an order that `model_adapter.toml` sets. `collectKcats` determines the kcats and does not change the model. `assignKcats` applies the decisions and the kcat constraints. [Gathering kcats](guide/gathering-kcats.md) describes how the sources are gathered, and [Applying kcats](guide/applying-kcats.md) the steps after the assignment. ## Functions | MATLAB | Python | Note | | --- | --- | --- | -| `collectKcats` | `collect_kcats` | decides one kcat per reaction and writes `output/_kcatDecisions.tsv` | +| `collectKcats` | `collect_kcats` | determines one kcat per reaction and writes `output/_kcatDecisions.tsv` | | `assignKcats` | `assign_kcats` | applies the decisions and the kcat constraints. Kcats that the model had are replaced | | `updateKcatSources` | `update_kcat_sources` | gathers the source files that the configuration needs and that are missing or outdated | | `kcatAssignmentConfig` | `kcat_assignment_config` | returns the settings with the preset expanded into stages | @@ -28,7 +28,7 @@ A source is the name of a file in `data/kcats` (`custom`, `ec_tree`, `homologs`, ## Stages -A stage decides the reactions that are still open. The action `select` takes the first listed source that has a value. The action `combine` takes all listed sources that have a value, corrects each for the bias of the source and weights it by 1 divided by its error variance. The error variance depends on the evidence of the source for the reaction: for the EC tree the measurements of the EC number and of its EC class, for an OKP method the similarity of the enzyme to the training sequences of the method. The parameters are in `kcatCombineParams.tsv` of the BRENDA files. `model.ec.source` reads `combined (sd=, n=)` for a combined value. +A stage determines the kcat of the reactions that are still open. The action `select` takes the first listed source that has a value. The action `combine` takes all listed sources that have a value, corrects each for the bias of the source and weights it by 1 divided by its error variance. The error variance depends on the evidence of the source for the reaction: for the EC tree the measurements of the EC number and of its EC class, for an OKP method the similarity of the enzyme to the training sequences of the method. The parameters are in `kcatCombineParams.tsv` of the BRENDA files. `model.ec.source` reads `combined (sd=, n=)` for a combined value. After the stages, `collectKcats` applies `data/customKcats.tsv` when a stage lists `custom` and `data/kcats/custom.tsv` does not exist. With `isozymes = true`, a reaction without a kcat in a full ecModel takes one from its isozymes. With `standard = true`, the remaining reactions get the standard kcat. diff --git a/docs/gecko4-project-format.md b/docs/gecko4-project-format.md index 5494830..48bac76 100644 --- a/docs/gecko4-project-format.md +++ b/docs/gecko4-project-format.md @@ -34,7 +34,7 @@ The file holds the parameters that an adapter class sets in GECKO 3. Paths are r | `[matlab]` | names of MATLAB functions for the anaerobic model and the protein content of the biomass. GECKO alone reads this section | | `[matlab.params]` | parameters that GECKO uses and geckopy does not use | -`ModelAdapterManager.getAdapter` and `ModelAdapterManager.setDefault` take the project folder or the TOML file and return a `TomlAdapter`. A class that needs more code can subclass `TomlAdapter`. In geckopy, `ModelAdapter.from_folder` reads the folder. An adapter class of GECKO 3 keeps working, and `convertAdapterToToml` writes it as `model_adapter.toml` and lists the methods it cannot carry over. +`ModelAdapterManager.getAdapter` and `ModelAdapterManager.setDefault` take the project folder or the TOML file and return a `TomlAdapter`. A class that needs more code can subclass `TomlAdapter`. In geckopy, `ModelAdapter.from_folder` reads the folder. An adapter class of GECKO 3 keeps working, and `convertAdapterToToml` writes it as `model_adapter.toml` and lists the methods it cannot convert. ## Kcat source files @@ -59,7 +59,7 @@ A kcat source file stores the kcats of one source. Each row is keyed by the conv ## BRENDA data -GECKO does not ship BRENDA data. `fetchBrendaAsset` downloads the files `kcat.tsv`, `sa.tsv`, `mw.tsv` and `measurements.tsv` of the toolbox-assets release `brenda-2026.1-1` (BRENDA 2026.1, CC BY 4.0) on first use, checks them against the checksums of the toolbox-assets manifest, and unpacks them into `databases/brenda-2026.1-1` in the GECKO folder. The release also holds `sequences.fasta`, `substrates.tsv` and `kcatCombineParams.tsv`. geckopy reads the same release (`fetch_brenda_asset`). +GECKO does not include BRENDA data. `fetchBrendaAsset` downloads the files `kcat.tsv`, `sa.tsv`, `mw.tsv` and `measurements.tsv` of the toolbox-assets release `brenda-2026.1-1` (BRENDA 2026.1, CC BY 4.0) on first use, checks them against the checksums of the toolbox-assets manifest, and unpacks them into `databases/brenda-2026.1-1` in the GECKO folder. The release also holds `sequences.fasta`, `substrates.tsv` and `kcatCombineParams.tsv`. geckopy reads the same release (`fetch_brenda_asset`). `kcat.tsv` and `sa.tsv` record a maximum and a median per EC number, substrate and organism. `kcat_aggregate_brenda = "max"` (default) or `"median"` selects the value for `fuzzyKcatMatching` and `loadBRENDAdata`, and `'kcatAggregation'` sets it for one call. diff --git a/docs/guide/applying-kcats.md b/docs/guide/applying-kcats.md index 1ca9ce4..f6fcf9b 100644 --- a/docs/guide/applying-kcats.md +++ b/docs/guide/applying-kcats.md @@ -63,8 +63,8 @@ flowchart TB | MATLAB | Python | Note | |---|---|---| -| `assignKcats` | `assign_kcats` | decide one kcat per reaction from the kcat source files and apply the kcat constraints | -| `collectKcats` | `collect_kcats` | decide the kcats without changing the model | +| `assignKcats` | `assign_kcats` | determine one kcat per reaction from the kcat source files and apply the kcat constraints | +| `collectKcats` | `collect_kcats` | determine the kcats without changing the model | | `convertCustomKcats` | `convert_custom_kcats` | convert `data/customKcats.tsv` into `data/kcats/custom.tsv` | | `applyCustomKcats` | `apply_custom_kcats` | apply the kcats of `data/customKcats.tsv` | | `getKcatAcrossIsozymes` | `fill_kcats_from_isozymes` | fill missing kcats with the mean of their isozymes | @@ -115,7 +115,7 @@ Without `data/kcats/custom.tsv`, `collectKcats` applies `data/customKcats.tsv` i [ecModel, rxnUpdated, notMatch] = applyCustomKcats(ecModel); ``` -This overwrites existing values in `ecModel.ec.kcat` for matching reactions, on the assumption that custom values carry higher confidence. The stoichiometry changes when `applyKcatConstraints` runs. +This overwrites existing values in `ecModel.ec.kcat` for matching reactions, on the assumption that custom values have higher confidence. The stoichiometry changes when `applyKcatConstraints` runs. Custom values that fail to match: if `notMatch` contains reactions, their values were not successfully applied, because the gene association between the model and the input file is a partial match: at least 50 %, but not 100 %. A gene association that matches less than 50 % is skipped and does not appear in `notMatch`. Inspect which enzymes are associated with the reaction in the ecModel and curate the input file to resolve it. ::: @@ -134,7 +134,7 @@ The same overwrite behaviour and the same gene-match threshold of 50 % apply her ## Assign kcats from the source files -`assignKcats` decides one kcat per reaction from the kcat source files, writes `ec.kcat` and `ec.source`, and applies the kcat constraints with `applyKcatConstraints`. The order of the sources follows the preset or the stages of `[kcat_assignment]`; [Kcat assignment](../gecko4-kcat-assignment.md) describes the presets, the stages and the gathering of missing source files with `updateKcatSources`. Kcats that the model had are replaced, because the source files are the input of the assignment. After the stages, `assignKcats` fills reactions without a kcat from their isozymes for full ecModels when `isozymes` is true, and gives the remaining reactions the standard kcat when `standard` is true; both options are true by default. +`assignKcats` determines one kcat per reaction from the kcat source files, writes `ec.kcat` and `ec.source`, and applies the kcat constraints with `applyKcatConstraints`. The order of the sources follows the preset or the stages of `[kcat_assignment]`; [Kcat assignment](../gecko4-kcat-assignment.md) describes the presets, the stages and the gathering of missing source files with `updateKcatSources`. Kcats that the model had are replaced, because the source files are the input of the assignment. After the stages, `assignKcats` fills reactions without a kcat from their isozymes for full ecModels when `isozymes` is true, and gives the remaining reactions the standard kcat when `standard` is true; both options are true by default. ::::{tab-set} :::{tab-item} Ⓜ️ MATLAB @@ -221,7 +221,7 @@ This step does not apply to light ecModels, where the most efficient isozyme set ## Assign a standard kcat value (optional) -Reactions without genes associated in the starting GEM (empty gene-reaction rules) cannot carry enzyme constraints, for lack of enzyme data. For such reactions, excluding exchange, spontaneous, transport and pseudo-reactions (reaction names that contain `pseudoreaction` or `SLIME rxn`, and the reactions in `data/pseudoRxns.tsv`), a standard kcat and a standard pseudo-enzyme (`prot_standard`) constrain catalytic capacity instead. The standard kcat is the median of the kcat values of the reactions in the same subsystem, when the subsystem has at least 10 reactions with a kcat (the option `threshold`), and the median of every kcat in `ec.kcat` otherwise. The standard molecular weight is the median across every protein in the organism, and a `usage_prot_standard` reaction is added. +Reactions without genes associated in the starting GEM (empty gene-reaction rules) cannot get enzyme constraints, for lack of enzyme data. For such reactions, excluding exchange, spontaneous, transport and pseudo-reactions (reaction names that contain `pseudoreaction` or `SLIME rxn`, and the reactions in `data/pseudoRxns.tsv`), a standard kcat and a standard pseudo-enzyme (`prot_standard`) constrain catalytic capacity instead. The standard kcat is the median of the kcat values of the reactions in the same subsystem, when the subsystem has at least 10 reactions with a kcat (the option `threshold`), and the median of every kcat in `ec.kcat` otherwise. The standard molecular weight is the median across every protein in the organism, and a `usage_prot_standard` reaction is added. Reactions that are annotated with an enzyme but have a kcat of 0 or `NaN` receive the standard kcat as well and keep their enzyme. Earlier standard assignments (`standard` in `ec.source`) are removed when the function runs again. diff --git a/docs/guide/basic-model-operations.md b/docs/guide/basic-model-operations.md index d23a51d..d58ba81 100644 --- a/docs/guide/basic-model-operations.md +++ b/docs/guide/basic-model-operations.md @@ -183,7 +183,7 @@ print(sol.fluxes[exchange_ids][sol.fluxes[exchange_ids] != 0]) ## Export results and models -Export the results to a spreadsheet. The file does not carry content from the `ec` structure and helps to find reaction identifiers quickly: +Export the results to a spreadsheet. The file does not contain content from the `ec` structure and helps to find reaction identifiers quickly: ::::{tab-set} :::{tab-item} Ⓜ️ MATLAB diff --git a/docs/guide/building-ec-model.md b/docs/guide/building-ec-model.md index b245d4b..520e9a7 100644 --- a/docs/guide/building-ec-model.md +++ b/docs/guide/building-ec-model.md @@ -1,6 +1,6 @@ # Building an empty ecModel -Building an ecModel expands a conventional GEM so that enzyme constraints can be added to it later. Reversible reactions split into forward and backward copies, because enzyme kinetics depend on direction. Reactions catalysed by isozymes split into one reaction per isozyme, because each has its own kinetics and molecular weight. The protein pool, together with the enzyme pseudo-metabolites that draw from it, is added to the network. The result is an **empty ecModel**: the structure that carries the enzyme constraints exists, and no constraints are applied yet. The empty ecModel is saved as a YAML file at the end. +Building an ecModel expands a conventional GEM so that enzyme constraints can be added to it later. Reversible reactions split into forward and backward copies, because enzyme kinetics depend on direction. Reactions catalysed by isozymes split into one reaction per isozyme, because each has its own kinetics and molecular weight. The protein pool, together with the enzyme pseudo-metabolites that draw from it, is added to the network. The result is an **empty ecModel**: the structure that holds the enzyme constraints exists, and no constraints are applied yet. The empty ecModel is saved as a YAML file at the end. :::::{dropdown} Place in the workflow @@ -366,7 +366,7 @@ Converting a conventional GEM into an empty ecModel runs up to twelve operations | 11 | Add `usage_prot_` reactions for each enzyme pseudo-metabolite, from `prot_pool` to the enzyme (bounds 0 and 1000) | ✅ | -- | | 12 | Add the `prot_pool_exchange` reaction, which supplies `prot_pool` (bounds 0 and 1000) | ✅ | ✅ | -Step 5's new reaction identifiers: reaction `r_0001` catalysed by two isozymes becomes `r_0001_EXP_1` and `r_0001_EXP_2`; a backward reaction `r_0001_REV` becomes `r_0001_REV_EXP_1` and `r_0001_REV_EXP_2`. Light ecModels keep the original identifiers in the model, and the rows of `ec.rxns` carry the prefix `001_`, `002_` and so on, one per isozyme. Step 9's example: *S. cerevisiae* enolase gene YHR174W, UniProt identifier P00925, appears as pseudo-metabolite `prot_P00925`. Step 11's identifiers are `usage_` followed by the enzyme metabolite identifier, for example `usage_prot_P00925`. See [the ec structure](applying-kcats.md#the-ec-structure) for what step 6 populates later, and [GECKO light and full ecModels](gecko-light.md) for what the skipped steps change. +Step 5's new reaction identifiers: reaction `r_0001` catalysed by two isozymes becomes `r_0001_EXP_1` and `r_0001_EXP_2`; a backward reaction `r_0001_REV` becomes `r_0001_REV_EXP_1` and `r_0001_REV_EXP_2`. Light ecModels keep the original identifiers in the model, and the rows of `ec.rxns` have the prefix `001_`, `002_` and so on, one per isozyme. Step 9's example: *S. cerevisiae* enolase gene YHR174W, UniProt identifier P00925, appears as pseudo-metabolite `prot_P00925`. Step 11's identifiers are `usage_` followed by the enzyme metabolite identifier, for example `usage_prot_P00925`. See [the ec structure](applying-kcats.md#the-ec-structure) for what step 6 populates later, and [GECKO light and full ecModels](gecko-light.md) for what the skipped steps change. ::: :::{admonition} Usage and pool exchange reactions run forward diff --git a/docs/guide/data-folder-files.md b/docs/guide/data-folder-files.md index 24b3c38..8ef203d 100644 --- a/docs/guide/data-folder-files.md +++ b/docs/guide/data-folder-files.md @@ -33,7 +33,7 @@ The `data` folder of a GECKO 4 project holds the input data of the reconstructio | `DLKcatIgnoreMets.tsv`, `DLKcatCurrencyMets.tsv` | Optional project copies of the lists of metabolites that are left out of the DLKcat and OKP input: names with SMILES, and pairs of currency metabolites. Without them, the files of the toolbox are used | `writeDLKcatInput`, `writeOpenKineticsPredictorInput` | [Gathering kcats](gathering-kcats.md) | | `OKP.csv` | Input of an OpenKineticsPredictor job | `writeOpenKineticsPredictorInput`, `submitOpenKineticsPredictor` | [Gathering kcats](gathering-kcats.md) | | `OKP_job_.txt`, `OKP_output_.csv` | The job and the result of one OKP method | `kcatsFromOKP` (Python: `kcats_from_okp`) | [Gathering kcats](gathering-kcats.md) | -| `OKP_job.txt`, `OKP_output.csv` | The job and the result of a job that `submitOpenKineticsPredictor` and `fetchOpenKineticsPredictor` handle. `kcatsFromOKP` adopts them for its method when no job of that method exists | `submitOpenKineticsPredictor`, `fetchOpenKineticsPredictor` | [Gathering kcats](gathering-kcats.md) | +| `OKP_job.txt`, `OKP_output.csv` | The job and the result of a job, written by `submitOpenKineticsPredictor` and `fetchOpenKineticsPredictor`. `kcatsFromOKP` adopts them for its method when no job of that method exists | `submitOpenKineticsPredictor`, `fetchOpenKineticsPredictor` | [Gathering kcats](gathering-kcats.md) | | `okpApiKey.txt` | The API key of OpenKineticsPredictor, an alternative to the argument `apiKey` and to the environment variable `OKP_API_KEY` | `submitOpenKineticsPredictor`, `fetchOpenKineticsPredictor` | [Gathering kcats](gathering-kcats.md) | ## Proteomics, flux data and tuning data diff --git a/docs/guide/gathering-kcats.md b/docs/guide/gathering-kcats.md index 4043dd1..1920fcf 100644 --- a/docs/guide/gathering-kcats.md +++ b/docs/guide/gathering-kcats.md @@ -1,6 +1,6 @@ # Gathering kcats -An empty ecModel has the structure to carry enzyme constraints but no kcat values. Kcats are gathered from each source into a kcat source file in `data/kcats`: [BRENDA](https://www.brenda-enzymes.org/) by fuzzy matching, the EC tree, measured homologs, DLKcat and OpenKineticsPredictor. At the end, every source that the project uses has a source file that `assignKcats` can read. +An empty ecModel has the structure to hold enzyme constraints but no kcat values. Kcats are gathered from each source into a kcat source file in `data/kcats`: [BRENDA](https://www.brenda-enzymes.org/) by fuzzy matching, the EC tree, measured homologs, DLKcat and OpenKineticsPredictor. At the end, every source that the project uses has a source file that `assignKcats` can read. Not every enzymatic reaction has a reported measurement. BRENDA kcats are matched to a reaction by EC number and by the substrates of the reaction. DLKcat and OpenKineticsPredictor predict a kcat from the enzyme sequence and the substrate structure, independent of the EC number, which covers organisms with few measurements and reactions without an EC number. [Kcat assignment](../gecko4-kcat-assignment.md) describes how the source files are combined into one kcat per reaction, and [Applying kcats](applying-kcats.md) the steps after that. @@ -181,7 +181,7 @@ The option `aggregation` (`'max'` or `'median'`) of `kcatsFromBrenda` (Python: ` Each BRENDA kcat is divided by the coefficient of the substrate that it was measured on, so a reaction that consumes two molecules of that substrate gets a kcat per molecule of the substrate ([GECKO 3 to GECKO 4](../gecko3-to-gecko4.md) describes the change from GECKO 3). -The kcat list documents which kcat was assigned to each reaction and how precise the match is: the number of EC wildcards used, and whether the match agreed on substrate and organism. A full match often does not exist, even for model organisms such as *S. cerevisiae*, and a partial organism or substrate match is returned. For each EC number, the levels of organism and substrate are tried in the order of the origin values 1, 2, 3, 5, 4 and 6 (see the example output below). When no level matches, the rightmost EC level is replaced by a wildcard and the levels are tried again. EC 2.4.2.3 (uridine phosphorylase), for example, becomes 2.4.2.- (pentosyltransferase). With a wildcard, the levels that require a matching substrate (origin 1 and 2) are skipped, because the last digits of the EC number carry the substrate specificity. When a reaction has several EC numbers, the match with the fewest wildcards and the earliest level is selected, and among those the highest kcat. +The kcat list documents which kcat was assigned to each reaction and how precise the match is: the number of EC wildcards used, and whether the match agreed on substrate and organism. A full match often does not exist, even for model organisms such as *S. cerevisiae*, and a partial organism or substrate match is returned. For each EC number, the levels of organism and substrate are tried in the order of the origin values 1, 2, 3, 5, 4 and 6 (see the example output below). When no level matches, the rightmost EC level is replaced by a wildcard and the levels are tried again. EC 2.4.2.3 (uridine phosphorylase), for example, becomes 2.4.2.- (pentosyltransferase). With a wildcard, the levels that require a matching substrate (origin 1 and 2) are skipped, because the last digits of the EC number encode the substrate specificity. When a reaction has several EC numbers, the match with the fewest wildcards and the earliest level is selected, and among those the highest kcat. :::{admonition} Example output :class: note @@ -323,7 +323,7 @@ writeDLKcatInput(ecModel); `writeDLKcatInput` raises an error when `data/DLKcat.tsv` exists; the option `'overwrite', true` replaces the file and discards the predictions that it holds. `DLKcat.tsv` is specific to either the full or the light version of the ecModel, because -it carries reaction identifiers from `ec.rxns` needed when loading the predicted values back into the ecModel. Build separate `DLKcat.tsv` files for the two ecModel versions. The source file `dlkcat.tsv` is keyed by the conventional reaction and applies to both. +it holds reaction identifiers from `ec.rxns` needed when loading the predicted values back into the ecModel. Build separate `DLKcat.tsv` files for the two ecModel versions. The source file `dlkcat.tsv` is keyed by the conventional reaction and applies to both. ::: :::{tab-item} 🐍 Python :sync: python @@ -377,7 +377,7 @@ OpenKineticsPredictor (OKP) shares its input with DLKcat: protein sequences and :::{admonition} Storage of the API key :class: warning -OKP requires a personal Bearer API key (looks like `ak_...`). Get one free, no registration required, at [predictor.openkinetics.org/api-docs](https://predictor.openkinetics.org/api-docs) (the "API key generator" section; the key is shown once, and can be revoked and regenerated from the same page). Keys are tied to the requesting IP and carry a daily prediction quota that resets at midnight UTC. +OKP requires a personal Bearer API key (looks like `ak_...`). Get one free, no registration required, at [predictor.openkinetics.org/api-docs](https://predictor.openkinetics.org/api-docs) (the "API key generator" section; the key is shown once, and can be revoked and regenerated from the same page). Keys are tied to the requesting IP and have a daily prediction quota that resets at midnight UTC. Because the model adapter is shared and committed to version control, the key is not stored there. Both languages resolve it the same way, checked in this order: an explicit function argument; the `OKP_API_KEY` environment variable; or a plain-text `data/okpApiKey.txt` file in the adapter folder (a filename already git-ignored by GECKO). ::: diff --git a/docs/guide/gecko-light.md b/docs/guide/gecko-light.md index 9be2f5d..128b7ec 100644 --- a/docs/guide/gecko-light.md +++ b/docs/guide/gecko-light.md @@ -53,7 +53,7 @@ Functions that read `ec.kcat` and `ec.mw`, or edit the LP directly, work on a li ## Reconstruction time and simulation accuracy -The comparison below builds a light and a full ecModel of yeast-GEM, populated with kcat values from BRENDA fuzzy matching alone, and runs FBA with growth maximised on each. Both toolboxes ship the comparison script (`plotlightVSfull` and `plot_light_vs_full`). It sets the lower bound of the glucose uptake reaction `r_1714` to -1000 and the growth reaction `r_2111` as the objective: +The comparison below builds a light and a full ecModel of yeast-GEM, populated with kcat values from BRENDA fuzzy matching alone, and runs FBA with growth maximised on each. Both toolboxes include the comparison script (`plotlightVSfull` and `plot_light_vs_full`). It sets the lower bound of the glucose uptake reaction `r_1714` to -1000 and the growth reaction `r_2111` as the objective: | Measure | Light | Full | |---|---|---| diff --git a/docs/guide/growth-rate-tuning.md b/docs/guide/growth-rate-tuning.md index 4ed9397..bf3a951 100644 --- a/docs/guide/growth-rate-tuning.md +++ b/docs/guide/growth-rate-tuning.md @@ -373,7 +373,7 @@ The options are the same in both toolboxes (MATLAB name first): | --- | --- | --- | --- | | `desiredGrowthRate` | `desired_growth_rate` | `params.gR_exp` (Python `params.gr_exp`) | growth rate at which the tuning stops | | `foldChange` | `fold_change` | `10` | factor by which each iteration raises a kcat | -| `protToIgnore` | `prot_to_ignore` | none | UniProt IDs whose enzymes are not picked as the limiting enzyme | +| `protToIgnore` | `prot_to_ignore` | none | UniProt IDs whose enzymes are not selected as the limiting enzyme | | `verbose` | `verbose` | `true` | reports the growth rate of each iteration | | `modelAdapter` | | default model adapter | model adapter that supplies the parameters (Python reads `ec_model.adapter`) | | | `max_iterations` | `1000` | upper limit of the iterations | diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md index d01ef5b..16b56cb 100644 --- a/docs/guide/introduction.md +++ b/docs/guide/introduction.md @@ -60,7 +60,7 @@ The workflow from a conventional GEM to an analysed ecModel has six steps. Each 1. Build: `makeEcModel` expands the GEM with enzyme information from UniProt and KEGG, using the parameters of the model adapter (see [Getting started](getting-started.md) and [Building an empty ecModel](building-ec-model.md)). 2. Gather kcats: `kcatsFromBrenda`, `kcatsFromECTree`, `kcatsFromHomologs`, `kcatsFromDLKcat` and `kcatsFromOKP` write one kcat source file per source in `data/kcats` (see [Gathering kcats](gathering-kcats.md)). -3. Assign kcats: `assignKcats` decides one kcat per reaction from the source files, in the order that `model_adapter.toml` sets, and constrains the reactions (see [Kcat assignment](../gecko4-kcat-assignment.md) and [Applying kcats](applying-kcats.md)). +3. Assign kcats: `assignKcats` determines one kcat per reaction from the source files, in the order that `model_adapter.toml` sets, and constrains the reactions (see [Kcat assignment](../gecko4-kcat-assignment.md) and [Applying kcats](applying-kcats.md)). 4. Constrain with proteomics: `fillEnzConcs`, `levelComplexConcs` and `constrainEnzConcs` set the usage bounds of measured enzymes, and `flexibilizeEnzConcs` or `relaxProteomicsGreedy` loosen bounds that keep the model from its growth rate (see [Proteomics integration](proteomics-integration.md) and [Relaxing overconstrained proteomics](relaxing-constraints.md)). `levelComplexConcs` gives the subunits of a multi-subunit complex one abundance. The least abundant subunit then does not cap the complex. 5. Tune: `sensitivityTuning` raises single kcats until the model reaches a target growth rate, and the `evotune` functions fit many kcats against measured growth rates and fluxes (see [Growth-rate tuning](growth-rate-tuning.md) and [Tuning against experimental data](tuning-against-experimental-data.md)). 6. Simulate: flux balance analysis, flux variability analysis, sampling, flux scanning, enzyme usage analysis and bottleneck analysis run on the ecModel (see [Simulation and analysis](simulation-and-analysis.md) and [Enzyme usage and bottlenecks](enzyme-usage-and-bottlenecks.md)). diff --git a/docs/guide/model-adapter-parameters.md b/docs/guide/model-adapter-parameters.md index 53bc771..20ed2aa 100644 --- a/docs/guide/model-adapter-parameters.md +++ b/docs/guide/model-adapter-parameters.md @@ -139,7 +139,7 @@ When `[evotune]` has no `source_groups`, the groups are `dlkcat`, `brenda` and ` | TOML key | MATLAB parameter | Default | Description | |---|---|---|---| | `okp.method` | `okp.method` | `"CataPro"` | OpenKineticsPredictor method | -| `okp.handle_long_sequences` | `okp.handleLongSequences` | `"truncate"` | How OpenKineticsPredictor handles sequences that are too long | +| `okp.handle_long_sequences` | `okp.handleLongSequences` | `"truncate"` | Action of OpenKineticsPredictor on sequences that are too long | | `okp.include_similarity_columns` | `okp.includeSimilarityColumns` | `true` | Return the similarity to the training data of the method | | `okp.canonicalize_substrates` | `okp.canonicalizeSubstrates` | `true` | Canonicalise substrate SMILES before the prediction | @@ -157,7 +157,7 @@ geckopy ignores the `[matlab]` section. The functions are searched on the MATLAB ## Adapter classes -A GECKO 3 adapter class keeps working. It sets `obj.params` with the MATLAB names of the tables above, and `ModelAdapterManager.setDefault` takes the path of its `.m` file. `convertAdapterToToml` writes the parameters of a class as `model_adapter.toml` and lists the methods that the class overrides and the file cannot carry. The option `'adapterFormat','class'` of `createGECKOproject` creates a project with a class. +A GECKO 3 adapter class keeps working. It sets `obj.params` with the MATLAB names of the tables above, and `ModelAdapterManager.setDefault` takes the path of its `.m` file. `convertAdapterToToml` writes the parameters of a class as `model_adapter.toml` and lists the methods that the class overrides and the file cannot express. The option `'adapterFormat','class'` of `createGECKOproject` creates a project with a class. A class that needs code beyond the file can read its parameters from the file in the constructor: diff --git a/docs/guide/proteomics-integration.md b/docs/guide/proteomics-integration.md index 21d0423..a83f4af 100644 --- a/docs/guide/proteomics-integration.md +++ b/docs/guide/proteomics-integration.md @@ -253,7 +253,7 @@ flux_data = load_flux_data(params.path / "data" / "fluxData.tsv") ::: :::: -Two choices decide how the constraint is applied: +Two choices determine how the constraint is applied: 1. **Loose or strict.** With loose constraints, the measured rate is set as the upper bound and the lower bound stays at zero (for a reaction with a negative rate, the lower bound gets the measured value and the upper bound stays at zero). With strict constraints, a percentage between 0 and 100 is passed in place of `'loose'` (Python: a number), and the lower and upper bounds are both set around the measured value; 10 gives 95 % and 105 % of it. Strict constraints force the ecModel to follow the measured fluxes closely, but imprecision in either the fluxes or the enzyme concentrations can then make the model infeasible; if that happens, loosen the constraint. 2. **Max or min growth.** With `max`, the measured growth rate is the upper bound, the ceiling the ecModel should reach; this suits growth as the objective function. With `min`, the measured growth rate is the lower bound, the floor the ecModel must reach; this suits minimising protein pool usage as the objective (see [Simulation and analysis](simulation-and-analysis.md)). diff --git a/docs/guide/relaxing-constraints.md b/docs/guide/relaxing-constraints.md index 201fa6c..c9b14b3 100644 --- a/docs/guide/relaxing-constraints.md +++ b/docs/guide/relaxing-constraints.md @@ -131,7 +131,7 @@ flex_result = flexibilize_enz_concs(ec_model, exp_growth=0.1, fold_change=10.0) ::: :::: -The enzymes in the result are the modified ones. Flexibilizing a concentration is a response to imprecise protein measurement. When the same enzyme is flexibilized repeatedly, its $k_{cat}$ may cause the shortfall; check the $k_{cat}$ and consider a custom value (see [Applying kcat values](applying-kcats.md) and [Tuning against experimental data](tuning-against-experimental-data.md)). An enzyme that is picked more often than `iterPerEnzyme` (Python: `iter_per_enzyme`, default 5) stops the loop with a warning. +The enzymes in the result are the modified ones. Flexibilizing a concentration is a response to imprecise protein measurement. When the same enzyme is flexibilized repeatedly, its $k_{cat}$ may cause the shortfall; check the $k_{cat}$ and consider a custom value (see [Applying kcat values](applying-kcats.md) and [Tuning against experimental data](tuning-against-experimental-data.md)). An enzyme that is selected more often than `iterPerEnzyme` (Python: `iter_per_enzyme`, default 5) stops the loop with a warning. :::{admonition} Many enzymes flexibilized :class: tip @@ -246,7 +246,7 @@ flex_result = relax_enz_concs(ec_model, exp_growth=0.1) | `relaxProteomicsGreedy` returns `converged = false` with a warning (Python: `converged=False`) | the eligible enzymes ran out before the target growth rate was reached | Apply the exchange flux constraints to the conventional GEM; the target may be unreachable for reasons other than enzyme constraints | | `relaxProteomicsGreedy` raises an error (Python: `RuntimeError`) | `maxIterations` (Python: `max_iterations`, default 100) was reached while candidates remained | Raise `maxIterations`, or use `flexibilizeEnzConcs` | | The ecModel is less constrained than the proteomics data require | `relaxProteomicsGreedy` has no tighten-back pass | Use `flexibilizeEnzConcs` / `flexibilize_enz_concs` | -| Warning that an enzyme or complex reached its iteration limit (MATLAB: "seems to be problematic") | the same enzyme or complex was picked more often than `iterPerEnzyme` allows | Check the $k_{cat}$ of the enzyme | +| Warning that an enzyme or complex reached its iteration limit (MATLAB: "seems to be problematic") | the same enzyme or complex was selected more often than `iterPerEnzyme` allows | Check the $k_{cat}$ of the enzyme | | `flexibilize_enz_concs` raises `ValueError` | no enzyme has a measured concentration, or `exp_growth` is not given and `gr_exp` is not set | Run `fill_enz_concs` and `constrain_enz_concs`, or pass `exp_growth` | ## See also diff --git a/docs/guide/simulation-and-analysis.md b/docs/guide/simulation-and-analysis.md index f63fc5a..c697157 100644 --- a/docs/guide/simulation-and-analysis.md +++ b/docs/guide/simulation-and-analysis.md @@ -410,5 +410,5 @@ The growth rate of the unconstrained context-specific model (149.97 /h) has no b - [GECKO light and full ecModels](gecko-light.md), the runtime and accuracy trade-off between the two ecModel layouts. - [Enzyme usage and bottlenecks](enzyme-usage-and-bottlenecks.md), the analyses of `getEnzymeUsage`, `getPfbaEnzymes` and `getEnzymeBottlenecks` that the usage reactions of a full ecModel allow. - [Proteomics integration](proteomics-integration.md), the construction of the proteomics-constrained ecModel of the solution space comparison. -- [Growth-rate tuning](growth-rate-tuning.md), the kcat values that decide the growth rate of the simulation. +- [Growth-rate tuning](growth-rate-tuning.md), the kcat values that determine the growth rate of the simulation. - [API reference](../api/index.md) and [MATLAB vs Python](../matlab-vs-python.md), the signature of every function in the table. diff --git a/docs/guide/tuning-against-experimental-data.md b/docs/guide/tuning-against-experimental-data.md index 1b67aa1..be16cb6 100644 --- a/docs/guide/tuning-against-experimental-data.md +++ b/docs/guide/tuning-against-experimental-data.md @@ -156,9 +156,9 @@ screen.drop(columns="_positions").head(20) ::: :::: -The result is a table with one row per kcat or tied group, ranked by leverage weighted by trust: the reaction ID (`rxnId`, Python `rxn_id`), the number of isozyme copies, the source group, the current value, the leverage, and `cumLeverageShare` (Python `cum_leverage_share`), the running fraction of the total combined ranking value (leverage weighted by trust) carried by the row and all rows above it. Leverage is the largest change of the plain RMSE caused by one of the two perturbations. A hidden column (`positions`, Python `_positions`) holds the indices into `ec.rxns` that `selectTunableMask` needs. +The result is a table with one row per kcat or tied group, ranked by leverage weighted by trust: the reaction ID (`rxnId`, Python `rxn_id`), the number of isozyme copies, the source group, the current value, the leverage, and `cumLeverageShare` (Python `cum_leverage_share`), the running fraction of the total combined ranking value (leverage weighted by trust) contributed by the row and all rows above it. Leverage is the largest change of the plain RMSE caused by one of the two perturbations. A hidden column (`positions`, Python `_positions`) holds the indices into `ec.rxns` that `selectTunableMask` needs. -The top rows are what a curator can look at first, whether or not a tuning search follows. In one study on ecYeastGEM (not reproduced from the repository), a few kcats carried most of what a tuning run can achieve, and they tended to be implausible database values. +The top rows are what a curator can look at first, whether or not a tuning search follows. In one study on ecYeastGEM (not reproduced from the repository), a few kcats accounted for most of what a tuning run can achieve, and they tended to be implausible database values. The screen costs one simulation per condition and per kcat group (two probes per group plus a baseline), which is comparable to the budget of a full tuning run. On the `full_ecModel` tutorial the screen runs 8413 simulations (4206 kcat groups, two probes each, and a baseline). With `nProc` and `n_proc` set to 8, the Python screen took 2.8 h. In MATLAB a simulation took 3.6 s with eight processes, an estimate of 8.4 h for the full screen. Both runs used Gurobi; the difference between the two was not investigated. `nProc` (Python `n_proc`) parallelises it as it does the tuning; in MATLAB, values above 1 need the Parallel Computing Toolbox. @@ -208,7 +208,7 @@ print(findings_tsv(findings)) Each finding names a reaction, its checks (`no-ec-evidence`, `repeated-value`, `ec-maximum`, `magnitude`, `custom-duplicate`) and a `detail` in words. Checks that need `ecStats` are skipped when it is absent. Isozyme copies that the assignment could not distinguish, the grouping of `tie_isozymes`, are reported once. Standard fallbacks (`standard-fallback`) and tied groups (`tied-isozymes`) are deliberate choices and are reported when `include` lists them. -Findings are ranked by `leverage` when it is given: the per-kcat effect from the screen, expanded from tie groups to the individual positions of `ec.rxns` through the position column of the screen. Without `leverage` the findings stay in input order. `coverage` (a share of the total leverage of the flagged rows) or `top` (a number of rows) truncates the report. `coverage` adapts to the model, since it keeps as many rows as carry that share of the flagged leverage, where a fixed `top` does not. In the same study the checks flagged around 1,900 of 4,834 kcats before truncation, which is too long a report to read. Stricter check thresholds do not shorten it as well as truncation by leverage, since looking odd (what the checks measure) and mattering (what leverage measures) are unrelated, so a stricter threshold removes high-leverage entries as readily as low-leverage ones. +Findings are ranked by `leverage` when it is given: the per-kcat effect from the screen, expanded from tie groups to the individual positions of `ec.rxns` through the position column of the screen. Without `leverage` the findings stay in input order. `coverage` (a share of the total leverage of the flagged rows) or `top` (a number of rows) truncates the report. `coverage` adapts to the model, since it keeps as many rows as hold that share of the flagged leverage, where a fixed `top` does not. In the same study the checks flagged around 1,900 of 4,834 kcats before truncation, which is too long a report to read. Stricter check thresholds do not shorten it as well as truncation by leverage, since looking odd (what the checks measure) and mattering (what leverage measures) are unrelated, so a stricter threshold removes high-leverage entries as readily as low-leverage ones. ## Tune @@ -257,7 +257,7 @@ Growth that needs special handling for the organism, such as forced anaerobic co The final RMSE alone does not show whether a tuned kcat can be trusted: 1. **Number and size of the changes.** A result that moves nearly every kcat by a little has not identified anything. `n_changed` (MATLAB `nChanged`) counts the kcats that differ from the prior by more than a relative tolerance (default 0.02). The module `geckopy.kcat_tuning.evotune.parsimony` also has `fold_change` and `source_movement`; `parsimony_frontier` and `best_parsimonious` (MATLAB `parsimonyFrontier`, `bestParsimonious`) trade the number of changed kcats against the fit. -2. **Impact share.** `parsimony.impact_share` reports the fraction of the total achievable improvement that the changed kcats carry. It separates few, large and consequential changes from sparsity. It is unweighted, unlike the trust-weighted `cum_leverage_share` of the screen. +2. **Impact share.** `parsimony.impact_share` reports the fraction of the total achievable improvement that the changed kcats account for. It separates few, large and consequential changes from sparsity. It is unweighted, unlike the trust-weighted `cum_leverage_share` of the screen. 3. **Reproducibility.** A run with another `seed` should give large corrections (beyond about two-fold) in the same direction and within a small factor of each other. Otherwise the search has found a flat direction, and `prior_penalty_weight` is the first setting to adjust. 4. **Generalisation.** Data that were not fitted score the tuned and the untuned model. A large improvement on the fitted conditions without an improvement elsewhere indicates overfitting to a thin dataset. @@ -283,7 +283,7 @@ rows = result.corrections( open("corrections.tsv", "w").write(corrections_tsv(rows)) ``` -`cumulative_share` of a row is the running fraction of the total leverage that the list has accounted for. The total is summed over the searched kcats, and each isozyme copy carries the leverage of its group, so a tied group counts once per copy. The reading can stop once the value stops climbing. This is the tuning-time counterpart of `review_assignment`: the review flags the kcats that need curation before a run, and the corrections list the kcats that the run changed and how far each change can be trusted. +`cumulative_share` of a row is the running fraction of the total leverage that the list has accounted for. The total is summed over the searched kcats, and each isozyme copy has the leverage of its group, so a tied group counts once per copy. The reading can stop once the value stops climbing. This is the tuning-time counterpart of `review_assignment`: the review flags the kcats that need curation before a run, and the corrections list the kcats that the run changed and how far each change can be trusted. ## Troubleshooting From e3515a9bc89ead3d49fa59643de09d0b90d7e276 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Fri, 6 Nov 2026 23:29:37 +0100 Subject: [PATCH 3/4] Describe develop as the integration branch --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8056038..8feda9f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ The standard for this site is the `docs-site` plugin of [CompMetEng/skills](http ## Branches -`develop` is the default branch. It documents the `develop` branches of GECKO and geckopy, which the submodules track, and the daily submodule update opens a pull request against it. Pull requests target `develop`. `main` documents the released versions: a release of GECKO and geckopy is followed by a pull request from `develop` to `main` that is merged with a merge commit and pins the submodules to the released commits. +`develop` is the integration branch. It documents the `develop` branches of GECKO and geckopy, which the submodules track, and the daily submodule update opens a pull request against it. Pull requests target `develop`. `main` documents the released versions: a release of GECKO and geckopy is followed by a pull request from `develop` to `main` that is merged with a merge commit and pins the submodules to the released commits. ## Building and checking From 0844f31e4ceb8be2a4a48c4308c4ded7209280f5 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Sat, 7 Nov 2026 18:16:55 +0100 Subject: [PATCH 4/4] Open the dependency updates against develop --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 00c2dfb..15daccb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,9 +2,11 @@ version: 2 updates: - package-ecosystem: pip directory: / + target-branch: develop schedule: interval: weekly - package-ecosystem: github-actions directory: / + target-branch: develop schedule: interval: weekly