Skip to content

Flag to drop units #166

@oxinabox

Description

@oxinabox

Is your feature request related to a problem? Please describe.
I am trying to import a SMBL file.
In particular this one

When I do so i get an error:

julia> using OrdinaryDiffEq
       using SBMLToolkit

julia> 
       odesys = readSBML(model_file(), ODESystemImporter())
┌ Error: SBML reported error: The units of the 'math' formula in a <kineticLaw> definition are expected to be the equivalent of _substance per time_.
│  Expected units are mole (exponent = 1, multiplier = 1, scale = -3), second (exponent = -1, multiplier = 1, scale = 0) but the units returned by the <math> expression in the <kineticLaw> (from the <reaction> with id 'vENO') are second (exponent = -1, multiplier = 1, scale = 0), litre (exponent = 1, multiplier = 1, scale = 0).
└ @ SBML ~/.julia/packages/SBML/9eaHi/src/utils.jl:390
┌ Error: SBML reported error: The units of the 'math' formula in a <kineticLaw> definition are expected to be the equivalent of _substance per time_.
│  Expected units are mole (exponent = 1, multiplier = 1, scale = -3), second (exponent = -1, multiplier = 1, scale = 0) but the units returned by the <math> expression in the <kineticLaw> (from the <reaction> with id 'vDAHPS') are mole (exponent = -4.29497e+09, multiplier = 0, scale = 0), second (exponent = -1, multiplier = 1, scale = 0), litre (exponent = -4.29497e+09, multiplier = 1, scale = 0).
└ @ SBML ~/.julia/packages/SBML/9eaHi/src/utils.jl:390
┌ Error: SBML reported error: The units of the 'math' formula in a <kineticLaw> definition are expected to be the equivalent of _substance per time_.
│  Expected units are mole (exponent = 1, multiplier = 1, scale = -3), second (exponent = -1, multiplier = 1, scale = 0) but the units returned by the <math> expression in the <kineticLaw> (from the <reaction> with id 'vPDH') are mole (exponent = -2.14748e+09, multiplier = 0, scale = 0), second (exponent = -1, multiplier = 1, scale = 0), litre (exponent = nan, multiplier = 1, scale = 0).
└ @ SBML ~/.julia/packages/SBML/9eaHi/src/utils.jl:390
ERROR: Setting of level and version did not succeed
Stacktrace:
  [1] get_error_messages(doc::Ptr{…}, error::ErrorException, report_severities::Vector{…}, throw_severities::Vector{…})
    @ SBML ~/.julia/packages/SBML/9eaHi/src/utils.jl:399
  [2] check_errors
    @ ~/.julia/packages/SBML/9eaHi/src/utils.jl:412 [inlined]
  [3] (::SBML.var"#16#17"{Int64, Int64, Vector{String}, Vector{String}})(doc::Ptr{Nothing})
    @ SBML ~/.julia/packages/SBML/9eaHi/src/converters.jl:15
  [4] #50
    @ ~/.julia/packages/SBMLToolkit/LdVcf/src/utils.jl:101 [inlined]
  [5] _readSBML(symbol::Symbol, fn::String, sbml_conversion::SBMLToolkit.var"#50#51", report_severities::Vector{…}, throw_severities::Vector{…})
    @ SBML ~/.julia/packages/SBML/9eaHi/src/readsbml.jl:183
  [6] readSBML(fn::String, sbml_conversion::Function; report_severities::Vector{String}, throw_severities::Vector{String})
    @ SBML ~/.julia/packages/SBML/9eaHi/src/readsbml.jl:229
  [7] readSBML(fn::String, sbml_conversion::Function)
    @ SBML ~/.julia/packages/SBML/9eaHi/src/readsbml.jl:222
  [8] readSBML
    @ ~/.julia/packages/SBMLToolkit/LdVcf/src/systems.jl:19 [inlined]
  [9] #readSBML#1
    @ ~/.julia/packages/SBMLToolkit/LdVcf/src/systems.jl:30 [inlined]
 [10] readSBML
    @ ~/.julia/packages/SBMLToolkit/LdVcf/src/systems.jl:29 [inlined]
 [11] readSBML(sbmlfile::String, ::ODESystemImporter; include_zero_odes::Bool, kwargs::@Kwargs{})
    @ SBMLToolkit ~/.julia/packages/SBMLToolkit/LdVcf/src/systems.jl:42
 [12] readSBML(sbmlfile::String, ::ODESystemImporter)
    @ SBMLToolkit ~/.julia/packages/SBMLToolkit/LdVcf/src/systems.jl:40
 [13] top-level scope
    @ ~/repos/POC_kinetic/test/script.jl:5
Some type information was truncated. Use `show(err)` to see complete types.

Now I know that that file is internally consistent enough to be workable.
because it works with MEWpy's load_ODEModel.
Which I suspect just discards unit information.

The file quiet likely is a bit messed up.
Most bio data is a mess after all

Describe the solution you’d like

I would like a flag to discard units.
readSBML(file, ODESystemImporter; discard_units=true)

Describe alternatives
We could instead have flag that controls if bad units gives an error, or warns and then falls back to no units, or silently falls back to no units.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions