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;
}
Exemple #3
0
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;
}
Exemple #4
0
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();
}
Exemple #5
0
// 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;
}