Phase 4: the ribosome - #6
Merged
Merged
Conversation
edkerk
force-pushed
the
feat/py-phase4-ribosome
branch
from
September 20, 2026 09:17
bd6ab8a to
698edac
Compare
An ecModel charges protein cost to the enzymes carrying metabolic flux but not to the machinery that makes them, which understates the cost of growth. The protein pseudoreaction now makes a pool of amino acids, and a translation reaction turns that pool into protein while drawing on the ribosomal subunits, so every gram of protein pays for the ribosomes that made it. The subunits are selected on their average abundance across all conditions: 48 of the 253 candidates, which is the same 48 UniProt entries ribosome.m added to each of the five published condition models. Masses in ribosome.txt are written with thousands separators, so 43,758 is one number and not two.
Measured subunit abundances cap the subunits, except where the model needs more of one than was measured: the cell was demonstrably growing, so such a measurement is treated as an underestimate rather than as a limit on translation.
edkerk
force-pushed
the
feat/py-phase3-condition-models
branch
from
September 25, 2026 11:33
e007e51 to
7577392
Compare
edkerk
force-pushed
the
feat/py-phase4-ribosome
branch
from
September 25, 2026 11:33
698edac to
67eaec3
Compare
edkerk
changed the base branch from
feat/py-phase3-condition-models
to
master
September 25, 2026 13:12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #5. An ecModel charges protein cost to the enzymes carrying
metabolic flux but not to the machinery that makes them, which understates the
cost of growth. The protein pseudoreaction now produces a pool of amino acids,
and a
translationreaction turns that pool into protein while drawing on theribosomal subunits, so every gram of protein pays for the ribosomes that made
it.
python -m overflow.build_ribosomewritesmodels/ecModel_P_<cond>_ribosome.yml.The selection reproduces the published one exactly
The core ribosome is the subunits whose average abundance across all conditions
reaches 1e-5 mmol/gDW: 48 of 253 candidates. Each published
condition model carries 864 enzymes, and those 48 are the same 48 UniProt
entries, in all five models. Not just the count; a test
asserts set equality against the committed
.matfiles, per condition.Result
Built on the rate-fitted models (
--fit-rates, see #5):mg/gDW. Translation turns over at 2.5054 /s in units of protein: 10.5 amino
acids per second over the 4.191 the protein pseudoreaction consumes. No
condition loses growth: the measured budget covers the ribosome everywhere.
11.6 → 33.6 is a ratio of 2.90 against a dilution-rate ratio of 2.9, which
is the invariant to expect when translation is charged per unit of protein
made. It is exact here because, with protein rescaling off (see #5), every
condition model carries the same biomass protein content, so the ribosome cost
follows the dilution rate alone and not the measured protein content.
The ribosome's share of the pool falls from 21.7% at CN4 to 15.3% at CN75 because
the rest of the proteome grows to account for the measured respiration.
Tests
The translation cost is pinned by arithmetic, not by regression. In the tiny
model one unit of protein takes two amino acids, so a ribosome elongating at
10.5 aa/s turns over 5.25 times a second and a 30 kDa subunit must cost
30000 x 2 / (10.5 x 3600)= 1.5873 mg per mmol of protein. The testasserts that number against the stoichiometric coefficient geckopy writes —
which is where a confusion between daltons and kDa would surface, as a
thousandfold error in the cost of translation rather than as a failure.
Also covered: protein cannot bypass translation (cap every subunit at zero and
growth goes to zero — the rewiring is structural, not decorative); a capped
subunit limits growth in proportion; a subunit measured below what translation
needs is raised rather than allowed to stop it; an unmeasured subunit keeps
drawing on the pool; the ribosome cannot be added twice.
One data trap
data/ribosome.txtwrites masses with thousands separators, so43,758is onenumber and not two. Read naively it raises; coerced silently it would become
NaNand the subunit would cost nothing at all.