void checkFbc(FbcModelPlugin* fbcmodplug, set<string>& components, set<string>& tests, const map<string, vector<double> >& results) { if (fbcmodplug->isSetStrict() && fbcmodplug->getStrict() == false) { tests.insert("fbc:NonStrict"); } List* allElements = fbcmodplug->getAllElements(); for (unsigned int e=0; e<allElements->getSize(); e++) { SBase* element = static_cast<SBase*>(allElements->get(e)); FluxBound* fluxBound; Objective* objective; switch(element->getTypeCode()) { case SBML_FBC_FLUXBOUND: components.insert("fbc:FluxBound"); fluxBound = static_cast<FluxBound*>(element); if (fluxBound->isSetOperation()) { if (fluxBound->getOperation() == "lessEqual") { tests.insert("fbc:BoundLessEqual"); } else if (fluxBound->getOperation() == "greaterEqual") { tests.insert("fbc:BoundGreaterEqual"); } else if (fluxBound->getOperation() == "equal") { tests.insert("fbc:BoundEqual"); } } break; case SBML_FBC_OBJECTIVE: components.insert("fbc:Objective"); objective = static_cast<Objective*>(element); if (objective->isSetType()) { if (objective->getType() == "maximize") { tests.insert("fbc:MaximizeObjective"); } else { tests.insert("fbc:MinimizeObjective"); } } break; case SBML_FBC_FLUXOBJECTIVE: components.insert("fbc:FluxObjective"); break; default: break; } } }
END_TEST START_TEST (test_FbcExtension_read_L3V1V1_defaultNS) { char *filename = safe_strcat(TestDataDirectory, "fbc_example1_defaultNS.xml"); SBMLDocument *document = readSBMLFromFile(filename); fail_unless(document->getPackageName() == "core"); Model *model = document->getModel(); fail_unless(model != NULL); fail_unless(model->getPackageName() == "core"); fail_unless(document->getNumErrors() == 0); // get the fbc plugin FbcModelPlugin* mplugin = static_cast<FbcModelPlugin*>(model->getPlugin("fbc")); fail_unless(mplugin != NULL); fail_unless(mplugin->getNumObjectives() == 1); fail_unless(mplugin->getListOfObjectives()->getPackageName() == "fbc"); Objective* objective = mplugin->getObjective(0); fail_unless(objective->getId() == "obj1"); fail_unless(objective->getType() == "maximize"); fail_unless(objective->getNumFluxObjectives() == 1); fail_unless(objective->getPackageName() == "fbc"); fail_unless(objective->getListOfFluxObjectives()->getPackageName() == "fbc"); FluxObjective* fluxObjective = objective->getFluxObjective(0); fail_unless(fluxObjective->getReaction() == "J8"); fail_unless(fluxObjective->getPackageName() == "fbc"); fail_unless(fluxObjective->getCoefficient() == 1); fail_unless(mplugin->getNumFluxBounds() == 1); fail_unless(mplugin->getListOfFluxBounds()->getPackageName() == "fbc"); FluxBound* bound = mplugin->getFluxBound(0); fail_unless(bound->getId() == "bound1"); fail_unless(bound->getPackageName() == "fbc"); fail_unless(bound->getReaction() == "J0"); fail_unless(bound->getOperation() == "equal"); fail_unless(bound->getValue() == 10); delete document; }
int FbcToCobraConverter::convert() { int result = LIBSBML_OPERATION_FAILED; if (mDocument == NULL) { return LIBSBML_INVALID_OBJECT; } Model* mModel = mDocument->getModel(); if (mModel == NULL) { return LIBSBML_INVALID_OBJECT; } FbcModelPlugin *plugin = static_cast<FbcModelPlugin*>(mDocument->getModel()->getPlugin("fbc")); // if we have don't have a fbc model we cannot do the conversion if (plugin == NULL || mDocument->getLevel() != 3) { return LIBSBML_OPERATION_FAILED; } // collect information Model* model = mDocument->getModel(); map<const string, int> chargeMap; map<const string, string> formulaMap; for (unsigned int i = 0; i < model->getNumSpecies(); ++i) { Species* current = model->getSpecies(i); const string& currentId = current->getId(); FbcSpeciesPlugin *splugin = static_cast<FbcSpeciesPlugin*>(current->getPlugin("fbc")); if (splugin == NULL) continue; if (splugin->isSetCharge()) { chargeMap[currentId] = splugin->getCharge(); } if (splugin->isSetChemicalFormula()) { formulaMap[currentId] = splugin->getChemicalFormula(); } } // create KineticLaw for (unsigned int i = 0; i < model->getNumReactions(); ++i) { Reaction* reaction = model->getReaction(i); if (reaction == NULL) continue; createKineticLawForReaction(reaction); } // update kinetic law from bounds for (unsigned int i = 0; i < plugin->getNumFluxBounds(); ++i) { FluxBound *current = plugin->getFluxBound(i); if (current == NULL) continue; Reaction* reaction = model->getReaction(current->getReaction()); if (reaction == NULL) continue; updateKineticLawFromBound(reaction, current); } setObjectiveCoefficient(plugin, model); // disable package mDocument->enablePackage("http://www.sbml.org/sbml/level3/version1/fbc/version1", "fbc",false); // convert model to L2V1 (as L2V2 is the last model that had charge) mDocument->setConversionValidators(AllChecksON & UnitsCheckOFF); ConversionProperties prop(new SBMLNamespaces(2,1)); prop.addOption("strict", false, "should validity be preserved"); prop.addOption("ignorePackages", true, "convert even if packages are used"); prop.addOption("setLevelAndVersion", true, "convert the document to the given level and version"); int conversionResult = mDocument->convert(prop); if (conversionResult != LIBSBML_OPERATION_SUCCESS) return conversionResult; // set charge on species for (unsigned int i = 0; i < model->getNumSpecies(); ++i) { Species* current = model->getSpecies(i); const string currentId = current->getId(); int charge = chargeMap[currentId]; if (charge != 0) current->setCharge(charge); const string formula = formulaMap[currentId]; if (!formula.empty()) { current->setNotes( getNotesForFormula(formula) ); } } result = LIBSBML_OPERATION_SUCCESS; return result; }
END_TEST START_TEST(test_FbcExtension_create_and_write_new_geneassociation ) { FbcPkgNamespaces *sbmlns = new FbcPkgNamespaces(3, 1, 2); // create the document SBMLDocument document(sbmlns); document.setConsistencyChecks(LIBSBML_CAT_UNITS_CONSISTENCY, false); document.setConsistencyChecks(LIBSBML_CAT_MODELING_PRACTICE, false); // create the Model Model* model = document.createModel(); // create the Compartment Compartment* compartment = model->createCompartment(); compartment->setId("compartment"); compartment->setConstant(true); compartment->setSize(1); // create the Species Species* species = model->createSpecies(); species->setId("Node1"); species->setCompartment("compartment"); species->setBoundaryCondition(false); species = model->createSpecies(); species->setId("Node2"); species->setCompartment("compartment"); species->setBoundaryCondition(false); Reaction* reaction = model->createReaction(); reaction->setId("J0"); reaction->setReversible(false); SpeciesReference* reactant = reaction->createReactant(); reactant->setSpecies("Node0"); reactant->setStoichiometry(1); SpeciesReference* product = reaction->createProduct(); product->setSpecies("Node1"); product->setStoichiometry(1); // use fbc FbcModelPlugin* mplugin = static_cast<FbcModelPlugin*>(model->getPlugin("fbc")); fail_unless(mplugin != NULL); FluxBound* bound = mplugin->createFluxBound(); bound->setId("bound1"); bound->setReaction("J0"); bound->setOperation("equal"); bound->setValue(10); Objective* objective = mplugin->createObjective(); objective->setId("obj1"); objective->setType("maximize"); FluxObjective* fluxObjective = objective->createFluxObjective(); fluxObjective->setReaction("J0"); fluxObjective->setCoefficient(1); FbcReactionPlugin* rplug = dynamic_cast<FbcReactionPlugin*>(reaction->getPlugin("fbc")); fail_unless(rplug != NULL); GeneProductAssociation * ga = rplug->createGeneProductAssociation(); ga->setId("ga1"); ga->setAssociation("MG_077 AND MG_321 AND MG_080 AND MG_078 AND MG_079"); fail_unless(ga->getAssociation() != NULL); fail_unless(mplugin->getNumGeneProducts() == 5); ga->setAssociation("MG_077 AND MG_321 AND MG_080 AND MG_078 AND MG_079"); fail_unless(ga->getAssociation() != NULL); fail_unless(mplugin->getNumGeneProducts() == 5); delete sbmlns; }
END_TEST START_TEST(test_FbcExtension_create_and_write_L3V1V1) { FbcPkgNamespaces *sbmlns = new FbcPkgNamespaces(3, 1, 1); // create the document SBMLDocument *document = new SBMLDocument(sbmlns); delete sbmlns; // create the Model Model* model = document->createModel(); // create the Compartment Compartment* compartment = model->createCompartment(); compartment->setId("compartment"); compartment->setConstant(true); compartment->setSize(1); // create the Species Species* species = model->createSpecies(); species->setId("Node1"); species->setCompartment("compartment"); species->setBoundaryCondition(false); species = model->createSpecies(); species->setId("Node2"); species->setCompartment("compartment"); species->setBoundaryCondition(false); Reaction* reaction = model->createReaction(); reaction->setId("J0"); reaction->setReversible(false); SpeciesReference* reactant = reaction->createReactant(); reactant->setSpecies("Node0"); reactant->setStoichiometry(1); SpeciesReference* product = reaction->createProduct(); product->setSpecies("Node1"); product->setStoichiometry(1); // use fbc FbcModelPlugin* mplugin = static_cast<FbcModelPlugin*>(model->getPlugin("fbc")); fail_unless(mplugin != NULL); FluxBound* bound = mplugin->createFluxBound(); bound->setId("bound1"); bound->setReaction("J0"); bound->setOperation("equal"); bound->setValue(10); Objective* objective = mplugin->createObjective(); objective->setId("obj1"); objective->setType("maximize"); FluxObjective* fluxObjective = objective->createFluxObjective(); fluxObjective->setReaction("J0"); fluxObjective->setCoefficient(1); string s1 = writeSBMLToStdString(document); // check clone() SBMLDocument* document2 = document->clone(); string s2 = writeSBMLToStdString(document2); fail_unless(s1 == s2); // check operator= Model m = *(document->getModel()); document2->setModel(&m); s2 = writeSBMLToStdString(document2); fail_unless(s1 == s2); delete document2; delete document; }