Skip to contents
library(Eutropia)
#> Loading required package: data.table
#> Loading required package: sybil
#> Loading required package: Matrix
#> Loading required package: lattice
#> Loading required package: hms
#> Loading required package: glpkAPI
#> using GLPK version 5.0
#> Welcome to Eutropia.

Background

The intestinal bacterium Eubacterium rectale is known to be able to use acetate as energy source under anaerobic conditions and forms butyrate as end product (Rivère et al. (2015) Appl Envrion Microbiol). Acetate is a common fermentation end product in a number of different other intestinal bacteria, including Bifidobacteria (e.g. Bifidobacterium longum). In this tutorial, a co-culture experiment of both species is simulated in an aerobic environment that contains glucose as sole source of carbon and energy. It will be tested if acetate cross-feeding occurs and how the organisms affect each others population growth.

The setup

As growth environment, a Petri dish-shaped growth area will be defined with a radius of 80 micro meters. The space for metabolite concentrations is rasterized by rhombic dodecahedrons of size 1 µm (distance between adjacent field centers). The chemical growth environment consists of 6 field layers in height (i.e. the z-dimension).

# create simulation environment
sim <- init_simulation("Petri_80",
                       gridFieldSize = 1,
                       gridFieldLayers = 6)

Next, we will read the models for both organisms and place 15 cells each in the growth environment.

# add organisms (15 cells of each as 'starter culture')
models <- list()
models[['eure']] <- readRDS(system.file("extdata", "eure.RDS",
                                        package="Eutropia"))
models[['bilo']] <- readRDS(system.file("extdata", "bilo.RDS",
                                        package="Eutropia"))

sim <- add_organism(sim, model = models[['eure']], name = "E. rectale",
                    ncells = 15, distribution.radius = 25,
                    open.bounds = 1)
sim <- add_organism(sim, model = models[['bilo']], name = "B. longum",
                    ncells = 15, distribution.radius = 25,
                    open.bounds = 1)

It is not required, but out of curiosity the initial spatial distribution of cells can be plotted.

plot_cells(sim,
           scalebar.color = "black")

Now we have a simulation object with cells. Next we will add nutrients to the growth medium.

# Load a medium table
dt_medium <- fread(system.file("extdata", "medium.csv", package="Eutropia"))

# adding compounds
sim <- add_compounds(sim,
                     compounds = dt_medium$cpd.id,
                     concentrations = dt_medium$mM,
                     compound.names = dt_medium$cpd.name,
                     is.constant = dt_medium$is.constant)

The simulation

We are all set to run our first simulation. It will run either to a maximum of 50 iterations (= 500 minutes simulated time, option niter) or in maximum 4 minutes and 30 seconds (option lim_time). In the latter case, the last iteration is allowed to finish even if the time limit is exceeded.

sim <- run_simulation(sim, niter = 50, verbose = 1, lim_time = 4.5)
#> Initalising simulation using 1 CPU cores.
#> LP-solver: glpkAPI
#> [00:00:00] Simulation round 1    (30 cells, 8.40 pg dBM)
#>            E. rectale(4.49) B. longum(4.44)
#> [00:00:07] Simulation round 2    (30 cells, 8.93 pg dBM)
#>            E. rectale(4.81) B. longum(4.69)
#> [00:00:13] Simulation round 3    (30 cells, 9.49 pg dBM)
#>            E. rectale(5.15) B. longum(4.95)
#> [00:00:19] Simulation round 4    (30 cells, 10.10 pg dBM)
#>            E. rectale(5.52) B. longum(5.23)
#> [00:00:25] Simulation round 5    (30 cells, 10.75 pg dBM)
#>            E. rectale(5.91) B. longum(5.52)
#> [00:00:30] Simulation round 6    (30 cells, 11.43 pg dBM)
#>            E. rectale(6.32) B. longum(5.82)
#> [00:00:36] Simulation round 7    (30 cells, 12.14 pg dBM)
#>            E. rectale(6.75) B. longum(6.14)
#> [00:00:42] Simulation round 8    (30 cells, 12.89 pg dBM)
#>            E. rectale(7.19) B. longum(6.48)
#> [00:00:48] Simulation round 9    (30 cells, 13.67 pg dBM)
#>            E. rectale(7.62) B. longum(6.81)
#> [00:00:54] Simulation round 10   (30 cells, 14.42 pg dBM)
#>            E. rectale(8.02) B. longum(7.11)
#> [00:00:59] Simulation round 11   (30 cells, 15.13 pg dBM)
#>            E. rectale(8.4) B. longum(7.4)
#> [00:01:05] Simulation round 12   (39 cells, 15.80 pg dBM)
#>            E. rectale(8.87) B. longum(7.67)
#> [00:01:11] Simulation round 13   (42 cells, 16.54 pg dBM)
#>            E. rectale(9.36) B. longum(7.92)
#> [00:01:18] Simulation round 14   (44 cells, 17.27 pg dBM)
#>            E. rectale(9.81) B. longum(8.15)
#> [00:01:24] Simulation round 15   (49 cells, 17.96 pg dBM)
#>            E. rectale(10.28) B. longum(8.39)
#> [00:01:31] Simulation round 16   (53 cells, 18.67 pg dBM)
#>            E. rectale(10.7) B. longum(8.67)
#> [00:01:38] Simulation round 17   (55 cells, 19.37 pg dBM)
#>            E. rectale(11.11) B. longum(8.95)
#> [00:01:45] Simulation round 18   (56 cells, 20.06 pg dBM)
#>            E. rectale(11.48) B. longum(9.21)
#> [00:01:52] Simulation round 19   (56 cells, 20.69 pg dBM)
#>            E. rectale(11.84) B. longum(9.47)
#> [00:02:00] Simulation round 20   (57 cells, 21.30 pg dBM)
#>            E. rectale(12.17) B. longum(9.71)
#> [00:02:07] Simulation round 21   (57 cells, 21.88 pg dBM)
#>            E. rectale(12.51) B. longum(9.93)
#> [00:02:15] Simulation round 22   (57 cells, 22.44 pg dBM)
#>            E. rectale(12.84) B. longum(10.13)
#> [00:02:22] Simulation round 23   (59 cells, 22.97 pg dBM)
#>            E. rectale(13.15) B. longum(10.32)
#> [00:02:29] Simulation round 24   (59 cells, 23.47 pg dBM)
#>            E. rectale(13.48) B. longum(10.52)
#> [00:02:37] Simulation round 25   (60 cells, 24.00 pg dBM)
#>            E. rectale(13.79) B. longum(10.72)
#> [00:02:45] Simulation round 26   (62 cells, 24.51 pg dBM)
#>            E. rectale(14.09) B. longum(10.91)
#> [00:02:52] Simulation round 27   (63 cells, 25.00 pg dBM)
#>            E. rectale(14.41) B. longum(11.08)
#> [00:03:00] Simulation round 28   (63 cells, 25.49 pg dBM)
#>            E. rectale(14.71) B. longum(11.25)
#> [00:03:08] Simulation round 29   (65 cells, 25.96 pg dBM)
#>            E. rectale(15.01) B. longum(11.39)
#> [00:03:16] Simulation round 30   (66 cells, 26.41 pg dBM)
#>            E. rectale(15.32) B. longum(11.54)
#> [00:03:24] Simulation round 31   (68 cells, 26.85 pg dBM)
#>            E. rectale(15.62) B. longum(11.69)
#> [00:03:33] Simulation round 32   (70 cells, 27.32 pg dBM)
#>            E. rectale(15.93) B. longum(11.87)
#> [00:03:41] Simulation round 33   (71 cells, 27.80 pg dBM)
#>            E. rectale(16.25) B. longum(12.05)
#> [00:03:49] Simulation round 34   (71 cells, 28.29 pg dBM)
#>            E. rectale(16.54) B. longum(12.22)
#> [00:03:58] Simulation round 35   (72 cells, 28.76 pg dBM)
#>            E. rectale(16.84) B. longum(12.38)
#> [00:04:06] Simulation round 36   (73 cells, 29.23 pg dBM)
#>            E. rectale(17.15) B. longum(12.54)
#> [00:04:15] Simulation round 37   (76 cells, 29.70 pg dBM)
#>            E. rectale(17.45) B. longum(12.7)
#> [00:04:24] Simulation round 38   (76 cells, 30.15 pg dBM)
#>            E. rectale(17.75) B. longum(12.86)

Analyse the environment after the simulation

The package comes with a number of functions to plot simulation results.

# Plot spatial distribution of cells
plot_cells(sim, scalebar.color = "black")

# Spatial distribution of glucose
plot_environment(sim, compounds = c("cpd00027_e0"),
                 scalebar.color = "black")

# Spatial distribution of acetate, lactate and butyrate
plot_environment(sim,
                 compounds = c("cpd00029_e0","cpd00211_e0","cpd00159_e0"),
                 scalebar.color = "black")

# growth curves (total cell mass by species)
plot_growth(sim)

# dynamics in metabolite concentrations (calculated by total environment volume)
plot_compounds(sim, compounds = c("cpd00029_e0","cpd00211_e0","cpd00159_e0"))

The consumed and produced metabolites (i.e. exchanges) can be retrieved for the simulation.

summary_exchanges(sim)
#>           type    compound     compound.name          fmol
#>  1: E. rectale cpd00001_e0             Water  1.384493e+01
#>  2: E. rectale cpd00009_e0         Phosphate -4.029156e-01
#>  3: E. rectale cpd00027_e0         D-Glucose -6.553119e+00
#>  4: E. rectale cpd00034_e0              Zn2+ -2.190624e-03
#>  5: E. rectale cpd00048_e0           Sulfate -2.190624e-03
#>  6: E. rectale cpd00149_e0              Co2+ -2.190624e-03
#>  7: E. rectale cpd10516_e0              Fe3+ -2.190624e-03
#>  8: E. rectale cpd00067_e0                H+  4.284573e+00
#>  9: E. rectale cpd00063_e0              Ca2+ -2.190624e-03
#> 10: E. rectale cpd00058_e0              Cu2+ -2.190624e-03
#> 11: E. rectale cpd10515_e0              Fe2+ -5.293216e-03
#> 12: E. rectale cpd00205_e0                K+ -2.190624e-03
#> 13: E. rectale cpd00099_e0               Cl- -2.190624e-03
#> 14: E. rectale cpd00013_e0          Ammonium -2.576388e+00
#> 15: E. rectale cpd00011_e0               CO2  8.159031e+00
#> 16: E. rectale cpd00029_e0           Acetate -4.104254e+00
#> 17: E. rectale cpd00363_e0           Ethanol  9.177655e-01
#> 18: E. rectale cpd00239_e0               H2S -6.715980e-02
#> 19: E. rectale cpd00211_e0          Butyrate  6.385611e+00
#> 20: E. rectale cpd00030_e0              Mn2+ -2.190624e-03
#> 21: E. rectale cpd00254_e0              Mg2+ -2.190624e-03
#> 22: E. rectale cpd00281_e0              GABA -1.396210e-15
#> 23: E. rectale cpd00971_e0            Sodium -2.650705e-13
#> 24:  B. longum cpd00001_e0             Water  3.986505e+00
#> 25:  B. longum cpd00009_e0         Phosphate -2.141289e-01
#> 26:  B. longum cpd00030_e0              Mn2+ -1.164204e-03
#> 27:  B. longum cpd00048_e0           Sulfate -1.164204e-03
#> 28:  B. longum cpd00149_e0              Co2+ -1.164204e-03
#> 29:  B. longum cpd00067_e0                H+  1.042713e+01
#> 30:  B. longum cpd00027_e0         D-Glucose -4.716736e+00
#> 31:  B. longum cpd00013_e0          Ammonium -1.381584e+00
#> 32:  B. longum cpd00063_e0              Ca2+ -1.164204e-03
#> 33:  B. longum cpd00058_e0              Cu2+ -1.164204e-03
#> 34:  B. longum cpd00281_e0              GABA -1.040066e-16
#> 35:  B. longum cpd00205_e0                K+ -1.164204e-03
#> 36:  B. longum cpd00159_e0         L-Lactate  2.748452e+00
#> 37:  B. longum cpd00254_e0              Mg2+ -1.164204e-03
#> 38:  B. longum cpd00011_e0               CO2  4.497894e-01
#> 39:  B. longum cpd00029_e0           Acetate  6.601705e+00
#> 40:  B. longum cpd00363_e0           Ethanol  4.318896e-14
#> 41:  B. longum cpd00239_e0               H2S -3.569198e-02
#> 42:  B. longum cpd00034_e0              Zn2+ -1.164204e-03
#> 43:  B. longum cpd00099_e0               Cl- -1.164204e-03
#> 44:  B. longum cpd10515_e0              Fe2+ -2.813072e-03
#> 45:  B. longum cpd10516_e0              Fe3+ -1.164204e-03
#> 46:  B. longum cpd00229_e0    Glycolaldehyde  2.473302e-03
#> 47:  B. longum cpd03091_e0 5'-Deoxyadenosine  2.473302e-03
#>           type    compound     compound.name          fmol

In addition, the same information can be retrieved for earlier iterations in the simulation.

summary_exchanges(sim, iter = 10)
#>           type    compound     compound.name          fmol
#>  1: E. rectale cpd00001_e0             Water  1.893188e+01
#>  2: E. rectale cpd00009_e0         Phosphate -5.699414e-01
#>  3: E. rectale cpd00027_e0         D-Glucose -9.536801e+00
#>  4: E. rectale cpd00034_e0              Zn2+ -3.098732e-03
#>  5: E. rectale cpd00048_e0           Sulfate -3.098732e-03
#>  6: E. rectale cpd00149_e0              Co2+ -3.098732e-03
#>  7: E. rectale cpd10516_e0              Fe3+ -3.098732e-03
#>  8: E. rectale cpd00067_e0                H+  7.247351e+00
#>  9: E. rectale cpd00971_e0            Sodium  1.381154e-13
#> 10: E. rectale cpd00063_e0              Ca2+ -3.098732e-03
#> 11: E. rectale cpd00058_e0              Cu2+ -3.098732e-03
#> 12: E. rectale cpd10515_e0              Fe2+ -7.487482e-03
#> 13: E. rectale cpd00205_e0                K+ -3.098732e-03
#> 14: E. rectale cpd00099_e0               Cl- -3.098732e-03
#> 15: E. rectale cpd00013_e0          Ammonium -3.644412e+00
#> 16: E. rectale cpd00011_e0               CO2  1.128447e+01
#> 17: E. rectale cpd00029_e0           Acetate -3.966630e+00
#> 18: E. rectale cpd00363_e0           Ethanol  1.693765e+00
#> 19: E. rectale cpd00239_e0               H2S -9.500043e-02
#> 20: E. rectale cpd00211_e0          Butyrate  8.380347e+00
#> 21: E. rectale cpd00030_e0              Mn2+ -3.098732e-03
#> 22: E. rectale cpd00254_e0              Mg2+ -3.098732e-03
#> 23:  B. longum cpd00001_e0             Water  8.220163e+00
#> 24:  B. longum cpd00009_e0         Phosphate -4.415332e-01
#> 25:  B. longum cpd00030_e0              Mn2+ -2.400585e-03
#> 26:  B. longum cpd00048_e0           Sulfate -2.400585e-03
#> 27:  B. longum cpd00149_e0              Co2+ -2.400585e-03
#> 28:  B. longum cpd00067_e0                H+  2.150072e+01
#> 29:  B. longum cpd00027_e0         D-Glucose -9.725898e+00
#> 30:  B. longum cpd00013_e0          Ammonium -2.848823e+00
#> 31:  B. longum cpd00063_e0              Ca2+ -2.400585e-03
#> 32:  B. longum cpd00058_e0              Cu2+ -2.400585e-03
#> 33:  B. longum cpd00205_e0                K+ -2.400585e-03
#> 34:  B. longum cpd00159_e0         L-Lactate  5.667301e+00
#> 35:  B. longum cpd00254_e0              Mg2+ -2.400585e-03
#> 36:  B. longum cpd00011_e0               CO2  9.274647e-01
#> 37:  B. longum cpd00029_e0           Acetate  1.361270e+01
#> 38:  B. longum cpd00363_e0           Ethanol  8.154001e-15
#> 39:  B. longum cpd00239_e0               H2S -7.359677e-02
#> 40:  B. longum cpd00034_e0              Zn2+ -2.400585e-03
#> 41:  B. longum cpd00099_e0               Cl- -2.400585e-03
#> 42:  B. longum cpd10515_e0              Fe2+ -5.800547e-03
#> 43:  B. longum cpd10516_e0              Fe3+ -2.400585e-03
#> 44:  B. longum cpd00229_e0    Glycolaldehyde  5.099942e-03
#> 45:  B. longum cpd03091_e0 5'-Deoxyadenosine  5.099942e-03
#>           type    compound     compound.name          fmol

The results should clearly show that acetate is produced by B. longum and consumed by E. rectale.