static SBMLDocument *checkedReadSBMLFromString(const char* xml) { SBMLDocument *doc = readSBMLFromString(xml); if (doc) { if (doc->getModel() == 0) { // fatal error SBMLErrorLog *log = doc->getErrorLog(); string errors = log ? log->toString() : " NULL SBML Error Log"; delete doc; throw_llvm_exception("Fatal SBML error, no model, errors in sbml document: " + errors); } else if (doc->getNumErrors() > 0) { SBMLErrorLog *log = doc->getErrorLog(); string errors = log ? log->toString() : " NULL SBML Error Log"; Log(rr::Logger::LOG_WARNING) << "Warning, errors found in sbml document: " + errors; } } else { delete doc; throw_llvm_exception("readSBMLFromString returned NULL, no further information available"); } return doc; }
SBMLDocument_t * convertModel (SBMLDocument_t *d1) { char *model; SBMLDocument_t *d2; SBMLDocument_setLevel(d1, 2); SBMLDocument_setVersion(d1, 1); model = writeSBMLToString(d1); d2 = readSBMLFromString(model); free(model); return d2; }
std::string fixMissingStoich(const std::string sbml) { SBMLDocument *doc = NULL; try { doc = readSBMLFromString (sbml.c_str()); Model *m = doc->getModel(); for (int j = 0; j<m->getNumReactions(); ++j) { Reaction* r = m->getReaction(j); if (!r) throw std::runtime_error("No reaction"); // check stoich defined on reactants / products for (int k = 0; k<r->getNumReactants(); ++k) { SpeciesReference* s = r->getReactant(k); if (!isStoichDefined(s)) if (s->setStoichiometry(1.) != LIBSBML_OPERATION_SUCCESS) throw std::runtime_error("Unable to set stoichiometry"); } for (int k = 0; k<r->getNumProducts(); ++k) { SpeciesReference* s = r->getProduct(k); if (!isStoichDefined(s)) if (s->setStoichiometry(1.) != LIBSBML_OPERATION_SUCCESS) throw std::runtime_error("Unable to set stoichiometry"); } // modifiers have no stoichiometry } } catch(...) { delete doc; throw; } SBMLWriter writer; char* sbml_cstr = writer.writeSBMLToString(doc); delete doc; std::string result(sbml_cstr); free(sbml_cstr); return result; }
std::string validateSBML(const std::string src, unsigned opt) { std::stringstream errors; SBMLDocument *doc = NULL; try { string sbml = SBMLReader::read(src); doc = readSBMLFromString (sbml.c_str()); doc->setConsistencyChecks(LIBSBML_CAT_GENERAL_CONSISTENCY, opt & VALIDATE_GENERAL); doc->setConsistencyChecks(LIBSBML_CAT_UNITS_CONSISTENCY, opt & VALIDATE_UNITS); doc->setConsistencyChecks(LIBSBML_CAT_IDENTIFIER_CONSISTENCY, opt & VALIDATE_IDENTIFIER); doc->setConsistencyChecks(LIBSBML_CAT_MATHML_CONSISTENCY, opt & VALIDATE_MATHML); doc->setConsistencyChecks(LIBSBML_CAT_OVERDETERMINED_MODEL, opt & VALIDATE_OVERDETERMINED); doc->setConsistencyChecks(LIBSBML_CAT_MODELING_PRACTICE, opt & VALIDATE_MODELING_PRACTICE); doc->checkConsistency(); SBMLErrorLog* errorLog = doc->getErrorLog(); if(errorLog) { errorLog->printErrors(errors); } } catch(...) { delete doc; throw; } delete doc; return errors.str(); }
// Return true if stoichiometry is defined for every reaction in the model bool isStoichDefined(const std::string sbml) { SBMLDocument *doc = NULL; bool sbml_decl_okay = false; // check for <?xml size_t pos = sbml.find("<"); if (pos != std::string::npos) { pos = sbml.find("?", pos+1); if (pos != std::string::npos) { pos = sbml.find("xml", pos+1); if (pos != std::string::npos) sbml_decl_okay = true; } } // check for <sbml pos = sbml.find("<"); if (pos != std::string::npos) { pos = sbml.find("sbml", pos+1); if (pos != std::string::npos) sbml_decl_okay = true; } if (!sbml_decl_okay) throw std::runtime_error("SBML document must begin with an XML declaration or an SBML declaration"); try { doc = readSBMLFromString (sbml.c_str()); if (!doc) throw std::runtime_error("Unable to read SBML"); if (doc->getLevel() < 3) return true; // stoichiometry has a default value in level 1 & 2 const Model *m = doc->getModel(); if (!m) throw std::runtime_error("SBML string invalid or missing model"); for (int j = 0; j<m->getNumReactions(); ++j) { const Reaction* r = m->getReaction(j); if (!r) throw std::runtime_error("No reaction"); // check stoich defined on reactants / products for (int k = 0; k<r->getNumReactants(); ++k) { if (!isStoichDefined(r->getReactant(k))) return false; } for (int k = 0; k<r->getNumProducts(); ++k) { if (!isStoichDefined(r->getProduct(k))) return false; } // modifiers have no stoichiometry } } catch(...) { delete doc; throw; } delete doc; return true; }