v2ecoli — Mathematical Structure

The governing equations of the whole-cell E. coli model, by subsystem. Each entry is the formal description declared on its process/deriver class. 24 processes carry formal math.

DNA replicationTranscriptionRNA metabolismTranslationRegulation (TFs, ppGpp)Signaling / equilibriumMetabolism (FBA)Derived properties

DNA replication · 3 processes

ChromosomeReplication

chromosome_replication.py · ecoli-chromosome-replication

Chromosome Replication — initiate, elongate, and terminate replication forks.

1. Initiation: fire when M_cell / n_oriC ≥ M_critical(τ); +2 replisomes·oriC, +2 domains. 2. Elongation: seqs = buildSequences(template, pos, ν·dt); polymerize(seqs, dNTPs, limit);

   Δm_DNA = ∑ᵢ (elongated_ntᵢ · weightᵢ);  PPi released = dNTP polymerized.

3. Termination: fork ends when |coordinate| = L_replichore; domain splits, subunits recycled.

  M_cell: cell mass (fg); n_oriC: oriC count; M_critical(τ): mass/oriC threshold at doubling time τ;
  ν: stochastic elongation rate (nt/s); dt: timestep; L_replichore: replichore length (nt).

ChromosomeStructure

chromosome_structure.py · ecoli-chromosome-structure

Chromosome Structure — resolve fork collisions, replicate promoters, repartition segments.

1. Collision: fork passing a bound molecule either removes it (fork wins) or stalls (molecule wins). 2. Promoter replication: duplicate promoter when pos_prev < c ≤ pos_new (TF state + mass preserved). 3. Segment supercoiling: linking number Lk = Tw + Wr; on split, Lk partitioned ∝ new segment lengths. 4. Recycling: collided RNAPs/ribosomes removed; RNA transcripts + subunits returned to bulk (mass conserved).

  c: promoter coordinate; pos_prev/pos_new: fork position before/after step; Tw: twist; Wr: writhe.

DnaABinder

chromosome_initiation.py

DnaA Binder — DnaA-ATP occupancy of oriC gating replication initiation.

  free_DnaA evolves under binding/unbinding rates (k_on, k_off);
  oriC_state: 'free' → 'bound' once DnaA occupancy ≥ threshold.

free_DnaA: free DnaA-ATP level; k_on/k_off: binding/unbinding rate constants. (Skeleton: update currently returns a no-op placeholder; kinetics TBD.)

Transcription · 2 processes

TranscriptElongation

transcript_elongation.py · ecoli-transcript-elongation

Transcript Elongation — RNAPs extend transcripts by NTP polymerization.

  seqs = buildSequences(rnaSeqs, RNAP_pos, ν·dt);  Δlen = polymerize(seqs, NTP, limit)
  NTP → NMP_incorporated + PPi;   Δmass = ∑ᵢ Δntᵢ·wᵢ  [fg]

Termination: transcript len = TU_len → full transcript; RNAP recycled. tRNA attenuation (optional): p_stop = f([charged_tRNA]/[total_tRNA]),

  early-terminated RNAPs recycled and partial transcripts discarded.

ν = elongation rate (nt/s); dt = timestep; wᵢ = nucleotide weights.

TranscriptInitiation

transcript_initiation.py · ecoli-transcript-initiation

TranscriptInitiation — distributes activated RNAPs across TUs by weighted multinomial sampling.

  n_to_activate = round(f_active · n_total_RNAP) - n_active
  p_i = max(0, basal_prob_i + ∑_j delta_prob[i,j] · bound_TF_j)
  initiations ~ Multinomial(n_to_activate, p_i / ∑_i p_i)

with p_i ← 0 for TUs that are footprint-crowded (~24 nt) or lack a chromosomal promoter. f_active: media-dependent active RNAP fraction; delta_prob: sparse (COO→CSR) TF effect matrix. ppGpp (optional) modulates basal_prob and f_active via fitted functions.

RNA metabolism · 2 processes

RnaDegradation

rna_degradation.py · ecoli-rna-degradation

