Model
Sustainability Model - Life cycle assessment
Life cycle assessment (LCA) is a comprehensive methodology for assessing the cumulative environmental impact attributed to all the steps from extraction-manufacture-use-dispose of materials, in other words, cradle-to-grave. (Foroughi et al., 2021). LCA is a standard tool for assessing the environmental impact in the textile industry, particularly for traditional fibres such as cotton, silk, flax, and polyester (Gonzalez et al., 2023).
Our project aims to develop a sustainable alternative to conventional textile production, making it essential to establish a sustainability model using LCA. Previous research conducted by the Centre of Biological Engineering at the Universidade do Minho in Braga, Portugal, highlighted that the primary resource consumed in producing bacterial cellulose (BC) is water, with a total usage of 38.9 tons per kilogram of BC, of which 36.1 tons is water—98% of which is returned to freshwater sources after treatment (Forte et al., 2021).
After consulting with LCA expert Dr. Pieter Nachtergaele , we recognised that the choice of carbon source is a critical determinant of our process's economic viability. The current BC production process is not yet optimised. Full-scale LCA is only applicable to mature industrial processes, and therefore conducting a full LCA at this stage is not feasible. Instead, we decided to concentrate on identifying key performance indicators (KPIs) related to our production process, specifically yield and production rate.
Experiment was designed to evaluate the growth and cellulose production of Komagataeibacter xylinus (K. xylinus) in a 24-well plate under controlled conditions.
Collected Data:
- BC Mat Mass: Daily collection and freeze-drying of BC mats to track cellulose production.
- Dry cell mass: Daily measurement of cell density to track growth phase.
- Glucose Concentration: Analysis of remaining glucose in the supernatant using a biochemical analyser to monitor glucose consumption.
- pH: Monitoring the pH of the media to assess acidification during growth.
Calculated Parameters
- Rate: calculation of production rate based on BC mat mass over time.
- Yield: determination of cellulose yield by dividing BC mass by the change in consumed glucose mass.
- Flux: determination of glucose and cellulose fluxes at exponential phase, to be used later in metabolic model
Figure 1: Cultivation set up for growth experiment
Figure 2: Graph indicating an inverse correlation between glucose consumption and BC production
Figure 3: Graph indicating growth behaviour of K. xylinus and the acidification of the media
flux (mmol/gDW/h) | yield (gBC/gglc) | rate (mg/h) | |
---|---|---|---|
glucose | 217.486 | - | - |
(bacterial) cellulose | 1.533 | 0.00814 | 0.522 |
Table 1: Calculated KPIs based on the metrics derived from the growth experiment
Price per kg (USD) | |
---|---|
sugar | 0.406 |
cotton | 1.54 |
Table 2: Price per kg in US Dollar, retrieved from the World Bank and Business Insider (18.09.24)
The data presented reveal a clear trend: as dry cell mass increases, glucose consumption rises accordingly, resulting in a decrease in pH due to media acidification from the growing culture. Interestingly, BC production sees a significant increase after 96 hours post-inoculation. This observation suggests that since BC production competes with central carbon metabolism for glucose flux, introducing a growth stress or limiting factor—such as space constraints—could potentially enhance BC production further.
From the analysis of dry cell mass (Figure 3), we identified the exponential growth phase occurring between 48 and 96 hours, during which we calculated key metrics such as growth rate and flux (Table 1). Yield calculations, based on glucose consumption relative to BC production, were also calculated to assess the economic viability of our process.
Cotton, as a value-added commodity, is approximately 3.8 times more expensive than sugar (Table 2). Therefore, for BC production to be financially viable concerning raw material costs, a yield of at least 26.4% must be achieved, necessitating a 32-fold increase in yield. This expectation highlights the need for optimisation in our production process.
In a subsequent discussion with Dr. Nachtergaele See human practices, he noted the considerable residual glucose remaining in the media post-cultivation, indicating that operational parameters need refinement. Strategies such as reducing the initial glucose concentration or recycling unused sugar could significantly enhance yield.
Moreover, it’s important to recognise that the economic viability based solely on yield does not account for utility costs. A comprehensive financial analysis will be possible once the co-culture between yeast and K. xylinus is successfully established. This integration could lead to a streamlined supply chain that outperforms traditional methods.
Additionally, our collaboration with iGEM Dresden, where we provided BC mats for hydrolysis into sugar substrates, presents an innovative approach to achieving a closed carbon cycle. This method allows us to recycle sugars back to our bacteria, thereby optimising resource use. See collaborations
Dr. Nachtergaele also highlighted the potential valorisation of accumulated dry cell mass, suggesting its application as animal feed to minimise carbon waste and enhance the economic value of our process.
To further improve BC yield, we plan to employ metabolic modelling to identify candidate gene knockouts, and gene knockdowns to optimise cellulose flux. See Methabolic model Furthermore, inducible promoters can be used to validate these in vivo. See experiments These combined strategies could lead to substantial advancements in yield and overall process efficiency.
Metabolic Model
Our Aim
In the context of our project, we aimed to simulate and optimise bacterial cellulose production in E. coli by incorporating the bacterial cellulose synthase (BCS) pathway from Komagataeibacter xylinus, a bacterium known for its high cellulose output. By introducing the BCS pathway from K. xylinus into the metabolic framework of E. coli, we used metabolic modelling to predict how this addition would influence the overall metabolic fluxes. The goal was to maximise cellulose production in E. coli by simulating and analysing the effects of the added pathway on the bacterium's metabolic network.
Our Model
To simulate and optimise bacterial cellulose production in E. coli, we chose the iML1515 metabolic model from the BiGG Database, based on the recommendation of our secondary PI, Dr. St. Elmo Wilken. In contrast to the core E. coli model, the iML1515 model includes over 1,500 reactions and 1,500 metabolites with flux values that were previously validated with experiments, making it the most detailed and comprehensive option available. This level of detail was essential for our project, as it gave us the flexibility to incorporate additional pathways.
Our goal was to integrate the BCS pathway from Komagataeibacter xylinus, a bacterium known for its high cellulose output, into E. coli. While the iML1515 model already contained many of the necessary pathways for basic metabolism, such as GALUi (UDP-glucose pyrophosphorylase) and NDPK2 (nucleoside diphosphate kinase), which help synthesise UDP-glucose (udpg), it still lacked specific pathways responsible for synthesising and exporting bacterial cellulose (Jang et al., 2019).
To fill this gap, we made several modifications to the iML1515 model. First, we added the metabolite cellulose_c
, representing bacterial cellulose in the cytosol, which allowed us to model cellulose production inside the cell. Next, we introduced two key reactions: the BCS reaction, where UDP-glucose (udpg) is converted into cellulose and UDP, and a cellulose export (sink) reaction to simulate the transport of cellulose out of the cell. This reaction was necessary to maintain mass balance in the simulation, as it ensured that the produced cellulose could leave the cell.
Additionally, we integrated the bcs gene from K. xylinus into the model, linking it to the BCS enzyme to simulate its activity in E. coli. This allowed us to properly model the production of cellulose and explore how the introduction of the BCS pathway affected E. coli’s overall metabolic network.
using COBREXA, ConstraintTrees, CairoMakie, CSV, DataFrames, JSON, Statistics
import JSONFBCModels, HiGHS
import AbstractFBCModels as A
model = load_model("iML1515_mod.json") # modified iML1515 E. coli model with metabolites and reactions for K. xylinus
Flux Balance Analysis
Flux Balance Analysis (FBA) is a computational technique used to predict the flow of metabolites through a metabolic network by optimising for a specific objective (Grafahrend-Belau et al., 2008), such as growth rate or the production of a target compound - in our case, bacterial cellulose (BC). It allows us to model and simulate how E. coli's metabolic pathways respond under various constraints, helping us determine which pathways are most active and how certain fluxes can be channelled to an optimal value. FBA is especially useful in metabolic modelling because it provides insight into the potential metabolic flux distributions without needing detailed kinetic data (Orth et al., 2010).
To run these simulations, we utilised Julia, a high-performance programming language designed for numerical analysis and computational tasks (Bezanson et al., 2012). Julia was recommended by our secondary PI, Dr. St. Elmo Wilken, because of its speed and efficiency when handling complex metabolic models like iML1515. To actually implement FBA, we used COBREXA.jl, a Julia package specifically built for constraint-based reconstruction and analysis of biological networks. This package provided the core functionality needed to perform FBA within the iML1515 model and predict how changes to the system would affect metabolite flows and cellulose production.
Essentially, we ran two simulations to understand the relationship between growth rate (μ) and cellulose flux in E. coli, and how these two factors influence each other when resources are reallocated within the metabolic network.
1. Growth Rate Constraints on Cellulose Flux
In the first simulation, we aimed to examine how varying the growth rate (μ) of E. coli affects the cellulose flux, meaning the rate at which cellulose is produced. We constrained the growth rate between 0 and 1.0 (1/h) and measured the resulting cellulose flux, expressed in mmol/gDW/h. The resulting plot (Figure 1) shows a clear inverse relationship between growth rate and cellulose production. At the theoretical maximum cellulose flux of approximately 9 mmol/gDW/h, the growth rate drops to 0 (1/h), suggesting that when E. coli channels all of its metabolic resources toward producing cellulose, its growth stops entirely. As the growth rate increases, the cellulose flux decreases. For example, at a cellulose flux of 2.5 mmol/gDW/h, the growth rate reaches 0.6 (1/h).
This result suggests a metabolic trade-off, meaning that E. coli can either focus on growth or on cellulose production, but achieving both at high levels simultaneously is not possible. This is likely driven by the fact that growth processes, such as biomass accumulation, require significant energy and metabolic intermediates that are also needed for cellulose production (Lahiri et al., 2021). It seems, when more resources are allocated to growth, fewer are available for cellulose synthesis, and vice versa.
Figure 1: Growth Rate versus Cellulose Flux
2. Cellulose Flux Constraints on Growth Rate
In the second simulation, we reversed the approach by constraining the cellulose flux between 0 and 3 mmol/gDW/h and examined how this affected the theoretical growth rate (μ) of E. coli. The resulting plot (Figure 2) shows that the maximum growth rate, around 0.9 (1/h), occurs when the cellulose flux is zero. This suggests that E. coli achieves its optimal growth rate when it is not producing cellulose. As the cellulose flux increases, the growth rate steadily decreases. For instance, when the growth rate is 0.5 (1/h), the cellulose flux is approximately 1 mmol/gDW/h.
This further highlights the metabolic burden that cellulose production places on the bacterium. The more resources that are dedicated to making cellulose, the less efficient the growth becomes (Lahiri et al., 2021). Essentially, E. coli cannot produce high levels of cellulose without sacrificing its growth rate. This reinforces the idea that there’s a constant competition for the shared metabolic resources required for both growth and cellulose synthesis.
Figure 2: Cellulose Flux versus Growth Rate
Both simulations show a trade-off between growth rate and cellulose production. When E. coli focuses on growing, the metabolic flux available for cellulose production decreases, and when it shifts toward producing cellulose, the growth rate slows down. This is because both processes require significant amounts of energy and key precursors like ATP, NADPH, and other metabolic intermediates. Since these resources are limited, the bacterium has to balance its efforts between the two. In practical terms, optimising cellulose production in E. coli will likely involve finding a balance between growth and cellulose flux.
# simulation: for a specific growth rate per hour; mu (0~1.0), determine the theoretical cellulose flux
ct1 = flux_balance_constraints(model)
ct1.fluxes.EX_cellulose_e.bound = ConstraintTrees.Between(0, 1000)
mus1 = []
cellulose_fluxes1 = []
for mu in 0:0.01:1.0
ct1.fluxes.BIOMASS_Ec_iML1515_core_75p37M.bound = ConstraintTrees.EqualTo(mu)
sol1 = optimized_values(ct1; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ct1.fluxes.BCS.value, settings=[silence])
isnothing(sol1) && break
cellulose_flux = sol1.fluxes.EX_cellulose_e
abs(cellulose_flux) < 1e-1 && break
push!(mus1,mu)
push!(cellulose_fluxes1, cellulose_flux)
end
f1 = Figure()
Axis(f1[1, 1];
xlabel="μ (1/h)",
ylabel="cellulose flux (mmol/gDW/h)",
title="Flux Balance Analysis Simulation - Growth Rate Constraints on Cellulose Flux",
)
scatterlines!(mus1, cellulose_fluxes1, marker = :utriangle, strokewidth = 1,
markersize = 10, color = :orange, strokecolor = :black)
f1
save("FBA_mu_cellulose.png", f1) # save the plot
# simulation: for specific cellulose flux (0~3), determine the theoretical growth rate (mu)
ct2 = flux_balance_constraints(model)
ct2.fluxes.BIOMASS_Ec_iML1515_core_75p37M.bound = ConstraintTrees.Between(0, 1000)
mus2 = []
cellulose_fluxes2 = []
for cellulose_flux in 0:0.01:3.0
ct2.fluxes.BCS.bound = ConstraintTrees.EqualTo(cellulose_flux)
sol2 = optimized_values(ct2; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ct2.fluxes.BIOMASS_Ec_iML1515_core_75p37M.value, settings=[silence])
isnothing(sol2) && break
mu = sol2.fluxes.BIOMASS_Ec_iML1515_core_75p37M
abs(mu) < 1e-1 && break
push!(mus2,mu)
push!(cellulose_fluxes2, cellulose_flux)
end
f2 = Figure()
Axis(f2[1, 1];
ylabel="μ (1/h)",
xlabel="cellulose flux (mmol/gDW/h)",
title="Flux Balance Analysis Simulation - Cellulose Flux Constraints on Growth Rate",
)
scatterlines!(cellulose_fluxes2, mus2, marker = :dtriangle, strokewidth = 1,
markersize = 1, color = :navy, strokecolor = :black)
f2
save("FBA_cellulose_mu.png", f2) # save the plot
Enzyme Constrained Model
Unlike traditional Flux Balance Analysis (FBA), which only optimises for an objective function (such as growth rate or product yield), enzyme-constrained metabolic modelling offers more realistic predictions by accounting for enzyme kinetics (Moreno‐Paz et al., 2022). This method incorporates enzyme concentration and turnover rates, making it a more accurate representation of the metabolic constraints within a cell. Essentially, it considers how the availability and efficiency of enzymes impact the metabolic fluxes, providing a more precise simulation of cellular metabolism.
Unlike traditional Flux Balance Analysis (FBA), which only optimises for an objective function (such as growth rate or product yield), enzyme-constrained metabolic modelling offers more realistic predictions by accounting for enzyme kinetics (Moreno‐Paz et al., 2022). This method incorporates enzyme concentration and turnover rates, making it a more accurate representation of the metabolic constraints within a cell. Essentially, it considers how the availability and efficiency of enzymes impact the metabolic fluxes, providing a more precise simulation of cellular metabolism.
For our enzyme-constrained model, we first needed to obtain the kcat values for the reactions in our modified E. coli model. The kcat value represents the turnover number of an enzyme, or how many substrate molecules it can convert to product per second. The majority of kcat values were curated from the KO ALE ensemble model published by Heckmann et al. (2020). This model was selected because it had the lowest RMSE and highest R-squared values, making it the most suitable for our predictions. For the specific BCS (bacterial cellulose synthase) reaction, we could not find a published kcat value, so we estimated it using TurnNuP, a machine learning tool developed by Alexander Kroll (Kroll et al., 2023). The kcat for the BCS enzyme was predicted to be 5.62.
The enzyme masses were calculated based on data from the UniProt database, which provided the molecular weights of the enzymes involved. Since there is no exact mass for the BCS enzyme, we estimated it by taking the average mass of all the gene products in our model. In this approach, the total enzyme capacity was constrained to 500 mg of enzyme per gram of dry cell weight (gDW), under the assumption that about 50% of the cell's dry weight is made up of proteins. This constraint limits the total metabolic capacity of the cell, ensuring that the model respects the realistic enzyme availability within the cell. We integrated these enzyme constraints into our metabolic model using the enzyme-constrained flux balance analysis (ecFBA) approach. The ecFBA method adds additional constraints to the standard FBA by including the capacity of each enzyme to catalyse its associated reaction, based on both its concentration and its kinetic parameters (kcat). This allowed us to simulate metabolic fluxes under more realistic conditions, taking into account the limitations imposed by enzyme availability and efficiency.
df = CSV.read("k_cats.csv", DataFrame) # k_cats curated from KO ALE ensemble model (Heckmann et al., 2020)
reaction_kcats = Dict(zip(df[:, 1], df[:, 2]))
reaction_kcats["BCS"] = 5.62 # k_cat value for bcs estimated using ML tool (TurnNuP)
reaction_isozymes = Dict{String,Dict{String,Isozyme}}() # a mapping from reaction IDs to isozyme IDs to isozyme structs.
for rid in A.reactions(model)
grrs = A.reaction_gene_association_dnf(model, rid)
isnothing(grrs) && continue # skip if no grr available
haskey(reaction_kcats, rid) || continue # skip if no kcat data available
for (i, grr) in enumerate(grrs)
d = get!(reaction_isozymes, rid, Dict{String,Isozyme}())
d["isozyme_"*string(i)] = Isozyme( # each isozyme gets a unique name
gene_product_stoichiometry = Dict(grr .=> fill(1.0, size(grr))), # assume subunit stoichiometry of 1 for all isozymes
kcat_forward = reaction_kcats[rid] * 3.6, # forward reaction turnover number units = 1/h
kcat_reverse = reaction_kcats[rid] * 3.6, # reverse reaction turnover number units = 1/h
)
end
end
total_enzyme_capacity = 500.0 # mg of enzyme/gDW; assume 50% of cell dry weight is protein
gene_product_masses = JSON.parsefile("e_coli.json") # gene product masses are parsed from UniProt
gene_product_masses_dict = Dict(key => value[1] for (key, value) in gene_product_masses)
merge!(gene_product_masses_dict, Dict("bcs"=>mean(values(gene_product_masses_dict)))) # bcs mass is estimated as the avg. of all gene products
ec_system = enzyme_constrained_flux_balance_constraints( # enzyme constrained model
model;
reaction_isozymes,
gene_product_molar_masses = gene_product_masses_dict,
capacity = total_enzyme_capacity
)
Figure 3: Metabolic flux map based on FBA (cellulose flux is 1.53, while transaldolase flux is upregulated)
In Figure 3, we show the metabolic flux map based on traditional FBA. With a cellulose flux of 1.53 mmol/gDW/h, the model surprisingly upregulated the transaldolase flux in the pentose phosphate pathway (PPP), which seemed unusual. This highlights one limitation of FBA: while it optimises for a single objective, it doesn’t always reflect realistic cellular behaviour because it overlooks how resources are allocated.
Figure 4: Metabolic flux map based on EC (cellulose flux is 1.53, normal glycolysis enzyme flux is upregulated)
In contrast, Figure 4 shows the flux map from the enzyme-constrained model. Despite achieving the same cellulose flux of 1.53 mmol/gDW/h, the upregulation shifted to glycolysis, which aligns more closely with expected metabolic behaviour. This is because the enzyme-constrained approach takes resource allocation into account, offering a more accurate and realistic prediction of how E. coli would distribute its metabolic resources.
Brute Force: Knock Out
For our enzyme-constrained metabolic model, we explored gene knockouts (KOs) and knockdowns (KDs) to optimise cellulose production while ensuring that the organism could still survive.
Initially, we used a brute force knockout approach, where specific reactions were knocked out by setting their fluxes to zero. We selected candidate reactions based on their influence on cellulose flux. After identifying key reactions through individual knockouts, we simulated double and triple knockouts to assess the combined impact on cellulose production. The effectiveness of each knockout was measured by the resulting cellulose flux, and this approach led us to candidate reactions that significantly boosted cellulose production.
However, brute force knockouts are computationally intensive and do not always reflect biological reality. Reactions often have multivariate interactions, meaning some reactions cannot be fully knocked out without compromising the organism’s survival. Given the complexity of metabolic interactions, we switched to a heuristic approach, combining knockouts and knockdowns. The goal was to fine-tune reaction fluxes by reducing, rather than completely eliminating, the activity of certain reactions, especially those essential to the organism’s fitness.
# Reaction knockouts are simulated by constrained specific reaction fluxes to zero
# Cellulose fluxes are chosen as the output to assess the performance of the strain after KO
rxns = []
cellulose_fluxes3 = []
rids = A.reactions(model)
ec_system.objective = ec_system.fluxes.BCS
for rid in rids
foo = ec_system.fluxes[Symbol(rid)].bound
ec_system.fluxes[Symbol(rid)].bound = ConstraintTrees.EqualTo(0)
sol3 = optimized_values(ec_system; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ec_system.fluxes.BIOMASS_Ec_iML1515_core_75p37M.value, # Biomass is the objective
settings=[silence])
isnothing(sol3) && (ec_system.fluxes[Symbol(rid)].bound = foo; continue) # skip for critical KOs
cellulose_flux = sol3.fluxes.EX_cellulose_e
push!(rxns,rid)
push!(cellulose_fluxes3, cellulose_flux)
ec_system.fluxes[Symbol(rid)].bound = foo
end
# Candidate KOs are selected based on cellulose flux
all_1KO = hcat(rxns, cellulose_fluxes3)
candidate_1KO = all_1KO[all_1KO[:, 2] .>= maximum(cellulose_fluxes3), :]
# Double reaction KO is simulated based on candidate one reaction KOs
rxns_2KO1 = []
rxns_2KO2 = []
cellulose_fluxes4 = []
for rid1 in rxns
foo1 = ec_system.fluxes[Symbol(rid1)].bound
ec_system.fluxes[Symbol(rid1)].bound = ConstraintTrees.EqualTo(0)
for rid2 in rxns
rid1 == rid2 && continue
foo2 = ec_system.fluxes[Symbol(rid2)].bound
ec_system.fluxes[Symbol(rid2)].bound = ConstraintTrees.EqualTo(0)
sol4 = optimized_values(ec_system; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ec_system.fluxes.BIOMASS_Ec_iML1515_core_75p37M.value, settings=[silence])
isnothing(sol4) && (ec_system.fluxes[Symbol(rid2)].bound = foo2; continue) # skip for critical KOs
cellulose_flux = sol4.fluxes.EX_cellulose_e
abs(cellulose_flux) < 2.318 && (ec_system.fluxes[Symbol(rid2)].bound = foo2; continue) # skip if performance does not improve
push!(rxns_2KO1,rid1)
push!(rxns_2KO2,rid2)
push!(cellulose_fluxes4, cellulose_flux)
ec_system.fluxes[Symbol(rid2)].bound = foo2
end
ec_system.fluxes[Symbol(rid1)].bound = foo1
end
# Tripple reaction KO is simulated based on candidate double reaction KOs
rxns_3KO1 = []
rxns_3KO2 = []
rxns_3KO3 = []
cellulose_fluxes5 = []
for rid1 in rxns_2KO1
foo1 = ec_system.fluxes[Symbol(rid1)].bound
ec_system.fluxes[Symbol(rid1)].bound = ConstraintTrees.EqualTo(0)
for rid2 in rxns_2KO2
rid1 == rid2 && continue
foo2 = ec_system.fluxes[Symbol(rid2)].bound
ec_system.fluxes[Symbol(rid2)].bound = ConstraintTrees.EqualTo(0)
for rid3 in rxns
rid3 == rid1 && continue
rid3 == rid2 && continue
foo3 = ec_system.fluxes[Symbol(rid3)].bound
sol5 = optimized_values(ec_system; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ec_system.fluxes.BIOMASS_Ec_iML1515_core_75p37M.value, settings=[silence])
isnothing(sol5) && (ec_system.fluxes[Symbol(rid3)].bound = foo3; continue) # skip for critical KOs
cellulose_flux = sol5.fluxes.EX_cellulose_e
abs(cellulose_flux) < 2.318 && (ec_system.fluxes[Symbol(rid3)].bound = foo3; continue) # skip if performance does not improve
push!(rxns_3KO1,rid1)
push!(rxns_3KO2,rid2)
push!(rxns_3KO3,rid3)
push!(cellulose_fluxes5, cellulose_flux)
ec_system.fluxes[Symbol(rid3)].bound = foo3
end
ec_system.fluxes[Symbol(rid2)].bound = foo2
end
ec_system.fluxes[Symbol(rid1)].bound = foo1
end
Heuristic: Knock Out and Knock Down
Brute force approach to find candidate reaction knock out is computationally expensive, and univariate approach may not accurately capture biological phenomena as reactions and genes operate on multivariate interactions.
Also, there are multiple reactions that are essential in organisms' fitness. such that a complete knock out is not possible but a knock down approach must be taken.
Metabolic map that can be generated using Escher can give intuition on target reactions such that the flux is directed to desired reactions.
Looking at the metabolic map, G6P is a key metabolite for both BC synthesis and central carbon metabolism. Knocking out G6PDH2r, and knocking down PGI ensures the flux is focused to BCS.
UDPG is the substrate used by BCS to produce cellulose, but TRE6PS competes for this, and thus it will be knocked out.
Overexpression of PGMT and favouring the reverse reaction is also essential to direct flux towards BCS.
ec_system_escher = enzyme_constrained_flux_balance_constraints( # initialise enzyme constrained model
model;
reaction_isozymes,
gene_product_molar_masses = gene_product_masses_dict,
capacity = total_enzyme_capacity
)
rxn1 = "G6PDH2r" # KO
rxn2 = "PGI" # KD
rxn3 = "TRE6PS" # KO
rxn4 = "PGMT" # overexpress, favour reverse reaction
foo_e1 = ec_system_escher.fluxes[Symbol(rxn1)].bound
foo_e2 = ec_system_escher.fluxes[Symbol(rxn2)].bound
foo_e3 = ec_system_escher.fluxes[Symbol(rxn3)].bound
foo_e4 = ec_system_escher.fluxes[Symbol(rxn4)].bound
ec_system_escher.fluxes[Symbol(rxn1)].bound = ConstraintTrees.EqualTo(0) ## KO
ec_system_escher.fluxes[Symbol(rxn2)].bound = ConstraintTrees.Between(-2,2) ## KD
ec_system_escher.fluxes[Symbol(rxn3)].bound = ConstraintTrees.EqualTo(0) ## KO
ec_system_escher.fluxes[Symbol(rxn4)].bound = ConstraintTrees.Between(-1000,-13) ## overexpression, enzyme engineering
sol_e = optimized_values(ec_system_escher; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ec_system_escher.fluxes.BIOMASS_Ec_iML1515_core_75p37M.value, settings=[silence])
ec_system.fluxes[Symbol(rxn1)].bound = foo_e1
ec_system.fluxes[Symbol(rxn2)].bound = foo_e2
ec_system.fluxes[Symbol(rxn3)].bound = foo_e3
ec_system.fluxes[Symbol(rxn4)].bound = foo_e4
# exporting enzyme constrained fluxes with KOs, KDs to Escher
for (k, v) in sol_e.fluxes
startswith(string(k), "EX_") || continue
abs(v) > 1e-3 || continue
println(k, ": ", v)
end
open("ec_KO_KD_fluxes.json", "w") do io
JSON.print(
io,
Dict(string(k) => v for (k, v) in sol_e.fluxes),
)
end
Figure 5: Metabolic flux map based on enzyme constrained model with KOs and KDs, where the cellulose flux is 8.40, glycolysis is active and essentially the organism survives.
By analysing the metabolic map in Escher, we identified several key reactions that could be targeted to reroute flux towards cellulose production. G6P is a central metabolite involved in both BCS and central carbon metabolism. We knocked out G6PDH2r(glucose-6-phosphate dehydrogenase) and knocked down PGI (phosphoglucose isomerase) to ensure that more flux was directed to the BCS pathway. UDPG, the substrate for BCS, competes with TRE6PS (trehalose-6-phosphate synthase). Knocking out TRE6PS minimised this competition, channelling more flux toward cellulose synthesis. Lastly, overexpression of PGMT (phosphoglucomutase), with a focus on favouring the reverse reaction, further supported the redirection of flux to the BCS pathway, enhancing cellulose production.
Escher Visualisation of Metabolic Flux
To get a clearer understanding of how the metabolic pathways in E. coli functioned with the BCS pathway integrated, we used Escher to visualise the fluxes (King et al., 2015). This tool allowed us to map the flow of metabolites throughout the network and see how the enzyme-constrained model altered metabolic behaviour.
# exporting FBA fluxes to Escher
sol = flux_balance_analysis(model; optimizer=HiGHS.Optimizer, settings=[silence])
for (k, v) in sol.fluxes
startswith(string(k), "EX_") || continue
abs(v) > 1e-3 || continue
println(k, ": ", v)
end
open("fba_fluxes.json", "w") do io
JSON.print(
io,
Dict(string(k) => v for (k, v) in sol.fluxes),
)
end
# exporting enzyme constrained fluxes to Escher
sol_e = optimized_values(ec_system; optimizer=HiGHS.Optimizer, sense=Maximal,
objective=ec_system.fluxes.BIOMASS_Ec_iML1515_core_75p37M.value, settings=[silence])
for (k, v) in sol_e.fluxes
startswith(string(k), "EX_") || continue
abs(v) > 1e-3 || continue
println(k, ": ", v)
end
open("ec_fluxes.json", "w") do io
JSON.print(
io,
Dict(string(k) => v for (k, v) in sol_e.fluxes),
)
end
References
Foroughi, F., Rezvani Ghomi, E., Morshedi Dehaghi, F., Borayek, R., & Ramakrishna, S. (2021). A Review on the Life Cycle Assessment of Cellulose: From Properties to the Potential of Making It a Low Carbon Material. Materials, 14(4), 714. https://doi.org/10.3390/ma14040714
Gonzalez, V., Lou, X., & Chi, T. (2023). Evaluating Environmental Impact of Natural and Synthetic Fibers: A Life Cycle Assessment Approach. Sustainability, 15(9), 7670. https://doi.org/10.3390/su15097670
Forte, A., Dourado, F., Mota, A., Neto, B., Gama, M., & Ferreira, E. C. (2021). Life cycle assessment of bacterial cellulose production. The International Journal of Life Cycle Assessment, 26(5), 864–878. https://doi.org/10.1007/s11367-021-01904-2
Jang, W. D., Kim, T. Y., Kim, H. U., Shim, W. Y., Ryu, J. Y., Park, J. H., & Lee, S. Y. (2019). Genomic and metabolic analysis of Komagataeibacter xylinus DSM 2325 producing bacterial cellulose nanofiber. Biotechnology and Bioengineering, 116(12), 3372–3381. https://doi.org/10.1002/bit.27150
Bezanson, J., Karpinski, S., Shah, V. B., & Edelman, A. (2012). Julia: A Fast Dynamic Language for Technical Computing. arXiv. https://doi.org/10.48550/ARXIV.1209.5145
Grafahrend-Belau, E., Schreiber, F., KoschützkiD., & JunkerB. H. (2008). Flux Balance Analysis of Barley Seeds: A Computational Approach to Study Systemic Properties of Central Metabolism . Plant Physiology, 149(1), 585–598. https://doi.org/10.1104/pp.108.129635
Kroll, A., Rousset, Y., Hu, X.-P., Liebrand, N. A., & Lercher, M. J. (2023). Turnover number predictions for kinetically uncharacterized enzymes using machine and deep learning. Nature Communications, 14(1), 4139. https://doi.org/10.1038/s41467-023-39840-4
Lahiri, D., Nag, M., Dutta, B., Dey, A., Sarkar, T., Pati, S., … Ray, R. R. (2021). Bacterial Cellulose: Production, Characterization, and Application as Antimicrobial Agent. International Journal of Molecular Sciences, 22(23), 12984. https://doi.org/10.3390/ijms222312984
Moreno-Paz, S., Schmitz, J., Martins Dos Santos, V. A. P., & Suarez-Diez, M. (2022). Enzyme-constrained models predict the dynamics of Saccharomyces cerevisiae growth in continuous, batch and fed-batch bioreactors. Microbial biotechnology, 15(5), 1434–1445. https://doi.org/10.1111/1751-7915.13995
Orth, J. D., Thiele, I., & Palsson, B. Ø. (2010). What is flux balance analysis? Nature Biotechnology, 28(3), 245–248. https://doi.org/10.1038/nbt.1614