Skip to content

Phase 4: the ribosome - #6

Merged
edkerk merged 4 commits into
masterfrom
feat/py-phase4-ribosome
Sep 25, 2026
Merged

edkerk merged 4 commits into
masterfrom
feat/py-phase4-ribosome

Conversation

@edkerk

@edkerk edkerk commented Sep 19, 2026 •

Copy link
Copy Markdown
Member

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 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.

python -m overflow.build_ribosome writes models/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 .mat files, per condition.

Result

Built on the rate-fitted models (--fit-rates, see #5):

cond subunits raised growth protein pool before → after ribosome share of pool
CN4 0 0.10 (unchanged) 41.8 → 53.4 11.6 21.7%
CN22 0 0.10 56.5 → 68.1 11.6 17.0%
CN38 3 0.10 61.6 → 73.2 11.6 15.9%
CN75 5 0.10 64.2 → 75.8 11.6 15.3%
hGR 12 0.29 128.3 → 161.9 33.6 20.8%

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 test
asserts 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.txt writes masses with thousands separators, so 43,758 is one
number and not two. Read naively it raises; coerced silently it would become
NaN and the subunit would cost nothing at all.

@edkerk
edkerk force-pushed the feat/py-phase4-ribosome branch from bd6ab8a to 698edac Compare September 20, 2026 09:17
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
edkerk force-pushed the feat/py-phase3-condition-models branch from e007e51 to 7577392 Compare September 25, 2026 11:33
@edkerk
edkerk force-pushed the feat/py-phase4-ribosome branch from 698edac to 67eaec3 Compare September 25, 2026 11:33
@edkerk
edkerk changed the base branch from feat/py-phase3-condition-models to master September 25, 2026 13:12
@edkerk
edkerk merged commit cd6ccb3 into master Sep 25, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant