Respiratory Oscillations in Yeast

When grown together in continuous culture, S. cerevisiae exhibit oscillations in metabolic activition that can be maintained for months. Since these oscillations are synchronized across cells, it has long been thought that certain, key metabolites play a role in coupling these oscillations between cells. It is now known (Murray, 2007) that H₂S is one such coupling metabolite. However, this was not known at the time that this model was created.

Here, we examine an early mathematical model (Wolf, 2001) that attempted to explain the observation of metabolic oscillations using H₂S as a mediator. This model has been faithfully preserved in the BioModels database in SBML format, enabling us to easily convert it to a COMBINE archive with a SED-ML simulation component.

Contents:

References:

Wolf, J., Sohn, H. Y., Heinrich, R., & Kuriyama, H. (2001). Mathematical analysis of a mechanism for autonomous metabolic oscillations in continuous culture of Saccharomyces cerevisiae. FEBS letters, 499(3), 230-234. (Online)02562-5/full)

Murray, D. B., Beckmann, M., & Kitano, H. (2007). Regulation of yeast oscillatory dynamics. Proceedings of the National Academy of Sciences, 104(7), 2241-2246. (Online)

Initial Timecourse

To begin, we use the BIOMD0000000090 SBML encoding of the Wolf model as a starting point. Our goal at this point is simply to reproduce the timecourse dynamics of the model and verify that they match the original publication. We need to define four steps in the workflow, which correspond to distinct elements in SED–ML: (1) model definition, (2) simulation, (3) task specification, and (4) output generation.

  1. We define the model via the PhraSEDML line model1 = model "wolf2001". This instantiates the SBML model wolf2001.
  2. We define a uniform time course simulation from 0 to 100 time units (minutes) with 1000 steps using sim1 = simulate uniform(0, 100, 1000).
  3. We apply this simulation to the wolf2001 model using task1 = run sim1 on model1.
  4. Finally, we plot the output using plot "Limit cycle oscillations (Wolf, 2001)" time vs A3m, A3c, N2, oxy, hyd.

This OMEX cell simulates and plots the Wolf respiratory model. The results are identical to the original except for a phase shift, as noted in the BioModels entry.

Back to top


