chemart / repressilator

View on GitHub

Repressilator — A synthetic oscillator that was actually built in bacteria. Three genes are arranged in a cycle so each represses the next, with repression modelled as cooperative binding and both mRNA and protein decaying. With enough …

chemistry official · built in wet fidelity: book #banzhaf-yamamoto

How it works

A synthetic oscillator that was actually built in bacteria. Three genes are arranged in a cycle so each represses the next, with repression modelled as cooperative binding and both mRNA and protein decaying. With enough cooperativity the loop cannot settle - the repression travels round the ring and the protein levels oscillate. With no cooperativity it simply relaxes, so the nonlinearity is doing the work, and the oscillation only exists inside a bounded region of parameter space.

S
3 genes G_i, 3 gene-protein complexes C_i, 3 mRNAs M_i, 3 repressor proteins P_i (LacI, TetR, lambda-cI) · explicit
R
G_i + n P_{i-1} <-ke/kr-> C_i (cyclic: P3 represses G1) ; G_i --km--> G_i + M_i ; M_i --kp--> M_i + P_i ; M_i --mu_m--> ; P_i --mu_p--> · arity n+1, 1
A
ode, ssa · mRNA and protein decay

Parameters

namedefaultmeaning
n
int · kinetic
2 Hill coefficient (proteins per binding event); n=1 gives NO oscillations - the circuit needs a sigmoid response
[1, 10]
ke
float · kinetic
1.0 repressor binding
[0, ∞]
kr
float · kinetic
1.0 repressor unbinding
[0, ∞]
km
float · kinetic
5.0 transcription
[0, ∞]
kp
float · kinetic
1.0 translation
[0, ∞]
mu_m
float · kinetic
0.5 mRNA decay
[0, ∞]
mu_p
float · kinetic
0.1 protein decay
[0, ∞]

Repressilator

One of the artificial chemistries of Banzhaf & Yamamoto, Artificial Chemistries (MIT Press, 2015), §19.3.2; appendix (Repressilator.py); first proposed by Elowitz & Leibler, 2000.

Its generator ships with the chemart library, so loading it runs no code from the hub and needs no trust_remote_code.

import chemart

net = chemart.generate_network("chemart/repressilator", seed=0)   # same as "repressilator"
print(net.summary())

What to look for

  • sustained oscillations inside a bounded parameter region (n=2 with the default rates)
  • no oscillations for n = 1
  • oscillations survive stochastic noise at low gene copy number
  • implemented in real E. coli

Implementation decisions

  • The SSA gene copy number m is not a parameter: it sizes a stochastic simulation (V = m/N_A), not the network.
  • Binding is the elementary mass-action reaction of eqs. 19.1-19.3, not a lumped Hill rate law. Initial state is figure 19.18's: G1 = C2 = C3 = 1, everything else 0.

Banzhaf & Yamamoto, Artificial Chemistries (2015), §19.3.2; appendix (Repressilator.py)

Preview at default parameters

12 species · 18 reactions · status complete · seed 1

G1 + 2 P3 -> C1  [mass-action k=1.0]
C1 -> G1 + 2 P3  [mass-action k=1.0]
G2 + 2 P1 -> C2  [mass-action k=1.0]
C2 -> G2 + 2 P1  [mass-action k=1.0]
G3 + 2 P2 -> C3  [mass-action k=1.0]
C3 -> G3 + 2 P2  [mass-action k=1.0]
G1 -> G1 + M1  [mass-action k=5.0]
M1 -> M1 + P1  [mass-action k=1.0]
M1 -> ∅  [mass-action k=0.5]
P1 -> ∅  [mass-action k=0.1]
G2 -> G2 + M2  [mass-action k=5.0]
M2 -> M2 + P2  [mass-action k=1.0]
M2 -> ∅  [mass-action k=0.5]
P2 -> ∅  [mass-action k=0.1]
G3 -> G3 + M3  [mass-action k=5.0]
M3 -> M3 + P3  [mass-action k=1.0]
M3 -> ∅  [mass-action k=0.5]
P3 -> ∅  [mass-action k=0.1]

Generated by the uploader with chemart push; the hub never runs uploaded code.