Esempio n. 1
0
 def get_unit_string(unit):
     if isinstance(unit, Unit):
         return unit.sid
     elif isinstance(unit, int):
         # libsbml unit
         return libsbml.UnitKind_toString(unit)
     if isinstance(unit, str):
         if unit == '-':
             return libsbml.UnitKind_toString(libsbml.UNIT_KIND_DIMENSIONLESS)
         else:
             return unit
     else:
         return None
Esempio n. 2
0
def unitDefinitionToString(udef):
    """Formating of units.
    Units have the general format
        (multiplier * 10^scale *ukind)^exponent
        (m * 10^s *k)^e

    """
    if udef is None:
        return "None"

    libsbml.UnitDefinition_reorder(udef)
    # collect formated nominators and denominators
    nom = []
    denom = []
    for u in udef.getListOfUnits():
        m = u.getMultiplier()
        s = u.getScale()
        e = u.getExponent()
        k = libsbml.UnitKind_toString(u.getKind())

        # get better name for unit
        k_str = UNIT_ABBREVIATIONS.get(k, k)

        # (m * 10^s *k)^e

        # handle m
        if _isclose(m, 1.0):
            m_str = ""
        else:
            m_str = str(m) + "*"

        if _isclose(abs(e), 1.0):
            e_str = ""
        else:
            e_str = "^" + str(abs(e))

        if _isclose(s, 0.0):
            string = "{}{}{}".format(m_str, k_str, e_str)
        else:
            if e_str == "":
                string = "({}10^{})*{}".format(m_str, s, k_str)
            else:
                string = "(({}10^{})*{}){}".format(m_str, s, k_str, e_str)

        # collect the terms
        if e >= 0.0:
            nom.append(string)
        else:
            denom.append(string)

    nom_str = " * ".join(nom)
    denom_str = " * ".join(denom)
    if (len(nom_str) > 0) and (len(denom_str) > 0):
        return "({})/({})".format(nom_str, denom_str)
    if (len(nom_str) > 0) and (len(denom_str) == 0):
        return nom_str
    if (len(nom_str) == 0) and (len(denom_str) > 0):
        return "1/({})".format(denom_str)
    return ""
Esempio n. 3
0
def _create_parameter(pid: str, model: libsbml.Model) -> libsbml.Parameter:
    p: libsbml.Parameter = model.createParameter()
    p.setId(pid)
    p.setValue(1.0)
    p.setConstant(False)
    unit = libsbml.UnitKind_toString(libsbml.UNIT_KIND_MOLE)
    p.setUnits(unit)
    return p
Esempio n. 4
0
def getUnitDefinition(aSBMLmodel):
    " [[ Id , Name , [[ Kind , Exponent , Scale , Multiplier , Offset ]] ]] "
    LIST = []
    if aSBMLmodel.getUnitDefinition(0):
        NumUnitDefinition = aSBMLmodel.getNumUnitDefinitions()
        for Num1 in range(NumUnitDefinition):
            ListOfUnitDefinition = []

            anUnitDefinition = aSBMLmodel.getUnitDefinition(Num1)

            anId = anUnitDefinition.getId()
            aName = anUnitDefinition.getName()

            ListOfUnits = []
            if anUnitDefinition.getUnit(0):
                NumUnit = anUnitDefinition.getNumUnits()
                for Num2 in range(NumUnit):
                    ListOfUnit = []
                    anUnit = anUnitDefinition.getUnit(Num2)

                    anUnitKind = anUnit.getKind()

                    aKind = libsbml.UnitKind_toString(anUnitKind)
                    anExponent = anUnit.getExponent()
                    aScale = anUnit.getScale()
                    aMultiplier = anUnit.getMultiplier()
                    anOffset = anUnit.getOffset()

                    ListOfUnit.append(aKind)
                    ListOfUnit.append(anExponent)
                    ListOfUnit.append(aScale)
                    ListOfUnit.append(aMultiplier)
                    ListOfUnit.append(anOffset)

                    ListOfUnits.append(ListOfUnit)

            ListOfUnitDefinition.append(anId)
            ListOfUnitDefinition.append(aName)
            ListOfUnitDefinition.append(ListOfUnits)

            LIST.append(ListOfUnitDefinition)

    return LIST