In [1]:
// Author information:
// - Name: Kyle Medley
// - Email: medleyj@uw.edu
// - Organization: University of Washington
// -- Begin Antimony block converted from wolf2001.xml
// Created by libAntimony v2.9.3
model *wolf2001()

  // Compartments and Species:
  compartment c0, c1, c2;
  species $sul_ex in c0, $eth_ex in c0, $oxy_ex in c0, oxy in c2, $H2O in c2;
  species A3c in c1, aps in c1, $PPi in c1, pap in c1, sul in c1, eth in c1;
  species $A2c in c1, hyd in c1, cys in c1, N2 in c1, $N1 in c1, aco in c1;
  species oah in c1, S1 in c2, $S2 in c2, $C1 in c2, $C2 in c2, $A2m in c2;
  species A3m in c2, $Ho in c1, $Hm in c2;

  // Assignment Rules:
  A2c := Ac - A3c;
  N1 := N - N2;
  S2 := S - S1;
  A2m := Am - A3m;

  // Reactions:
  v1: $sul_ex => sul; c0*k_v0/(1 + (cys/Kc)^n);
  v13: $eth_ex => eth; c0*k_v13;
  v2: sul + A3c => aps + $PPi; c1*k2*sul*A3c;
  v10: $oxy_ex => oxy; c0*k_v10;
  v14: oxy => $oxy_ex; c2*k14*oxy;
  v3: aps + A3c => pap + $A2c; c1*k3*aps*A3c;
  v4: pap + 3 N2 => hyd + 3 $N1; c1*k4*pap*N2;
  v5: hyd + oah => cys; c1*k5*hyd*oah;
  v6: cys => ; c1*k6*cys;
  v7: eth + 2 $N1 => aco + 2 N2; c1*k7*eth*N1;
  v15: aco => oah; c1*k15*aco;
  v17: hyd => ; c1*k17*hyd;
  v18: oah => ; c1*k18*oah;
  v8: $S2 + aco => S1; c2*k8*aco*S2;
  v9: S1 + 4 $N1 => $S2 + 4 N2; c2*k9*S1*N1;
  v11a: $C1 + $Hm + N2 => $C2 + $Ho + $N1; c2*k11*N2*oxy/((a*N2 + oxy)*(1 + (hyd/Kh)^m));
  v11a2: $C2 + oxy => $C1 + $H2O; c2*k11*N2*oxy/((a*N2 + oxy)*(1 + (hyd/Kh)^m));
  v16: $A2c + A3m => $A2m + A3c; c2*k16*A3m*A2c;
  v11b: $Ho + $A2m => $Hm + A3m; (c2*3*k11*N2*oxy/((a*N2 + oxy)*(1 + (hyd/Kh)^m)))*A2m/(Ka + A2m);
  vLEAK: $Ho => $Hm; 0;
  v12: A3c => $A2c; c1*k12*A3c;

  // Species initializations:
  sul_ex = 0;
  eth_ex = 0;
  oxy_ex = 0;
  oxy = 7;
  oxy has substance_per_volume;
  H2O = 0;
  A3c = 1.5;
  A3c has substance_per_volume;
  aps = 0.5;
  aps has substance_per_volume;
  PPi = 0;
  pap = 0.4;
  pap has substance_per_volume;
  sul = 0.4;
  sul has substance_per_volume;
  eth = 4;
  eth has substance_per_volume;
  A2c has substance_per_volume;
  hyd = 0.5;
  hyd has substance_per_volume;
  cys = 0.3;
  cys has substance_per_volume;
  N2 = 2;
  N2 has substance_per_volume;
  N1 has substance_per_volume;
  aco = 0.3;
  aco has substance_per_volume;
  oah = 1.5;
  oah has substance_per_volume;
  S1 = 1.5;
  S1 has substance_per_volume;
  S2 has substance_per_volume;
  C1 = 0;
  C2 = 0;
  A2m has substance_per_volume;
  A3m = 1.5;
  A3m has substance_per_volume;
  Ho = 0;
  Hm = 0;

  // Compartment initializations:
  c0 = 1;
  c1 = 1;
  c2 = 1;

  // Variable initializations:
  Ac = 2;
  N = 2;
  S = 2;
  Am = 2;
  k_v0 = 1.6;
  Kc = 0.1;
  n = 4;
  k_v13 = 4;
  k2 = 0.2;
  k_v10 = 80;
  k14 = 10;
  k3 = 0.2;
  k4 = 0.2;
  k5 = 0.1;
  k6 = 0.12;
  k7 = 10;
  k15 = 5;
  k17 = 0.02;
  k18 = 1;
  k8 = 10;
  k9 = 10;
  k11 = 10;
  a = 0.1;
  Kh = 0.5;
  m = 4;
  k16 = 10;
  Ka = 1;
  k12 = 5;

  // Other declarations:
  const c0, c1, c2, Ac, N, S, Am, k_v0, Kc, n, k_v13, k2, k_v10, k14, k3;
  const k4, k5, k6, k7, k15, k17, k18, k8, k9, k11, a, Kh, m, k16, Ka, k12;

  // Unit definitions:
  unit substance_per_volume = mole / litre;
  unit substance = mole;

  // Display Names:
  c0 is "external";
  c1 is "cytosol";
  c2 is "mitochondria";
  sul_ex is "SO4_ex";
  eth_ex is "EtOH_ex";
  oxy_ex is "O2_ex";
  oxy is "O2";
  A3c is "ATP";
  aps is "APS";
  pap is "PAPS";
  sul is "SO4";
  eth is "EtOH";
  A2c is "ADP";
  hyd is "H2S";
  cys is "CYS";
  N2 is "NADH";
  N1 is "NAD";
  aco is "AcCoA";
  oah is "OAH";
  A2m is "ADP_mit";
  A3m is "ATP_mit";
  v11a is "vET1";
  v11a2 is "vET2";
  v11b is "vSYNT";
end
// -- End Antimony block

