Minimization of metabolic adjustment (MOMA)
MOMA allows you to find a feasible solution of the model that is closest (in an Euclidean metric) to a reference solution. Often this gives a realistic estimate of the organism behavior that has undergone a radical change (such as a gene knockout) that prevents it from metabolizing optimally, but the rest of the metabolism has not yet adjusted to compensate for the change.
The original description of MOMA is by Segre, Vitkup, and Church, "Analysis of optimality in natural and perturbed metabolic networks", Proceedings of the National Academy of Sciences, 2002.
As always, let's start with downloading a model.
!isfile("e_coli_core.xml") &&
download("http://bigg.ucsd.edu/static/models/e_coli_core.xml", "e_coli_core.xml")
using COBREXA
model = load_model(StandardModel, "e_coli_core.xml")
Metabolic model of type StandardModel sparse([8, 10, 21, 43, 50, 51, 8, 9, 6, 12 … 33, 66, 68, 72, 23, 26, 33, 72, 22, 33], [1, 1, 1, 1, 1, 1, 2, 2, 3, 3 … 93, 93, 93, 93, 94, 94, 94, 94, 95, 95], [-1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0 … 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0], 72, 95) Number of reactions: 95 Number of metabolites: 72
MOMA analysis requires solution of a quadratic model, we will thus use Clarabel as the main optimizer.
using Clarabel
We will need a reference solution, which represents the original state of the organism before the change.
reference_flux =
flux_balance_analysis_dict(model, Clarabel.Optimizer; modifications = [silence])
Dict{String, Float64} with 95 entries: "R_EX_fum_e" => -5.00659e-12 "R_ACONTb" => 6.00725 "R_GLNS" => 0.223462 "R_SUCOAS" => -5.06438 "R_TPI" => 7.47738 "R_EX_pi_e" => -3.2149 "R_PPC" => 2.50431 "R_O2t" => 21.7995 "R_G6PDH2r" => 4.95998 "R_TALA" => 1.49698 "R_PPCK" => 5.75426e-10 "R_EX_lac__D_e" => 6.70413e-11 "R_PGL" => 4.95998 "R_H2Ot" => -29.1758 "R_GLNabc" => 2.95563e-12 "R_EX_co2_e" => 22.8098 "R_EX_gln__L_e" => -2.95564e-12 "R_EX_nh4_e" => -4.76532 "R_MALt2_2" => 5.34064e-12 ⋮ => ⋮
As the change here, we manually knock out CYTBD reaction:
changed_model = change_bound(model, "R_CYTBD", lower = 0.0, upper = 0.0);
Now, let's find a flux that minimizes the organism's metabolic adjustment for this model:
flux_summary(
minimize_metabolic_adjustment_analysis_dict(
changed_model,
reference_flux,
Clarabel.Optimizer;
modifications = [silence],
),
)
Biomass R_BIOMASS_Ecoli_core_w_GAM: 0.06 Import R_EX_glc__D_e: -9.1554 R_EX_nh4_e: -1.3091 R_EX_pi_e: -0.2209 Export R_EX_glu__L_e: 0.9817 R_EX_acald_e: 1.7139 R_EX_co2_e: 5.1127 R_EX_h2o_e: 5.7936 R_EX_succ_e: 5.9147 R_EX_etoh_e: 7.6345 R_EX_h_e: 14.9974
For illustration, you can compare the result to the flux that is found by simple optimization:
flux_summary(
flux_balance_analysis_dict(
changed_model,
Clarabel.Optimizer;
modifications = [silence],
),
)
Biomass R_BIOMASS_Ecoli_core_w_GAM: 0.2117 Import R_EX_glc__D_e: -10.0 R_EX_h2o_e: -7.1158 R_EX_nh4_e: -1.1542 R_EX_pi_e: -0.7786 R_EX_co2_e: -0.3782 Export R_EX_etoh_e: 8.2795 R_EX_ac_e: 8.5036 R_EX_for_e: 17.8047 R_EX_h_e: 30.5542
This page was generated using Literate.jl.