Esempio n. 5
0
def uncertainty() -> libsbml.SBMLDocument:
    """Create uncertainty with UncertParameter."""
    doc: libsbml.SBMLDocument = _distrib_doc()
    model: libsbml.Model = doc.createModel()

    # parameter
    p: libsbml.Parameter = _create_parameter("p1", model=model)
    p_distrib: libsbml.DistribSBasePlugin = p.getPlugin("distrib")

    # --------------------------------------------
    # Build generic uncertainty for parameter
    # --------------------------------------------
    # 5.0 (mean) +- 0.3 (std) [2.0 - 8.0]

    uncertainty: libsbml.Uncertainty = p_distrib.createUncertainty()
    uncertainty.setName("Basic example: 5.0 +- 0.3 [2.0 - 8.0]")
    unit = libsbml.UnitKind_toString(libsbml.UNIT_KIND_MOLE)
    up_mean: libsbml.UncertParameter = uncertainty.createUncertParameter()
    up_mean.setType(libsbml.DISTRIB_UNCERTTYPE_MEAN)
    up_mean.setValue(5.0)
    up_mean.setUnits(unit)

    up_sd: libsbml.UncertParameter = uncertainty.createUncertParameter()
    up_sd.setType(libsbml.DISTRIB_UNCERTTYPE_STANDARDDEVIATION)
    up_sd.setValue(0.3)
    up_sd.setUnits(unit)

    up_range = libsbml.UncertSpan()
    up_range.setType(libsbml.DISTRIB_UNCERTTYPE_RANGE)
    up_range.setValueLower(2.0)
    up_range.setValueUpper(8.0)
    up_range.setUnits(unit)
    check(uncertainty.addUncertParameter(up_range), "add the span")

    check(
        uncertainty.setAnnotation(
            """
    <body xmlns='http://www.w3.org/1999/xhtml'>
        <p>Experimental data from study</p>
    </body>
    """
        ),
        "set annotations",
    )

    # add an annotation with SBO terms
    uncertainty.setMetaId("meta_uncertainty1")
    cv1 = libsbml.CVTerm()
    cv1.setQualifierType(libsbml.BIOLOGICAL_QUALIFIER)
    cv1.setBiologicalQualifierType(6)  # "BQB_IS_DESCRIBED_BY"
    cv1.addResource("https://identifiers.org/pubmed/123456")
    check(uncertainty.addCVTerm(cv1), "add cv term")

    cv2 = libsbml.CVTerm()
    cv2.setQualifierType(libsbml.BIOLOGICAL_QUALIFIER)
    cv2.setBiologicalQualifierType(10)  # "BQB_HAS_PROPERTY"
    cv2.addResource("http://purl.obolibrary.org/obo/ECO_0006016")
    check(uncertainty.addCVTerm(cv2), "add cv term")

    # --------------------------------------------
    # Set of all UncertParameters
    # --------------------------------------------
    # create second uncertainty which contains all the individual uncertainties
    uncertainty = p_distrib.createUncertainty()
    uncertainty.setName("UncertParameter example")
    for k, parameter_type in enumerate(
        [
            libsbml.DISTRIB_UNCERTTYPE_COEFFIENTOFVARIATION,
            libsbml.DISTRIB_UNCERTTYPE_KURTOSIS,
            libsbml.DISTRIB_UNCERTTYPE_MEAN,
            libsbml.DISTRIB_UNCERTTYPE_MEDIAN,
            libsbml.DISTRIB_UNCERTTYPE_MODE,
            libsbml.DISTRIB_UNCERTTYPE_SAMPLESIZE,
            libsbml.DISTRIB_UNCERTTYPE_SKEWNESS,
            libsbml.DISTRIB_UNCERTTYPE_STANDARDDEVIATION,
            libsbml.DISTRIB_UNCERTTYPE_STANDARDERROR,
            libsbml.DISTRIB_UNCERTTYPE_VARIANCE,
        ]
    ):

        up: libsbml.UncertParameter = uncertainty.createUncertParameter()
        up.setType(parameter_type)
        up.setValue(k)
        up.setUnits(unit)

    # --------------------------------------------
    # Set of all UncertSpans
    # --------------------------------------------
    uncertainty = p_distrib.createUncertainty()
    uncertainty.setName("UncertSpan example")
    for k, parameter_type in enumerate(
        [
            libsbml.DISTRIB_UNCERTTYPE_CONFIDENCEINTERVAL,
            libsbml.DISTRIB_UNCERTTYPE_CREDIBLEINTERVAL,
            libsbml.DISTRIB_UNCERTTYPE_INTERQUARTILERANGE,
            libsbml.DISTRIB_UNCERTTYPE_RANGE,
        ]
    ):

        up_range = libsbml.UncertSpan()
        up_range.setType(parameter_type)
        up_range.setValueLower(k - 1.0)
        up_range.setValueUpper(k + 1.0)
        up_range.setUnits(unit)
        check(uncertainty.addUncertParameter(up_range), "add the span")

    # --------------------------------------------
    # Use math for distribution definition
    # --------------------------------------------
    # 5.0 dimensionless * normal(1.0 mole, 3.0 mole)
    uncertainty = p_distrib.createUncertainty()
    uncertainty.setName("math example: 5.0 dimensionless * normal(1.0 mole, 3.0 mole)")
    up = uncertainty.createUncertParameter()
    up.setType(libsbml.DISTRIB_UNCERTTYPE_DISTRIBUTION)
    up.setDefinitionURL("http://www.sbml.org/sbml/symbols/distrib/normal")
    ast = libsbml.parseL3FormulaWithModel(
        "5.0 dimensionless * normal(1.0 mole, 3.0 mole)", model
    )
    if not ast:
        raise ValueError
    up.setMath(ast)

    # --------------------------------------------
    # Use externalParameter
    # --------------------------------------------
    # https://sites.google.com/site/probonto/
    uncertainty = p_distrib.createUncertainty()
    uncertainty.setName("ExternalParameter example")
    up = uncertainty.createUncertParameter()
    up.setType(libsbml.DISTRIB_UNCERTTYPE_EXTERNALPARAMETER)
    up.setName("skewness")
    up.setValue(0.25)
    up.setUnits(unit)
    up.setDefinitionURL("http://purl.obolibrary.org/obo/STATO_0000068")

    # --------------------------------------------
    # Use external distribution definition
    # --------------------------------------------
    uncertainty = p_distrib.createUncertainty()
    uncertainty.setName("External distribution example")
    up = uncertainty.createUncertParameter()
    up.setType(libsbml.DISTRIB_UNCERTTYPE_DISTRIBUTION)
    up.setName("Geometric 1")
    up.setDefinitionURL("http://www.probonto.org/ontology#PROB_k0000782")
    up.setUnits(unit)

    # success probability of Geometric-1
    up_mean_geo1 = up.createUncertParameter()
    up_mean_geo1.setType(libsbml.DISTRIB_UNCERTTYPE_EXTERNALPARAMETER)
    up_mean_geo1.setName("success probability of Geometric 1")
    up_mean_geo1.setValue(0.4)
    up_mean_geo1.setDefinitionURL("http://www.probonto.org/ontology#PROB_k0000789")

    return doc
