chemart / repressilator
View on GitHubRepressilator — 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 …
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
| name | default | meaning |
|---|---|---|
| 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.