diff --git a/src/frontend/mmdf.jl b/src/frontend/mmdf.jl index 1f0d1b085..bbfa56244 100644 --- a/src/frontend/mmdf.jl +++ b/src/frontend/mmdf.jl @@ -49,7 +49,7 @@ Reactions specified in `ignore_reaction_ids` are internally ignored when calculating the max-min driving force. Importantly, this should include water and proton importers. -Since biochemical thermodynamics are assumed, the `proton_ids` and `water_ids` +Since biochemical thermodynamics are assumed, the `proton_metabolites` and `water_metabolites` need to be specified so that they can be ignored in the calculations. Effectively this assumes an aqueous environment at constant pH is used. @@ -75,16 +75,83 @@ function max_min_driving_force_analysis( reference_flux = Dict{String,Float64}(), concentration_ratios = Dict{String,Tuple{String,String,Float64}}(), constant_concentrations = Dict{String,Float64}(), - proton_ids, - water_ids, + ignored_metabolites = Set{String}()proton_metabolites = Set{String}(), + water_metabolites = Set{String}(), concentration_lb = 1e-9, # M concentration_ub = 1e-1, # M T = 298.15, # Kelvin R = 8.31446261815324e-3, # kJ/K/mol - ignore_reaction_ids = String[], + check_ignored_reactions = missing, settings = [], optimizer, ) + + # First let's check if all the identifiers are okay because we use quite a + # lot of these. + + model_reactions = Set(A.reactions(model)) + model_metabolites = Set(A.metabolites(model)) + + all(in(model_reactions), keys(reaction_standard_gibbs_free_energies)) || throw( + DomainError( + reaction_standard_gibbs_free_energies, + "unknown reactions referenced by reaction_standard_gibbs_free_energies", + ), + ) + all(in(model_reactions), keys(reference_flux)) || throw( + DomainError( + reaction_standard_gibbs_free_energies, + "unknown reactions referenced by reference_flux", + ), + ) + all(in(model_metabolites), keys(constant_concentrations)) || throw( + DomainError( + constant_concentrations, + "unknown metabolites referenced by constant_concentrations", + ), + ) + all( + in(model_metabolites), + (m for (_, (x, y, _)) in concentration_ratios for m in (x, y)), + ) || throw( + DomainError( + concentration_ratios, + "unknown metabolites referenced by concentration_ratios", + ), + ) + all(in(model_metabolites), proton_metabolites) || throw( + DomainError( + concentration_ratios, + "unknown metabolites referenced by proton_metabolites", + ), + ) + all(in(model_metabolites), water_metabolites) || throw( + DomainError( + concentration_ratios, + "unknown metabolites referenced by water_metabolites", + ), + ) + all(in(model_metabolites), ignored_metabolites) || throw( + DomainError( + concentration_ratios, + "unknown metabolites referenced by ignored_metabolites", + ), + ) + + if !ismissing(check_ignored_reactions) && ( + all( + x -> !haskey(reaction_standard_gibbs_free_energies, x), + check_ignored_reactions, + ) || ( + union( + Set(check_ignored_reactions), + Set(keys(reaction_standard_gibbs_free_energies)), + ) != model_reactions + ) + ) + throw(AssertionError("check_ignored_reactions validation failed")) + end + m = max_min_driving_force_constraints( model, reaction_standard_gibbs_free_energies; @@ -94,8 +161,8 @@ function max_min_driving_force_analysis( R, T, ignore_reaction_ids, - water_ids, - proton_ids, + water_metabolites, + proton_metabolites, ) for (mid, val) in constant_concentrations