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
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 ""
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
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
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
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 ""
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")
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
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
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")