"""Example creating minimal model.
This demonstrates just the very core SBML functionality.
"""
from pathlib import Path
import libsbml
from sbmlutils.cytoscape import visualize_sbml
from sbmlutils.examples import templates
from sbmlutils.factory import *
from sbmlutils.metadata import *
from sbmlutils.resources import EXAMPLES_DIR
[docs]class U(Units):
"""UnitDefinitions."""
[docs] min = UnitDefinition("min")
[docs] mmole = UnitDefinition("mmole")
[docs] m2 = UnitDefinition("m2", "meter^2")
[docs] mM = UnitDefinition("mM", "mmole/liter")
[docs] mmole_per_min = UnitDefinition("mmole_per_min", "mmole/min")
[docs] l_per_min = UnitDefinition("l_per_min", "l/min")
[docs]model = Model(
sid="model",
packages=[Package.DISTRIB, Package.FBC_V2],
notes="""
# Complete model
Example demonstrating more complete information in SBML model.
Showcasing combination of multiple features.
"""
+ templates.terms_of_use,
creators=templates.creators,
units=U,
model_units=ModelUnits(
time=U.min,
extent=U.mmole,
substance=U.mmole,
length=U.meter,
area=U.m2,
volume=U.liter,
),
)
model.compartments = [
Compartment(
sid="cell",
metaId="meta_cell",
value=1.0,
# unit support
unit=U.liter,
spatialDimensions=3,
constant=True,
# annotation and sbo support
sboTerm=SBO.PHYSICAL_COMPARTMENT,
annotations=[(BQB.IS, "ncit/C48694")],
# provenance via notes
notes="""
Overall cell compartment with volume set to an arbitrary value of 1.0.
""",
# uncertainties
uncertainties=[
Uncertainty(
formula="normal(1.0, 0.1)",
uncertParameters=[
UncertParameter(type=libsbml.DISTRIB_UNCERTTYPE_MEAN, value=1.0),
UncertParameter(
type=libsbml.DISTRIB_UNCERTTYPE_STANDARDDEVIATION, value=0.1
),
],
uncertSpans=[
UncertSpan(
type=libsbml.DISTRIB_UNCERTTYPE_RANGE,
valueLower=0.2,
valueUpper=3.0,
),
],
)
],
),
]
model.species = [
Species(
sid="S1",
metaId="meta_S1",
name="glucose",
compartment="cell",
# clean handling of amounts vs. concentrations
initialConcentration=10.0,
substanceUnit=U.mmole,
hasOnlySubstanceUnits=False,
# additional information via FBC
sboTerm=SBO.SIMPLE_CHEMICAL,
chemicalFormula="C6H12O6",
charge=0,
annotations=[
(BQB.IS, "chebi/CHEBI:4167"),
(BQB.IS, "inchikey/WQZGKKKJIJFFOK-GASJEMHNSA-N"),
],
notes="Species represents D-glucopyranose.",
),
Species(
sid="S2",
metaId="meta_S2",
name="glucose 6-phosphate",
initialConcentration=10.0,
compartment="cell",
substanceUnit=U.mmole,
hasOnlySubstanceUnits=False,
sboTerm=SBO.SIMPLE_CHEMICAL,
chemicalFormula="C6H11O9P",
charge=0,
annotations=[(BQB.IS, "chebi/CHEBI:58225")],
),
]
model.parameters = [
Parameter(
sid="k1",
value=0.1,
constant=True,
unit=U.l_per_min,
sboTerm=SBO.KINETIC_CONSTANT,
),
]
model.reactions = [
Reaction(
sid="J0",
name="hexokinase",
equation="S1 -> S2",
# reactions should have compartment set for layouts
compartment="cell",
formula=("k1 * S1", U.mmole_per_min), # [liter/min]* [mmole/liter]
pars=[
Parameter(
sid="J0_lb",
value=0.0,
constant=True,
unit=U.mmole_per_min,
name="lower flux bound J0",
),
Parameter(
sid="J0_ub",
value=1000.0,
constant=True,
unit=U.mmole_per_min,
name="upper flux bound J0",
),
],
# additional fbc information (here used for constraint testing)
lowerFluxBound="J0_lb",
upperFluxBound="J0_ub",
notes="Simplified hexokinase reaction ignoring ATP, ADP cofactors."
"Reaction is not mass and charge balanced.",
annotations=[(BQB.IS, "uniprot/P17710")],
),
]
model.constraints = [
Constraint("J0_lb_constraint", math="J0 >= J0_lb"),
Constraint("J0_ub_constraint", math="J0 >= J0_ub"),
]
if __name__ == "__main__":
[docs] fac_result: FactoryResult = create_model(
model=model, filepath=EXAMPLES_DIR / f"{model.sid}.xml"
)
visualize_sbml(sbml_path=fac_result.sbml_path)