RNA Degradation — endo cleavage (competitive Michaelis–Menten) then exo digestion.

  fᵢ = ([rᵢ]/Kmᵢ) / (1 + ∑ⱼ [rⱼ]/Kmⱼ);   νᵢ = kcat_endo · [EndoRNase] · fᵢ
  per class c: n_deg_c = Draw(∑_{i∈c} νᵢ · dt · V · N_A), multinomial∝fᵢ, ≤ supply
  Δfragments = S_endo · n_deg;   exo: C_exo = ∑n_exo · kcat_exo · dt
  FragmentBase + H2O → NMP + H⁺   (full digest if C_exo ≥ Σbases, else multinomial)

[rᵢ]: RNA conc (mol/L); Kmᵢ: MM constant; νᵢ: endo flux; S_endo: cleavage stoich (NMP+PPi).

RnaMaturation

rna_maturation.py · ecoli-rna-maturation

RNA Maturation — stoichiometric processing of unprocessed tRNA/rRNA into mature forms.

  reaction_off = (E · enzyme_present) < n_required;   n_unproc[off] = 0
  n_mature = S · n_unproc;   ppi = ppi_per_rxn · n_unproc
  rRNA variant consolidation: Δnts = Δnt_countsᵀ · n_variant;  NMP +Δ, H2O −Σ, H⁺ +Σ

S: stoich (mature × unprocessed, CSR); E: enzyme-requirement (rxns × enzymes); Δnt_counts: NMP difference variant vs canonical 16S/23S/5S.

Translation · 7 processes

BasePolypeptideElongation

polypeptide_elongation.py · ecoli-polypeptide-elongation

Polypeptide Elongation — ribosomes extend polypeptides by amino-acid polymerization.

  seqs = buildSequences(protSeqs, ribo_pos, ν·dt);  Δlen = polymerize(seqs, aa, limit)
  GTP_consumed = n_elongations · gtpPerElongation  (≈4.2 GTP/aa, EF-Tu/EF-G)

ppGpp regulation (optional): ν = f_ppgpp([ppGpp]) [aa/s], with

  d[ppGpp]/dt = RelA synth([uncharged_tRNA]) − SpoT deg([ppGpp]) + SpoT basal synth.

ν = elongation rate (aa/s); dt = timestep.

PolypeptideInitiation

polypeptide_initiation.py · ecoli-polypeptide-initiation

Polypeptide Initiation — assembles 30S+50S → 70S ribosomes on mRNAs.

  n_activate = round(f·n_total) − n_active;   n_total = n_70S + min(n_30S, n_50S)
  p_k = ηₖ·n_copiesₖ / ∑ⱼ ηⱼ·n_copiesⱼ        (per-mRNA initiation prob)
  overcrowded ⟺ mRNA_len/(n_ribos+1) < footprint (≈24 nt) → p_k := 0
  n_new ~ Multinomial(n_activate, p);  each consumes one 30S + one 50S.

f = media-dependent active fraction; ηₖ = translation efficiency.

ProteinDegradation

protein_degradation.py · ecoli-protein-degradation

Protein Degradation — first-order Poisson hydrolysis of protein monomers.

  nᵢ_deg ~ min(Poisson(kᵢ · dt · nᵢ), nᵢ)
  Δmetabolites = S · n_deg
  Proteinᵢ + (Lᵢ−1) H2O → ∑ⱼ aᵢⱼ · AAⱼ

kᵢ: first-order degradation rate (1/s); nᵢ: copies of protein i; aᵢⱼ: count of AA j per protein i; Lᵢ = ∑ⱼ aᵢⱼ (residues); S: stoichiometry (metabolites × proteins), +AA release, −(Lᵢ−1) H2O.

RibosomeData

translation_deriver.py · ribosome_data_listener

Derives per-tick translation readouts from the active-ribosome pool: effective elongation rate, actual elongations and termination events, rRNA initiation by class, and ribosomes-per-transcript / polysome occupancy.

SteadyStatePolypeptideElongation

polypeptide_elongation.py · ecoli-polypeptide-elongation

Steady-State Polypeptide Elongation — elongation rate emerges from tRNA charging.

  f_charged_a = [charged_tRNA_a] / ([charged_tRNA_a] + [uncharged_tRNA_a])
  ν_eff ∝ min_a f_charged_a   (Michaelis–Menten competitive inhibition)

Charging (aminoacyl-tRNA synthetase): aa + ATP + tRNA → charged_tRNA + AMP + PPi. Composes tRNA charging + ppGpp (RelA/SpoT) + amino-acid supply (synth/import/export). ν_eff = effective elongation rate (aa/s); a indexes amino-acid species.

TranslationDeriver

translation_deriver.py · ribosome_data_listener

Derives per-tick translation readouts from the active-ribosome pool: effective elongation rate, actual elongations and termination events, rRNA initiation by class, and ribosomes-per-transcript / polysome occupancy.

TranslationSupplyPolypeptideElongation

polypeptide_elongation.py · ecoli-polypeptide-elongation

Polypeptide Elongation — ribosomes extend polypeptides by amino-acid polymerization.

  seqs = buildSequences(protSeqs, ribo_pos, ν·dt);  Δlen = polymerize(seqs, aa, limit)
  GTP_consumed = n_elongations · gtpPerElongation  (≈4.2 GTP/aa, EF-Tu/EF-G)

ppGpp regulation (optional): ν = f_ppgpp([ppGpp]) [aa/s], with

  d[ppGpp]/dt = RelA synth([uncharged_tRNA]) − SpoT deg([ppGpp]) + SpoT basal synth.

ν = elongation rate (aa/s); dt = timestep.

Regulation (TFs, ppGpp) · 2 processes

TfBinding

tf_binding.py · ecoli-tf-binding

TfBinding — stochastic occupancy of promoter sites by transcription factors.

  p_bound_j = p_promoter_bound_tf(n_active_j, n_inactive_j)   (1.0 for 0CS TFs)
  n_to_bind_j = min(∑ StochasticRound(p_bound_j, N_j), n_available_TF_j)

then n_to_bind_j promoter sites are chosen uniformly at random and bound.

  Δmass_i = ∑_j ΔTF[i,j] · m_j     (mass moved bulk → promoter submass)

N_j: available promoter sites for TF j; m_j: mass (fg) of active TF j. MarA (PD00365): n_active = 34 · [marR-tet]/([marR]+[marR-tet]).

TfUnbinding

tf_unbinding.py · ecoli-tf-unbinding

TfUnbinding — deterministic release of all DNA-bound TFs to the free active pool.

  n_released_j = ∑_i bound_TF[i,j]     (sum over promoters i)
  bound_TF ← 0     (reset promoter occupancy matrix)
  Δmass_i = -∑_j bound_TF[i,j] · m_j   (mass moved promoter submass → bulk)

bound_TF: promoters × TF species; m_j: mass (fg) of active TF j.

Signaling / equilibrium · 3 processes

Complexation

complexation.py · ecoli-complexation

Complexation — spontaneous monomer→complex assembly (Gillespie SSA).

Continuous-time Markov chain over reactions (stoichiometry S, rates k):

    x(t+dt) = StochasticSystem.evolve(dt, x(t), k)
    propensity a_j = k_j · ∏_i C(x_i, |S_ij|);   Δx = S·occurrences.

Reactants are complex-specific (no shared-resource competition).

Equilibrium

equilibrium.py · ecoli-equilibrium

Equilibrium — ligand–TF binding driven to steady state.

1. ODE solve for integer reaction fluxes ν: x_ss, ν = fluxesAndMoleculesToSS(x, V, N_A). 2. Greedy correction under allocation: while any(S·ν + x_alloc < 0),

   decrement offending forward/reverse fluxes (clamp ≥ 0).

Δx = S·ν; S = stoichiometry matrix (molecules × reactions).

TwoComponentSystem

two_component_system.py · ecoli-two-component-system

TwoComponentSystem — phosphotransfer signaling kinetics (ODE integration).

Solve molecule-count ODEs over the timestep:

    dx/dt = f(x);   integrate t: 0→dt (scipy solve_ivp, BDF);   Δx = x(dt) − x(0).