Esempio n. 6
0
def unitDefinitionToString(udef: libsbml.UnitDefinition) -> str:
    """Render formatted string for units.

    Units have the general format
        (multiplier * 10^scale *ukind)^exponent
        (m * 10^s *k)^e

    :param udef: unit definition which is to be converted to string
    """
    if udef is None:
        return "None"

    libsbml.UnitDefinition_reorder(udef)
    # collect formated nominators and denominators
    nom = []
    denom = []
    for u in udef.getListOfUnits():
        m = u.getMultiplier()
        s = u.getScale()
        e = u.getExponent()
        k = libsbml.UnitKind_toString(u.getKind())

        # get better name for unit
        k_str = UNIT_ABBREVIATIONS.get(k, k)

        # (m * 10^s *k)^e

        # handle m
        if _isclose(m, 1.0):
            m_str = ""
        else:
            m_str = str(m) + "*"

        if _isclose(abs(e), 1.0):
            e_str = ""
        else:
            e_str = "^" + str(abs(e))

        if _isclose(s, 0.0):
            string = f"{m_str}{k_str}{e_str}"
        else:
            if e_str == "":
                string = f"({m_str}10^{s})*{k_str}"
            else:
                string = f"(({m_str}10^{s})*{k_str}){e_str}"

        # collect the terms
        if e >= 0.0:
            nom.append(string)
        else:
            denom.append(string)

    nom_str = " * ".join(nom)
    denom_str = " * ".join(denom)
    if (len(nom_str) > 0) and (len(denom_str) > 0):
        return f"({nom_str})/({denom_str})"
    if (len(nom_str) > 0) and (len(denom_str) == 0):
        return nom_str
    if (len(nom_str) == 0) and (len(denom_str) > 0):
        return f"1/({denom_str})"
    return ""
