Cross-feeding between two gastrointestinal bacteria
Silvio Waschina
2022-12-12
Source:vignettes/Crossfeeding.Rmd
Crossfeeding.Rmd
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.