Under-allocation: re-solve to long-horizon steady state (10000 s), extract this timestep's Δx to stay physically consistent with reduced counts. x: counts of histidine kinases, response regulators, and their phospho-forms.

Metabolism (FBA) · 2 processes

Metabolism

metabolism.py · ecoli-metabolism

Metabolism — flux-balance analysis (FBA).

Each timestep solve for the reaction flux vector v:

    max cᵀv   s.t.  S·v = 0,   v_lb ≤ v ≤ v_ub
  S: stoichiometry (metabolites×reactions); c: biomass objective;
  bounds from nutrient uptake, enzyme kcat capacity, NGAM maintenance.

Flux→counts: Δn = stochasticRound(v · m_dry · dt / (MW · κ)). Optional ppGpp growth coupling and kinetic (kcat) flux constraints.

SimplifiedMetabolism

metabolism_simple.py · ecoli-metabolism-simple

Simplified metabolism — homeostatic FBA via scipy linprog (HiGHS).

Each timestep solve for flux v and slacks s⁺,s⁻:

    min Σ(sᵢ⁺ + sᵢ⁻)
    s.t.  S·v = 0,   M·v + s⁺ − s⁻ = target/κ,
          v_lb ≤ v ≤ v_ub,   s⁺,s⁻ ≥ 0
  S: stoichiometry; M: tracked-output rows; target: homeostatic
  concentration targets (mM); κ: conversion factor (g·s/L).
  bounds from nutrient exchange, enzyme presence, NGAM maintenance.

Flux→counts: Δn = stochasticRound(Δconc / counts_to_molar).

Derived properties · 3 processes

CountsDeriver

counts_deriver.py · counts_deriver

Tallies molecule counts for downstream readouts: mRNA/rRNA transcription-unit and cistron counts (partial + full transcripts), protein monomer counts (including monomers sequestered in complexes and in active ribosomes/RNAPs/replisomes), and per-type active unique-molecule totals. Consolidates the former RNACounts, MonomerCounts, and UniqueMoleculeCounts listeners into one step.

MassDeriver

mass_deriver.py · ecoli-mass-listener

Aggregates total cell mass and submasses (protein, RNA by class, DNA, small molecules, water) from bulk and unique molecule counts. Derives cell volume, plus growth rate and mass fold-changes over the cell cycle.

PostDivisionMassDeriver

mass_deriver.py · post-division-mass-listener

Aggregates total cell mass and submasses (protein, RNA by class, DNA, small molecules, water) from bulk and unique molecule counts. Derives cell volume, plus growth rate and mass fold-changes over the cell cycle.

Per-tick execution flow · 22 ordered layers

Steps in the same layer see the same starting state (per-layer atomicity); each layer's writes are reconciled before the next fires. unique_update flush barriers are omitted for legibility.

0post-division-mass-listener
1media_update
2ecoli-tf-unbinding
3exchange_data
4ecoli-equilibriumecoli-two-component-systemecoli-rna-maturation
5ecoli-tf-binding
6ecoli-protein-degradation
7ppgpp-initiation
8ecoli-complexationecoli-chromosome-replicationecoli-polypeptide-initiationecoli-transcript-initiation
9ecoli-rna-degradation_requester
10allocator_2
11ecoli-rna-degradation_evolver
12ecoli-polypeptide-elongation_requesterecoli-transcript-elongation_requester
13allocator_3
14ecoli-polypeptide-elongation_evolverecoli-transcript-elongation_evolver
15ecoli-chromosome-structure
16ecoli-metabolism
17counts_deriverecoli-mass-listenerreplication_data_listenerribosome_data_listenerrna_synth_prob_listenerrnap_data_listener
18emitter
19global_clock
20mark_d_period
21division

Partition → allocate → evolve · 3 partitioned processes

These processes compete for shared bulk molecules. Each is split into a Requester (computes demand from bulk_total), an Allocator (partitions the shared pool by priority), and an Evolver (acts on its allocated share):

ecoli-polypeptide-elongationecoli-rna-degradationecoli-transcript-elongation