Esempio n. 7
0
    def parseStream(self, outS):
        """parseStream(outStream)
parses SBML model and writes SBML-shorthand to outStream"""
        outS.write('@model:')
        outS.write(str(self.d.getLevel()) + '.')
        outS.write(str(self.d.getVersion()) + '.')
        self.mangle = 10 * self.d.getLevel() + self.d.getVersion()
        outS.write('0=' + self.m.getId())
        if (self.m.getName() != ""):
            outS.write(' "' + self.m.getName() + '"')
        outS.write('\n')
        # level 3 global units...
        if (self.mangle >= 30):
            first = True
            if self.m.isSetSubstanceUnits():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('s=' + str(self.m.getSubstanceUnits()))
            if self.m.isSetTimeUnits():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('t=' + str(self.m.getTimeUnits()))
            if self.m.isSetVolumeUnits():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('v=' + str(self.m.getVolumeUnits()))
            if self.m.isSetAreaUnits():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('a=' + str(self.m.getAreaUnits()))
            if self.m.isSetLengthUnits():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('l=' + str(self.m.getLengthUnits()))
            if self.m.isSetExtentUnits():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('e=' + str(self.m.getExtentUnits()))
            if self.m.isSetConversionFactor():
                if first == True:
                    outS.write(' ')
                    first = False
                else:
                    outS.write(',')
                outS.write('c=' + str(self.m.getConversionFactor()))
            if (first == False):
                outS.write('\n')
        n = self.m.getNumUnitDefinitions()
        if (n > 0):
            outS.write('@units\n')
            for i in range(n):
                ud = self.m.getUnitDefinition(i)
                outS.write(' ' + ud.getId())
                for j in range(ud.getNumUnits()):
                    if (j == 0):
                        outS.write('=')
                    else:
                        outS.write('; ')
                    u = ud.getUnit(j)
                    kind = u.getKind()
                    outS.write(libsbml.UnitKind_toString(kind))
                    e = u.getExponent()
                    m = u.getMultiplier()
                    o = u.getOffset()
                    s = u.getScale()
                    first = True
                    if (e != 1):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('e=' + str(e))
                    if (m != 1):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('m=' + str(m))
                    if (o != 0):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('o=' + str(o))
                    if (s != 0):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('s=' + str(s))
                if (ud.isSetName()):
                    outS.write(' "' + ud.getName() + '"')
                outS.write('\n')
        if self.m.getNumCompartments():
            outS.write('@compartments\n')
            for c in self.m.getListOfCompartments():
                outS.write(' ' + c.getId())
                if (c.isSetOutside()):
                    outS.write('<' + c.getOutside())
                if (c.isSetSize()):
                    outS.write('=' + str(c.getSize()))
                if (c.isSetName()):
                    outS.write(' "' + c.getName() + '"')
                outS.write('\n')
        if self.m.getNumSpecies():
            outS.write('@species\n')
            for s in self.m.getListOfSpecies():
                outS.write(' ' + s.getCompartment() + ':')
                if (s.isSetInitialConcentration()):
                    outS.write('[' + s.getId() + ']=' +
                               str(s.getInitialConcentration()))
                elif (s.isSetInitialAmount()):
                    outS.write(s.getId() + '=' + str(s.getInitialAmount()))
                else:
                    outS.write('[' + s.getId() + ']=' +
                               str(s.getInitialConcentration()))
                if (s.getHasOnlySubstanceUnits()):
                    outS.write('s')
                if (s.getBoundaryCondition()):
                    outS.write('b')
                if (s.getConstant()):
                    outS.write('c')
                if (s.isSetName()):
                    outS.write(' "' + s.getName() + '"')
                outS.write('\n')
        if self.m.getNumParameters():
            outS.write('@parameters\n')
            for p in self.m.getListOfParameters():
                outS.write(' ' + p.getId() + '=')
                outS.write(str(p.getValue()))
                c = p.getConstant()
                if (c != 1):
                    outS.write('v')
                if (p.isSetName()):
                    outS.write(' "' + p.getName() + '"')
                outS.write('\n')
        if self.m.getNumRules():
            outS.write('@rules\n')
            for r in self.m.getListOfRules():
                if (r.isAssignment()):
                    outS.write(' ' + r.getVariable() + ' = ' + r.getFormula())
                    outS.write('\n')
                elif (r.isRate()):
                    outS.write(' @rate:' + r.getVariable() + ' = ' +
                               r.getFormula())
                    outS.write('\n')
                else:
                    # probably an algebraic rule!
                    sys.stderr.write("Unsupported rule type\n")
                    raise (ParseError)
        if self.m.getNumReactions():
            outS.write('@reactions\n')
            for r in self.m.getListOfReactions():
                if (r.getReversible()):
                    outS.write('@rr=')
                else:
                    outS.write('@r=')
                outS.write(r.getId())
                if (r.isSetName()):
                    outS.write(' "' + r.getName() + '"')
                outS.write('\n ')
                for j in range(r.getNumReactants()):
                    sr = r.getReactant(j)
                    if (j > 0):
                        outS.write('+')
                    sto = sr.getStoichiometry()
                    if (sto != 1):
                        outS.write(str(int(sto)))
                    outS.write(sr.getSpecies())
                outS.write(' -> ')
                for j in range(r.getNumProducts()):
                    sr = r.getProduct(j)
                    if (j > 0):
                        outS.write('+')
                    sto = sr.getStoichiometry()
                    if (sto != 1):
                        outS.write(str(int(sto)))
                    outS.write(sr.getSpecies())
                for j in range(r.getNumModifiers()):
                    sr = r.getModifier(j)
                    if (j == 0):
                        outS.write(' : ')
                        outS.write(sr.getSpecies())
                    else:
                        outS.write(', ')
                        outS.write(sr.getSpecies())
                outS.write('\n')
                if (r.isSetKineticLaw()):
                    kl = r.getKineticLaw()
                    outS.write(' ' + kl.getFormula())
                    for k in range(kl.getNumParameters()):
                        if (k == 0):
                            outS.write(' : ')
                        else:
                            outS.write(', ')
                        p = kl.getParameter(k)
                        outS.write(p.getId() + '=' + str(p.getValue()))
                    outS.write('\n')
        if self.m.getNumEvents():
            outS.write('@events\n')
            for e in self.m.getListOfEvents():
                outS.write(" " + e.getId() + "= ")
                trig = e.getTrigger()
                trigger = libsbml.formulaToString(trig.getMath())
                outS.write(trigger)
                if e.isSetDelay():
                    outS.write(' ; ')
                    dmath = e.getDelay()
                    delay = libsbml.formulaToString(dmath.getMath())
                    outS.write(delay)
                outS.write(' : ')
                nea = e.getNumEventAssignments()
                for eai in range(nea):
                    if (eai > 0):
                        if (self.mangle >= 23):
                            outS.write('; ')
                        else:
                            outS.write(', ')
                    ea = e.getEventAssignment(eai)
                    outS.write(ea.getVariable() + "=")
                    m = ea.getMath()
                    mf = libsbml.formulaToString(m)
                    outS.write(mf)
                if e.isSetName():
                    outS.write(' "' + e.getName() + '"')
                outS.write("\n")
