"""Helper functions for working with FBC and cobrapy models."""
import warnings
import libsbml
from sbmlutils import log
[docs]logger = log.get_logger(__name__)
[docs]def set_flux_bounds(reaction: libsbml.Reaction, lb: float, ub: float) -> None:
"""Set flux bounds on given reaction."""
rplugin = reaction.getPlugin("fbc")
rplugin.setLowerFluxBound(lb)
rplugin.setUpperFluxBound(ub)
[docs]def add_default_flux_bounds(
doc: libsbml.SBMLDocument, lower: float = -100.0, upper: float = 100.0
) -> None:
"""Add default flux bounds to SBMLDocument.
:param doc: SBMLDocument
:param lower: lower flux bound
:param upper: upper flux bound
:return:
"""
model = doc.getModel()
def create_bound(sid: str, value: float) -> libsbml.Parameter:
"""Create flux bound parameter with given value.
:param sid: id of parameter
:param value: flux bound
:return:
"""
p = model.createParameter()
p.setId(sid)
p.setValue(value)
p.setName(f"{sid} flux bound")
p.setSBOTerm("SBO:0000626") # default flux bound
p.setConstant(True)
return p
# FIXME: overwrites lower/upper parameter (you should check if existing in model)
create_bound(sid="lower", value=lower)
create_bound(sid="upper", value=upper)
for r in model.reactions:
rfbc = r.getPlugin("fbc")
if not rfbc.isSetLowerFluxBound():
rfbc.setLowerFluxBound("lower")
if not rfbc.isSetUpperFluxBound():
rfbc.setUpperFluxBound("upper")
[docs]def set_boundary_conditions_false(doc: libsbml.SBMLDocument) -> None:
"""Set all boundaryConditions to False in the model."""
model = doc.getModel()
for s in model.species:
if s.boundary_condition:
warnings.warn(f"boundaryCondition changed {s}", UserWarning)
s.setBoundaryCondition(False)