// -- Begin PhraSEDML block converted from main.xml
// Created by libphrasedml v1.0.7
// Models
model1 = model "wolf2001"

// Simulations
sim1 = simulate uniform(0, 100, 1000)

// Tasks
task1 = run sim1 on model1

// Outputs
plot "Limit cycle oscillations (Wolf, 2001)" time vs A3m, A3c, N2, oxy, hyd
// -- End PhraSEDML block

Hill Coefficient Study

To demonstrate Tellurium's utility as a COMBINE archive authoring tool, we will expand the above archive to include a study of the effect of the Hill coefficient m. We create five instances of the wolf2001 model, each with a different value for m. We do not know a priori if these instances will have different time scale behavior, so we perform two simulations with long and short durations.

Back to top


In [ ]:
// Author information:
// - Name: kyle medley
// - Email: medleyj@uw.edu
// - Organization: uw
// -- Begin Antimony block converted from wolf2001.xml
// Created by libAntimony v2.9.3
model *wolf2001()

  // Compartments and Species:
  compartment c0, c1, c2;
  species $sul_ex in c0, $eth_ex in c0, $oxy_ex in c0, oxy in c2, $H2O in c2;
  species A3c in c1, aps in c1, $PPi in c1, pap in c1, sul in c1, eth in c1;
  species $A2c in c1, hyd in c1, cys in c1, N2 in c1, $N1 in c1, aco in c1;
  species oah in c1, S1 in c2, $S2 in c2, $C1 in c2, $C2 in c2, $A2m in c2;
  species A3m in c2, $Ho in c1, $Hm in c2;

  // Assignment Rules:
  A2c := Ac - A3c;
  N1 := N - N2;
  S2 := S - S1;
  A2m := Am - A3m;

  // Reactions:
  v1: $sul_ex => sul; c0*k_v0/(1 + (cys/Kc)^n);
  v13: $eth_ex => eth; c0*k_v13;
  v2: sul + A3c => aps + $PPi; c1*k2*sul*A3c;
  v10: $oxy_ex => oxy; c0*k_v10;
  v14: oxy => $oxy_ex; c2*k14*oxy;
  v3: aps + A3c => pap + $A2c; c1*k3*aps*A3c;
  v4: pap + 3 N2 => hyd + 3 $N1; c1*k4*pap*N2;
  v5: hyd + oah => cys; c1*k5*hyd*oah;
  v6: cys => ; c1*k6*cys;
  v7: eth + 2 $N1 => aco + 2 N2; c1*k7*eth*N1;
  v15: aco => oah; c1*k15*aco;
  v17: hyd => ; c1*k17*hyd;
  v18: oah => ; c1*k18*oah;
  v8: $S2 + aco => S1; c2*k8*aco*S2;
  v9: S1 + 4 $N1 => $S2 + 4 N2; c2*k9*S1*N1;
  v11a: $C1 + $Hm + N2 => $C2 + $Ho + $N1; c2*k11*N2*oxy/((a*N2 + oxy)*(1 + (hyd/Kh)^m));
  v11a2: $C2 + oxy => $C1 + $H2O; c2*k11*N2*oxy/((a*N2 + oxy)*(1 + (hyd/Kh)^m));
  v16: $A2c + A3m => $A2m + A3c; c2*k16*A3m*A2c;
  v11b: $Ho + $A2m => $Hm + A3m; (c2*3*k11*N2*oxy/((a*N2 + oxy)*(1 + (hyd/Kh)^m)))*A2m/(Ka + A2m);
  vLEAK: $Ho => $Hm; 0;
  v12: A3c => $A2c; c1*k12*A3c;

  // Species initializations:
  sul_ex = 0;
  eth_ex = 0;
  oxy_ex = 0;
  oxy = 7;
  oxy has substance_per_volume;
  H2O = 0;
  A3c = 1.5;
  A3c has substance_per_volume;
  aps = 0.5;
  aps has substance_per_volume;
  PPi = 0;
  pap = 0.4;
  pap has substance_per_volume;
  sul = 0.4;
  sul has substance_per_volume;
  eth = 4;
  eth has substance_per_volume;
  A2c has substance_per_volume;
  hyd = 0.5;
  hyd has substance_per_volume;
  cys = 0.3;
  cys has substance_per_volume;
  N2 = 2;
  N2 has substance_per_volume;
  N1 has substance_per_volume;
  aco = 0.3;
  aco has substance_per_volume;
  oah = 1.5;
  oah has substance_per_volume;
  S1 = 1.5;
  S1 has substance_per_volume;
  S2 has substance_per_volume;
  C1 = 0;
  C2 = 0;
  A2m has substance_per_volume;
  A3m = 1.5;
  A3m has substance_per_volume;
  Ho = 0;
  Hm = 0;

  // Compartment initializations:
  c0 = 1;
  c1 = 1;
  c2 = 1;

  // Variable initializations:
  Ac = 2;
  N = 2;
  S = 2;
  Am = 2;
  k_v0 = 1.6;
  Kc = 0.1;
  n = 4;
  k_v13 = 4;
  k2 = 0.2;
  k_v10 = 80;
  k14 = 10;
  k3 = 0.2;
  k4 = 0.2;
  k5 = 0.1;
  k6 = 0.12;
  k7 = 10;
  k15 = 5;
  k17 = 0.02;
  k18 = 1;
  k8 = 10;
  k9 = 10;
  k11 = 10;
  a = 0.1;
  Kh = 0.5;
  m = 4;
  k16 = 10;
  Ka = 1;
  k12 = 5;

  // Other declarations:
  const c0, c1, c2, Ac, N, S, Am, k_v0, Kc, n, k_v13, k2, k_v10, k14, k3;
  const k4, k5, k6, k7, k15, k17, k18, k8, k9, k11, a, Kh, m, k16, Ka, k12;

  // Unit definitions:
  unit substance_per_volume = mole / litre;
  unit substance = mole;

  // Display Names:
  c0 is "external";
  c1 is "cytosol";
  c2 is "mitochondria";
  sul_ex is "SO4_ex";
  eth_ex is "EtOH_ex";
  oxy_ex is "O2_ex";
  oxy is "O2";
  A3c is "ATP";
  aps is "APS";
  pap is "PAPS";
  sul is "SO4";
  eth is "EtOH";
  A2c is "ADP";
  hyd is "H2S";
  cys is "CYS";
  N2 is "NADH";
  N1 is "NAD";
  aco is "AcCoA";
  oah is "OAH";
  A2m is "ADP_mit";
  A3m is "ATP_mit";
  v11a is "vET1";
  v11a2 is "vET2";
  v11b is "vSYNT";
end
// -- End Antimony block

// -- Begin PhraSEDML block converted from main.xml
// Created by libphrasedml v1.0.7
// Models
model_m_1 = model "wolf2001" with m = 1
model_m_2 = model "wolf2001" with m = 2
model_m_4 = model "wolf2001" with m = 4
model_m_8 = model "wolf2001" with m = 8
model_m_16 = model "wolf2001" with m = 16

// Simulations
sim_short = simulate uniform(0, 100, 5000)
sim_long = simulate uniform(0, 200, 5000)

// Tasks
m1_short = run sim_short on model_m_1
m2_short = run sim_short on model_m_2
m4_short = run sim_short on model_m_4
m8_short = run sim_short on model_m_8
m16_short = run sim_short on model_m_16
m1_long = run sim_long on model_m_1
m2_long = run sim_long on model_m_2
m4_long = run sim_long on model_m_4
m8_long = run sim_long on model_m_8
m16_long = run sim_long on model_m_16

// Outputs
plot "Oxygen (short duration)" m1_short.time vs m1_short.model_m_1.oxy, m2_short.model_m_2.oxy, m4_short.model_m_4.oxy, m8_short.model_m_8.oxy, m16_short.model_m_16.oxy
plot "Oxygen (long duration)" m1_long.time vs m1_long.model_m_1.oxy, m2_long.model_m_2.oxy, m4_long.model_m_4.oxy, m8_long.model_m_8.oxy, m16_long.model_m_16.oxy
// -- End PhraSEDML block