Esempio n. 8
0
 def test_UnitKind_toString(self):
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_AMPERE)
   self.assert_((  "ampere" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_BECQUEREL)
   self.assert_((  "becquerel" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_CANDELA)
   self.assert_((  "candela" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_CELSIUS)
   self.assert_((  "Celsius" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_COULOMB)
   self.assert_((  "coulomb" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_DIMENSIONLESS)
   self.assert_((  "dimensionless" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_FARAD)
   self.assert_((  "farad" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_GRAM)
   self.assert_((  "gram" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_GRAY)
   self.assert_((  "gray" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_HENRY)
   self.assert_((  "henry" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_HERTZ)
   self.assert_((  "hertz" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_ITEM)
   self.assert_((  "item" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_JOULE)
   self.assert_((  "joule" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_KATAL)
   self.assert_((  "katal" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_KELVIN)
   self.assert_((  "kelvin" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_KILOGRAM)
   self.assert_((  "kilogram" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_LITER)
   self.assert_((  "liter" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_LITRE)
   self.assert_((  "litre" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_LUMEN)
   self.assert_((  "lumen" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_LUX)
   self.assert_((  "lux" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_METER)
   self.assert_((  "meter" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_METRE)
   self.assert_((  "metre" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_MOLE)
   self.assert_((  "mole" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_NEWTON)
   self.assert_((  "newton" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_OHM)
   self.assert_((  "ohm" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_PASCAL)
   self.assert_((  "pascal" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_RADIAN)
   self.assert_((  "radian" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_SECOND)
   self.assert_((  "second" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_SIEMENS)
   self.assert_((  "siemens" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_SIEVERT)
   self.assert_((  "sievert" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_STERADIAN)
   self.assert_((  "steradian" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_TESLA)
   self.assert_((  "tesla" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_VOLT)
   self.assert_((  "volt" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_WATT)
   self.assert_((  "watt" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_WEBER)
   self.assert_((  "weber" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_INVALID)
   self.assert_((  "(Invalid UnitKind)" == s ))
   s = libsbml.UnitKind_toString(-1)
   self.assert_((  "(Invalid UnitKind)" == s ))
   s = libsbml.UnitKind_toString(libsbml.UNIT_KIND_INVALID + 1)
   self.assert_((  "(Invalid UnitKind)" == s ))
   pass  
Esempio n. 9
0
def udef_to_string(
    udef: Optional[Union[libsbml.UnitDefinition, str]],
    model: Optional[libsbml.Model] = None,
    format: str = "latex",
) -> Optional[str]:
    """Render formatted string for units.

    Format can be either 'str' or 'latex'

    Units have the general format
        (multiplier * 10^scale *ukind)^exponent
        (m * 10^s *k)^e

    Returns None if udef is None or no units in UnitDefinition.

    :param udef: unit definition which is to be converted to string
    """
    if udef is None:
        return None

    ud: libsbml.UnitDefinition
    if isinstance(udef, str):
        # check for internal unit
        if libsbml.UnitKind_forName(udef) != libsbml.UNIT_KIND_INVALID:
            return short_names.get(udef, udef)
        else:
            ud = model.getUnitDefinition(udef)  # type: ignore
    else:
        ud = udef

    # collect nominators and denominators
    nom: str = ""
    denom: str = ""
    if ud:
        for u in ud.getListOfUnits():
            m = u.getMultiplier()
            s: int = u.getScale()
            e = u.getExponent()
            k = libsbml.UnitKind_toString(u.getKind())

            # (m * 10^s *k)^e
            # parse with pint
            term = Q_(float(m) * 10**s, k)**float(abs(e))
            try:
                term = term.to_compact()
            except KeyError:
                pass

            if np.isclose(term.magnitude, 1.0):
                term = Q_(1, term.units)

            us = f"{term:~}"  # short formating
            # handle min and hr
            us = us.replace("60.0 s", "1 min")
            us = us.replace("3600.0 s", "1 hr")
            us = us.replace("3.6 ks", "1 hr")
            us = us.replace("86.4 ks", "1 day")
            us = us.replace("10.0 mm", "1 cm")

            # remove 1.0 prefixes
            us = us.replace("1 ", "")
            # exponent
            us = us.replace(" ** ", "^")

            if e >= 0.0:
                nom = us if nom == "" else f"{nom}*{us}"
            else:
                denom = us if denom == "" else f"{denom}*{us}"

    else:
        nom = "-"

    if format == "str":
        denom = denom.replace("*", "/")
        if nom and denom:
            ustr = f"{nom}/{denom}"
        elif nom and not denom:
            ustr = nom
        elif not nom and denom:
            ustr = f"1/{denom}"
        elif not nom and not denom:
            ustr = "-"

    elif format == "latex":
        nom = nom.replace("*", " \\cdot ")
        denom = denom.replace("*", " \\cdot ")
        if nom and denom:
            ustr = f"\\frac{{{nom}}}{{{denom}}}"
        elif nom and not denom:
            ustr = nom
        elif not nom and denom:
            ustr = f"\\frac{{1}}{{{denom}}}"
        elif not nom and not denom:
            ustr = "-"
    else:
        raise ValueError

    if ustr == "1":
        ustr = "-"

    # json escape

    return ustr
Esempio n. 10
0
    def parseStream(self, outS):
        """parseStream(outStream)
parses SBML model and writes LaTeX to outStream"""
        outS.write('@model:')
        outS.write(str(self.d.getLevel()) + '.')
        outS.write(str(self.d.getVersion()) + '.')
        self.mangle = 10 * self.d.getLevel() + self.d.getVersion()
        outS.write('0=' + self.m.getId())
        if (self.m.getName() != ""):
            outS.write(' "' + self.m.getName() + '"')
        outS.write('\n')
        n = self.m.getNumUnitDefinitions()
        if (n > 0):
            outS.write('@units\n')
            for i in range(n):
                ud = self.m.getUnitDefinition(i)
                outS.write(' ' + ud.getId())
                for j in range(ud.getNumUnits()):
                    if (j == 0):
                        outS.write('=')
                    else:
                        outS.write('; ')
                    u = ud.getUnit(j)
                    kind = u.getKind()
                    outS.write(libsbml.UnitKind_toString(kind))
                    e = u.getExponent()
                    m = u.getMultiplier()
                    o = u.getOffset()
                    s = u.getScale()
                    first = True
                    if (e != 1):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('e=' + str(e))
                    if (m != 1):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('m=' + str(m))
                    if (o != 0):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('o=' + str(o))
                    if (s != 0):
                        if first == True:
                            outS.write(':')
                            first = False
                        else:
                            outS.write(',')
                        outS.write('s=' + str(s))
                if (ud.isSetName()):
                    outS.write(' "' + ud.getName() + '"')
                outS.write('\n')
        if self.m.getNumCompartments():
            outS.write('@compartments\n')
            for c in self.m.getListOfCompartments():
                outS.write(' ' + c.getId())
                if (c.isSetOutside()):
                    outS.write('<' + c.getOutside())
                if (c.isSetSize()):
                    outS.write('=' + str(c.getSize()))
                if (c.isSetName()):
                    outS.write(' "' + c.getName() + '"')
                outS.write('\n')
        if self.m.getNumSpecies():
            outS.write('@species\n')
            for s in self.m.getListOfSpecies():
                outS.write(' ' + s.getCompartment() + ':')
                if (s.isSetInitialConcentration()):
                    outS.write('[' + s.getId() + ']=' +
                               str(s.getInitialConcentration()))
                elif (s.isSetInitialAmount()):
                    outS.write(s.getId() + '=' + str(s.getInitialAmount()))
                else:
                    outS.write('[' + s.getId() + ']=' +
                               str(s.getInitialConcentration()))
                if (s.getHasOnlySubstanceUnits()):
                    outS.write('s')
                if (s.getBoundaryCondition()):
                    outS.write('b')
                if (s.getConstant()):
                    outS.write('c')
                if (s.isSetName()):
                    outS.write(' "' + s.getName() + '"')
                outS.write('\n')
        if self.m.getNumParameters():
            outS.write('@parameters\n')
            for p in self.m.getListOfParameters():
                outS.write(' ' + p.getId() + '=')
                outS.write(str(p.getValue()))
                if (p.isSetName()):
                    outS.write(' "' + p.getName() + '"')
                outS.write('\n')
        if self.m.getNumRules():
            outS.write('@rules\n')
            for r in self.m.getListOfRules():
                outS.write(' ' + r.getVariable() + ' = ' + r.getFormula())
                outS.write('\n')
        if self.m.getNumReactions():
            outS.write('%%% START Reactions\n')
            outS.write('\\begin{align*}\n')
            for r in self.m.getListOfReactions():
                #                if (r.getReversible()):
                #                    outS.write('@rr=')
                #                else:
                #                    outS.write('@r=')
                #                outS.write(r.getId())
                #                if (r.isSetName()):
                #                    outS.write(' "'+r.getName()+'"')
                #                outS.write('\n ')
                for j in range(r.getNumReactants()):
                    sr = r.getReactant(j)
                    if (j > 0):
                        outS.write('+')
                    sto = sr.getStoichiometry()
                    if (sto != 1):
                        outS.write(str(int(sto)))
                    outS.write('\\mathsf{' +
                               sr.getSpecies().replace('_', '\\_') + '}')
                if (r.getReversible()):
                    outS.write(' &\\longleftrightarrow ')
                else:
                    outS.write(' &\\longrightarrow ')
                for j in range(r.getNumProducts()):
                    sr = r.getProduct(j)
                    if (j > 0):
                        outS.write('+')
                    sto = sr.getStoichiometry()
                    if (sto != 1):
                        outS.write(str(int(sto)))
                    outS.write('\\mathsf{' +
                               sr.getSpecies().replace('_', '\\_') + '}')
                for j in range(r.getNumModifiers()):
                    sr = r.getModifier(j)
                    if (j == 0):
                        outS.write(' : ')
                        outS.write('\\mathsf{' +
                                   sr.getSpecies().replace('_', '\\_') + '}')
                    else:
                        outS.write(', ')
                        outS.write('\\mathsf{' +
                                   sr.getSpecies().replace('_', '\\_') + '}')
                outS.write(' & \n')
                if (r.isSetKineticLaw()):
                    kl = r.getKineticLaw()
                    outS.write(' \\mathit{rate}&= \\mathit{' +
                               kl.getFormula().replace(
                                   '*', ' \\times ').replace('_', '\\_') + '}')
                    for k in range(kl.getNumParameters()):
                        if (k == 0):
                            outS.write(' : ')
                        else:
                            outS.write(', ')
                        p = kl.getParameter(k)
                        outS.write(p.getId().replace('_', '\\_') + '=' +
                                   str(p.getValue()))
                outS.write(' \\\\ \n')
            outS.write('\\end{align*}\n')
            outS.write('%%% END Reactions\n')
        if self.m.getNumEvents():
            outS.write('@events\n')
            for e in self.m.getListOfEvents():
                outS.write(" " + e.getId() + "= ")
                trig = e.getTrigger()
                trigger = libsbml.formulaToString(trig.getMath())
                outS.write(trigger)
                if e.isSetDelay():
                    outS.write(' ; ')
                    dmath = e.getDelay()
                    delay = libsbml.formulaToString(dmath.getMath())
                    outS.write(delay)
                outS.write(' : ')
                nea = e.getNumEventAssignments()
                for eai in range(nea):
                    if (eai > 0):
                        if (self.mangle >= 23):
                            outS.write('; ')
                        else:
                            outS.write(', ')
                    ea = e.getEventAssignment(eai)
                    outS.write(ea.getVariable() + "=")
                    m = ea.getMath()
                    mf = libsbml.formulaToString(m)
                    outS.write(mf)
                if e.isSetName():
                    outS.write(' "' + e.getName() + '"')
                outS.write("\n")