From 1dcc6438250aa18507f09197ce87c95d42062caa Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Mon, 22 Nov 2021 09:20:10 +0100 Subject: [PATCH 1/8] remove some unnecessarily explicit Unions --- src/analysis/flux_balance_analysis.jl | 4 ++-- src/analysis/screening.jl | 2 +- src/base/types/FluxVariabilitySummary.jl | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/analysis/flux_balance_analysis.jl b/src/analysis/flux_balance_analysis.jl index 7e60c5e1e..ae096ea3e 100644 --- a/src/analysis/flux_balance_analysis.jl +++ b/src/analysis/flux_balance_analysis.jl @@ -1,5 +1,5 @@ """ - flux_balance_analysis_vec(args...)::Union{Vector{Float64},Nothing} + flux_balance_analysis_vec(args...)::Maybe{Vector{Float64}} A variant of FBA that returns a vector of fluxes in the same order as reactions of the model, if the solution is found. @@ -13,7 +13,7 @@ flux_balance_analysis_vec(args...; kwargs...)::Maybe{Vector{Float64}} = flux_vector(flux_balance_analysis(args...; kwargs...)) """ - flux_balance_analysis_dict(model::MetabolicModel, args...)::Union{Dict{String, Float64},Nothing} + flux_balance_analysis_dict(model::MetabolicModel, args...)::Maybe{Dict{String, Float64}} A variant of FBA that returns a dictionary assigning fluxes to reactions, if the solution is found. Arguments are passed to [`flux_balance_analysis`](@ref). diff --git a/src/analysis/screening.jl b/src/analysis/screening.jl index ba5b035bb..acfd1daa8 100644 --- a/src/analysis/screening.jl +++ b/src/analysis/screening.jl @@ -175,7 +175,7 @@ screen_variants(model, variants, analysis; workers = [myid()]) = screen(model; variants = variants, analysis = analysis, workers = workers) """ - screen_optimize_objective(_, optmodel)::Union{Float64,Nothing} + screen_optimize_objective(_, optmodel)::Maybe{Float64} A variant of [`optimize_objective`](@ref) directly usable in [`screen_optmodel_modifications`](@ref). diff --git a/src/base/types/FluxVariabilitySummary.jl b/src/base/types/FluxVariabilitySummary.jl index ff1c1065f..97a5edc94 100644 --- a/src/base/types/FluxVariabilitySummary.jl +++ b/src/base/types/FluxVariabilitySummary.jl @@ -4,8 +4,8 @@ Stores summary information about the result of a flux variability analysis. """ struct FluxVariabilitySummary - biomass_fluxes::Dict{String,Vector{Union{Float64,Nothing}}} - exchange_fluxes::Dict{String,Vector{Union{Float64,Nothing}}} + biomass_fluxes::Dict{String,Vector{Maybe{Float64}}} + exchange_fluxes::Dict{String,Vector{Maybe{Float64}}} end """ @@ -15,8 +15,8 @@ A default empty constructor for [`FluxVariabilitySummary`](@ref). """ function FluxVariabilitySummary() FluxVariabilitySummary( - Dict{String,Vector{Union{Float64,Nothing}}}(), - Dict{String,Vector{Union{Float64,Nothing}}}(), + Dict{String,Vector{Maybe{Float64}}}(), + Dict{String,Vector{Maybe{Float64}}}(), ) end @@ -84,14 +84,14 @@ function flux_variability_summary( rxn_ids, ) - biomass_fluxes = Dict{String,Vector{Union{Float64,Nothing}}}() + biomass_fluxes = Dict{String,Vector{Maybe{Float64}}}() for rxn_id in bmasses lb = isnothing(flux_result[1][rxn_id]) ? nothing : flux_result[1][rxn_id][rxn_id] ub = isnothing(flux_result[2][rxn_id]) ? nothing : flux_result[2][rxn_id][rxn_id] biomass_fluxes[rxn_id] = [lb, ub] end - ex_rxn_fluxes = Dict{String,Vector{Union{Float64,Nothing}}}() + ex_rxn_fluxes = Dict{String,Vector{Maybe{Float64}}}() for rxn_id in ex_rxns lb = isnothing(flux_result[1][rxn_id]) ? nothing : flux_result[1][rxn_id][rxn_id] ub = isnothing(flux_result[2][rxn_id]) ? nothing : flux_result[2][rxn_id][rxn_id] From a87b3c4604bcea9fc63355ce24d0ae072e77216f Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Mon, 27 Dec 2021 21:03:27 +0100 Subject: [PATCH 2/8] use the keyword arguments in new version of SBML ...hopefully ending the series of single-version compatibility fixes once for all. --- Project.toml | 2 +- src/base/types/SBMLModel.jl | 61 +++++++++++++++---------------------- 2 files changed, 26 insertions(+), 37 deletions(-) diff --git a/Project.toml b/Project.toml index ea8b02ed3..834a1303d 100644 --- a/Project.toml +++ b/Project.toml @@ -28,7 +28,7 @@ MAT = "0.10" MacroTools = "0.5.6" OSQP = "0.6" OrderedCollections = "1.4" -SBML = "0.7, 0.8.2" +SBML = "0.9.1" StableRNGs = "1.0" Tulip = "0.7" julia = "1.5" diff --git a/src/base/types/SBMLModel.jl b/src/base/types/SBMLModel.jl index da9115233..2d183a9a9 100644 --- a/src/base/types/SBMLModel.jl +++ b/src/base/types/SBMLModel.jl @@ -165,65 +165,54 @@ function Base.convert(::Type{SBMLModel}, mm::MetabolicModel) rxns = reactions(mm) stoi = stoichiometry(mm) (lbs, ubs) = bounds(mm) - ocs = objective(mm) comps = _default.("", metabolite_compartment.(Ref(mm), mets)) compss = Set(comps) return SBMLModel( SBML.Model( - Dict(), # parameters - Dict("" => 1), # units - Dict( - comp => - SBML.Compartment(nothing, nothing, nothing, nothing, nothing, nothing) - for comp in compss - ), - Dict( + units = Dict("" => []), # units + compartments = Dict(comp => SBML.Compartment() for comp in compss), + species = Dict( mid => SBML.Species( - nothing, # name - _default("", comps[mi]), # compartment - nothing, # no information about boundary conditions - metabolite_formula(mm, mid), - metabolite_charge(mm, mid), - nothing, # initial amount - nothing, # initial concentration - nothing, # only substance unit flags - _sbml_export_notes(metabolite_notes(mm, mid)), - _sbml_export_annotation(metabolite_annotations(mm, mid)), + compartment = _default("", comps[mi]), # compartment + formula = metabolite_formula(mm, mid), + charge = metabolite_charge(mm, mid), + notes = _sbml_export_notes(metabolite_notes(mm, mid)), + annotation = _sbml_export_annotation(metabolite_annotations(mm, mid)), ) for (mi, mid) in enumerate(mets) ), - Dict( + reactions = Dict( rid => SBML.Reaction( - Dict( + reactants = Dict( mets[i] => -stoi[i, ri] for i in SparseArrays.nonzeroinds(stoi[:, ri]) if stoi[i, ri] <= 0 ), - Dict( + products = Dict( mets[i] => stoi[i, ri] for i in SparseArrays.nonzeroinds(stoi[:, ri]) if stoi[i, ri] > 0 ), - (lbs[ri], ""), - (ubs[ri], ""), - ocs[ri], - _maybemap( + kinetic_parameters = Dict( + "LOWER_BOUND" => (lbs[ri], ""), + "UPPER_BOUND" => (ubs[ri], ""), + ), + gene_product_association = _maybemap( x -> _unparse_grr(SBML.GeneProductAssociation, x), reaction_gene_association(mm, rid), ), - nothing, # no kinetic math - true, # reversible by default - _sbml_export_notes(reaction_notes(mm, rid)), - _sbml_export_annotation(reaction_annotations(mm, rid)), + reversible = true, + notes = _sbml_export_notes(reaction_notes(mm, rid)), + annotation = _sbml_export_annotation(reaction_annotations(mm, rid)), ) for (ri, rid) in enumerate(rxns) ), - Dict( + gene_products = Dict( gid => SBML.GeneProduct( - nothing, - nothing, - _sbml_export_notes(gene_notes(mm, gid)), - _sbml_export_annotation(gene_annotations(mm, gid)), + notes = _sbml_export_notes(gene_notes(mm, gid)), + annotation = _sbml_export_annotation(gene_annotations(mm, gid)), ) for gid in genes(mm) ), - Dict(), # function definitions + objective = Dict( + rid => oc for (rid, oc) in zip(rxns, objective(mm)) if oc != 0 + ), ), ) end From 9629381a2710e3c93cff381d195a301406593c69 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Tue, 4 Jan 2022 12:27:56 +0100 Subject: [PATCH 3/8] temporarily allow the failure of mac tests --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eb252b24f..bec11dc77 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -133,6 +133,7 @@ windows10:julia1.7: mac:julia1.7: stage: test-compat + allow_failure: true <<: *global_trigger_compat_tests <<: *global_julia17 <<: *global_env_mac @@ -151,6 +152,7 @@ windows10:julia1.6: mac:julia1.6: stage: test-compat + allow_failure: true <<: *global_trigger_compat_tests <<: *global_julia16 <<: *global_env_mac From 462538fc28fbbec09cecc12c70382b5b5a342db9 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Thu, 6 Jan 2022 12:12:29 +0100 Subject: [PATCH 4/8] Revert "Merge pull request #544 from LCSB-BioCore/mk-sbml-091" This reverts commit 553ed70ce59374cb778aa4410b80ceb7ba10467c, reversing changes made to 39f8d880a6552b0d4d9034561d4e10283058bedc. --- .gitlab-ci.yml | 2 -- Project.toml | 2 +- src/base/types/SBMLModel.jl | 61 ++++++++++++++++++++++--------------- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bec11dc77..eb252b24f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -133,7 +133,6 @@ windows10:julia1.7: mac:julia1.7: stage: test-compat - allow_failure: true <<: *global_trigger_compat_tests <<: *global_julia17 <<: *global_env_mac @@ -152,7 +151,6 @@ windows10:julia1.6: mac:julia1.6: stage: test-compat - allow_failure: true <<: *global_trigger_compat_tests <<: *global_julia16 <<: *global_env_mac diff --git a/Project.toml b/Project.toml index 834a1303d..ea8b02ed3 100644 --- a/Project.toml +++ b/Project.toml @@ -28,7 +28,7 @@ MAT = "0.10" MacroTools = "0.5.6" OSQP = "0.6" OrderedCollections = "1.4" -SBML = "0.9.1" +SBML = "0.7, 0.8.2" StableRNGs = "1.0" Tulip = "0.7" julia = "1.5" diff --git a/src/base/types/SBMLModel.jl b/src/base/types/SBMLModel.jl index 2d183a9a9..da9115233 100644 --- a/src/base/types/SBMLModel.jl +++ b/src/base/types/SBMLModel.jl @@ -165,54 +165,65 @@ function Base.convert(::Type{SBMLModel}, mm::MetabolicModel) rxns = reactions(mm) stoi = stoichiometry(mm) (lbs, ubs) = bounds(mm) + ocs = objective(mm) comps = _default.("", metabolite_compartment.(Ref(mm), mets)) compss = Set(comps) return SBMLModel( SBML.Model( - units = Dict("" => []), # units - compartments = Dict(comp => SBML.Compartment() for comp in compss), - species = Dict( + Dict(), # parameters + Dict("" => 1), # units + Dict( + comp => + SBML.Compartment(nothing, nothing, nothing, nothing, nothing, nothing) + for comp in compss + ), + Dict( mid => SBML.Species( - compartment = _default("", comps[mi]), # compartment - formula = metabolite_formula(mm, mid), - charge = metabolite_charge(mm, mid), - notes = _sbml_export_notes(metabolite_notes(mm, mid)), - annotation = _sbml_export_annotation(metabolite_annotations(mm, mid)), + nothing, # name + _default("", comps[mi]), # compartment + nothing, # no information about boundary conditions + metabolite_formula(mm, mid), + metabolite_charge(mm, mid), + nothing, # initial amount + nothing, # initial concentration + nothing, # only substance unit flags + _sbml_export_notes(metabolite_notes(mm, mid)), + _sbml_export_annotation(metabolite_annotations(mm, mid)), ) for (mi, mid) in enumerate(mets) ), - reactions = Dict( + Dict( rid => SBML.Reaction( - reactants = Dict( + Dict( mets[i] => -stoi[i, ri] for i in SparseArrays.nonzeroinds(stoi[:, ri]) if stoi[i, ri] <= 0 ), - products = Dict( + Dict( mets[i] => stoi[i, ri] for i in SparseArrays.nonzeroinds(stoi[:, ri]) if stoi[i, ri] > 0 ), - kinetic_parameters = Dict( - "LOWER_BOUND" => (lbs[ri], ""), - "UPPER_BOUND" => (ubs[ri], ""), - ), - gene_product_association = _maybemap( + (lbs[ri], ""), + (ubs[ri], ""), + ocs[ri], + _maybemap( x -> _unparse_grr(SBML.GeneProductAssociation, x), reaction_gene_association(mm, rid), ), - reversible = true, - notes = _sbml_export_notes(reaction_notes(mm, rid)), - annotation = _sbml_export_annotation(reaction_annotations(mm, rid)), + nothing, # no kinetic math + true, # reversible by default + _sbml_export_notes(reaction_notes(mm, rid)), + _sbml_export_annotation(reaction_annotations(mm, rid)), ) for (ri, rid) in enumerate(rxns) ), - gene_products = Dict( + Dict( gid => SBML.GeneProduct( - notes = _sbml_export_notes(gene_notes(mm, gid)), - annotation = _sbml_export_annotation(gene_annotations(mm, gid)), + nothing, + nothing, + _sbml_export_notes(gene_notes(mm, gid)), + _sbml_export_annotation(gene_annotations(mm, gid)), ) for gid in genes(mm) ), - objective = Dict( - rid => oc for (rid, oc) in zip(rxns, objective(mm)) if oc != 0 - ), + Dict(), # function definitions ), ) end From 871a62d4e7df5ea95e53605fc89653bd6f3e079a Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Mon, 2 May 2022 09:38:31 +0200 Subject: [PATCH 5/8] extract metabolite compartments from SBML --- src/base/types/SBMLModel.jl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/base/types/SBMLModel.jl b/src/base/types/SBMLModel.jl index 33f9a7fd5..ef0e508a6 100644 --- a/src/base/types/SBMLModel.jl +++ b/src/base/types/SBMLModel.jl @@ -114,6 +114,13 @@ Get [`MetaboliteFormula`](@ref) from a chosen metabolite from [`SBMLModel`](@ref metabolite_formula(model::SBMLModel, mid::String)::Maybe{MetaboliteFormula} = _maybemap(_parse_formula, model.sbml.species[mid].formula) +""" + metabolite_compartment(model::SBMLModel, mid::String)::Maybe{String} + +Get the compartment of a chosen metabolite from [`SBMLModel`](@ref). +""" +metabolite_compartment(model::SBMLModel, mid::String) = model.sbml.species[mid].compartment + """ metabolite_charge(model::SBMLModel, mid::String)::Maybe{Int} From 4bccc3be63111240bd05e5786489151166ff77ec Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Mon, 2 May 2022 09:50:09 +0200 Subject: [PATCH 6/8] MATModel should return integer metabolite charges --- src/base/types/MATModel.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/base/types/MATModel.jl b/src/base/types/MATModel.jl index 09200476d..aa0fb7ff3 100644 --- a/src/base/types/MATModel.jl +++ b/src/base/types/MATModel.jl @@ -148,16 +148,16 @@ metabolite_formula(m::MATModel, mid::String) = _maybemap( ) """ - metabolite_charge(m::MATModel, mid::String) + metabolite_charge(m::MATModel, mid::String)::Maybe{Int} Extract metabolite charge from `metCharge` or `metCharges`. """ -function metabolite_charge(m::MATModel, mid::String) +function metabolite_charge(m::MATModel, mid::String)::Maybe{Int} met_charge = _maybemap( x -> x[findfirst(==(mid), metabolites(m))], gets(m.mat, nothing, _constants.keynames.metcharges), ) - isnan(met_charge) ? 0 : met_charge + _maybemap(Int, isnan(met_charge) ? nothing : met_charge) end """ From 111073d6a941f2f1c09b9be9cde097a58f5b9f53 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Mon, 2 May 2022 10:18:14 +0200 Subject: [PATCH 7/8] MATModel: add a few new names for the compartment ID vector Expectably Yeast-GEM will use these, see: https://github.com/SysBioChalmers/yeast-GEM/pull/301 --- src/base/constants.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/constants.jl b/src/base/constants.jl index 56c8b36f2..3a752c11c 100644 --- a/src/base/constants.jl +++ b/src/base/constants.jl @@ -26,7 +26,7 @@ const _constants = ( ids = ["id", "description"], metformulas = ["metFormula", "metFormulas"], metcharges = ["metCharge", "metCharges"], - metcompartments = ["metCompartment", "metCompartments"], + metcompartments = ["metCompartment", "metCompartments", "metComp", "metComps"], rxnnames = ["rxnNames"], metnames = ["metNames"], ), From 796ade395022ea86a80a0f5c6b70c7cfa1bb1d2f Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Mon, 29 Aug 2022 08:44:19 +0200 Subject: [PATCH 8/8] bump CompatHelper version to work with 1.8 --- .github/workflows/CompatHelper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CompatHelper.yml b/.github/workflows/CompatHelper.yml index 840ac361c..369f4b915 100644 --- a/.github/workflows/CompatHelper.yml +++ b/.github/workflows/CompatHelper.yml @@ -12,7 +12,7 @@ jobs: import Pkg name = "CompatHelper" uuid = "aa819f21-2bde-4658-8897-bab36330d9b7" - version = "2" + version = "3" Pkg.add(; name, uuid, version) shell: julia --color=yes {0} - name: "Run CompatHelper"