void PackageIdReplacementCheck::checkReferencedElement(ReplacedElement& repE) { // if the deletion attribute is set then it does not point // to another package element if (repE.isSetDeletion() == true) { return; } unsigned int numErrsB4 = repE.getSBMLDocument()->getNumErrors(); SBase* refElem = repE.getReferencedElement(); // if there is an issue with references the getReferencedElement // will log errors and possibly fail // we dont want to try any further unsigned int numErrsAfter = repE.getSBMLDocument()->getNumErrors(); if (numErrsB4 != numErrsAfter || refElem == NULL) { return; } SBase * parent = repE.getParentSBMLObject()->getParentSBMLObject(); if (refElem->isSetId() == true && parent->isSetId() == false) { logMissingIdAttribute(repE, refElem, parent); } }
void checkComp(CompSBMLDocumentPlugin* compdoc, set<string>& components, set<string>& tests, const map<string, vector<double> >& results) { SBMLDocument* doc = compdoc->getSBMLDocument(); List* allElements = doc->getAllElements(); for (unsigned int e=0; e<allElements->getSize(); e++) { SBase* element = static_cast<SBase*>(allElements->get(e)); ReplacedElement* re; Submodel* submod; switch(element->getTypeCode()) { case SBML_COMP_SUBMODEL: components.insert("comp:Submodel"); submod = static_cast<Submodel*>(element); if (submod->isSetExtentConversionFactor()) { tests.insert("comp:ExtentConversionFactor"); } if (submod->isSetTimeConversionFactor()) { tests.insert("comp:TimeConversionFactor"); } break; case SBML_COMP_MODELDEFINITION: components.insert("comp:ModelDefinition"); break; case SBML_COMP_EXTERNALMODELDEFINITION: components.insert("comp:ExternalModelDefinition"); break; case SBML_COMP_SBASEREF: components.insert("comp:SBaseRef"); break; case SBML_COMP_DELETION: components.insert("comp:Deletion"); break; case SBML_COMP_REPLACEDELEMENT: components.insert("comp:ReplacedElement"); re = static_cast<ReplacedElement*>(element); if (re->isSetConversionFactor()) { tests.insert("comp:ConversionFactor"); } break; case SBML_COMP_REPLACEDBY: components.insert("comp:ReplacedBy"); break; case SBML_COMP_PORT: components.insert("comp:Port"); break; default: break; } } for (map<string, vector<double> >::const_iterator result=results.begin(); result != results.end(); result++) { string id = result->first; if (id.find("__") != string::npos) { //It is probably a submodel element, renamed tests.insert("comp:SubmodelOutput"); } } }
void ClassReplacements::checkReferencedElement(ReplacedElement& repE) { // if the deletion attribute is set then we don't care what // it points to if (repE.isSetDeletion() == true) { return; } unsigned int numErrsB4 = repE.getSBMLDocument()->getNumErrors(); SBase* refElem = repE.getReferencedElement(); // if there is an issue with references the getReferencedElement // will log errors and possibly fail // we dont want to try any further unsigned int numErrsAfter = repE.getSBMLDocument()->getNumErrors(); if (numErrsB4 != numErrsAfter || refElem == NULL) { return; } SBase * parent = repE.getParentSBMLObject()->getParentSBMLObject(); if (refElem->getTypeCode() != parent->getTypeCode()) { int parentTC = parent->getTypeCode(); // exception is anything with mathematical meaning // may replace a parameter if (refElem->getTypeCode() == SBML_PARAMETER) { if (parentTC == SBML_COMPARTMENT || parentTC == SBML_SPECIES || parentTC == SBML_SPECIES_REFERENCE || parentTC == SBML_REACTION || parentTC == SBML_LOCAL_PARAMETER) { return; } } else if (refElem->getTypeCode() == SBML_LOCAL_PARAMETER) { if (parentTC == SBML_PARAMETER) { return; } } logBadClassReplacement(repE, refElem, parent); } }
END_TEST START_TEST (test_comp_sbase) { SBMLNamespaces sbmlns(3,1,"comp",1); Parameter param(&sbmlns); CompSBasePlugin* pplugin = static_cast<CompSBasePlugin*>(param.getPlugin("comp")); fail_unless(pplugin->getNumReplacedElements()==0); ReplacedElement* re = pplugin->createReplacedElement(); re->setMetaId("re1"); fail_unless(pplugin->getNumReplacedElements()==1); fail_unless(pplugin->addReplacedElement(NULL)==LIBSBML_INVALID_OBJECT); ReplacedElement re2(3, 1); re2.setMetaId("re2"); fail_unless(pplugin->addReplacedElement(&re2)==LIBSBML_INVALID_OBJECT); re2.setDeletion("ID1"); fail_unless(pplugin->addReplacedElement(&re2)==LIBSBML_INVALID_OBJECT); re2.setSubmodelRef("mod1"); fail_unless(pplugin->addReplacedElement(&re2)==LIBSBML_OPERATION_SUCCESS); ReplacedElement* reref = pplugin->getReplacedElement(1); fail_unless(reref != NULL); fail_unless(reref->getMetaId()=="re2"); reref = pplugin->getReplacedElement(0); fail_unless(reref != NULL); fail_unless(reref->getMetaId()=="re1"); re->setDeletion("ID1"); fail_unless(reref->getDeletion()=="ID1"); fail_unless(pplugin->removeReplacedElement(3)==NULL); fail_unless(pplugin->removeReplacedElement(0)==re); fail_unless(pplugin->getReplacedElement(1)==NULL); fail_unless(pplugin->isSetReplacedBy()==false); ReplacedBy* rb = pplugin->createReplacedBy(); fail_unless(rb != NULL); fail_unless(pplugin->isSetReplacedBy()==true); fail_unless(pplugin->setReplacedBy(NULL)==LIBSBML_OPERATION_SUCCESS); fail_unless(pplugin->isSetReplacedBy()==false); ReplacedBy rb2(3,1); fail_unless(pplugin->setReplacedBy(&rb2)==LIBSBML_INVALID_OBJECT); rb2.setIdRef("ID1"); fail_unless(pplugin->setReplacedBy(&rb2)==LIBSBML_INVALID_OBJECT); rb2.setSubmodelRef("mod1"); fail_unless(pplugin->setReplacedBy(&rb2)==LIBSBML_OPERATION_SUCCESS); fail_unless(pplugin->unsetReplacedBy()==LIBSBML_OPERATION_SUCCESS); }
int CompModelPlugin::saveAllReferencedElements(set<SBase*> uniqueRefs, set<SBase*> replacedBys) { SBMLDocument* doc = getSBMLDocument(); Model* model = static_cast<Model*>(getParentSBMLObject()); if (model==NULL) { if (doc) { string error = "Unable to discover any referenced elements in CompModelPlugin::saveAllReferencedElements: no Model parent of the 'comp' model plugin."; doc->getErrorLog()->logPackageError("comp", CompModelFlatteningFailed, getPackageVersion(), getLevel(), getVersion(), error); } return LIBSBML_OPERATION_FAILED; } int ret = LIBSBML_OPERATION_SUCCESS; //Get a list of everything, pull out anything that's a deletion, replacement, or port, and save what they're pointing to. //At the same time, make sure that no two things point to the same thing. set<SBase*> RE_deletions = set<SBase*>(); //Deletions only point to things in the same model. List* allElements = model->getAllElements(); string modname = "the main model in the document"; if (model->isSetId()) { modname = "the model '" + model->getId() + "'"; } set<SBase*> todelete; for (unsigned int el=0; el<allElements->getSize(); el++) { SBase* element = static_cast<SBase*>(allElements->get(el)); int type = element->getTypeCode(); if (type==SBML_COMP_DELETION || type==SBML_COMP_REPLACEDBY || type==SBML_COMP_REPLACEDELEMENT || type==SBML_COMP_PORT) { //Don't worry about SBML_COMP_SBASEREF because they're all children of one of the above types. SBaseRef* reference = static_cast<SBaseRef*>(element); ReplacedElement* re = static_cast<ReplacedElement*>(element); ret = reference->saveReferencedElement(); if (ret != LIBSBML_OPERATION_SUCCESS) { if (type != SBML_COMP_REPLACEDBY && doc) { SBMLErrorLog* errlog = doc->getErrorLog(); SBMLError* lasterr = const_cast<SBMLError*> (doc->getErrorLog()->getError(doc->getNumErrors()-1)); if ( (errlog->contains(UnrequiredPackagePresent) || errlog->contains(RequiredPackagePresent))) { if ( lasterr->getErrorId() == CompIdRefMustReferenceObject) { //Change the error into a warning string fullmsg = lasterr->getMessage() + " However, this may be because of the unrecognized " + "package present in this document: ignoring this " + "element and flattening anyway."; errlog->remove(lasterr->getErrorId()); errlog->logPackageError("comp", CompIdRefMayReferenceUnknownPackage, getPackageVersion(), getLevel(), getVersion(), fullmsg, element->getLine(), element->getColumn(), LIBSBML_SEV_WARNING); } else if ( lasterr->getErrorId() == CompMetaIdRefMustReferenceObject) { //Change the error into a warning string fullmsg = lasterr->getMessage() + " However, this may be because of the unrecognized " + "package present in this document: ignoring this " + "element and flattening anyway."; errlog->remove(lasterr->getErrorId()); errlog->logPackageError("comp", CompMetaIdRefMayReferenceUnknownPkg, getPackageVersion(), getLevel(), getVersion(), fullmsg, element->getLine(), element->getColumn(), LIBSBML_SEV_WARNING); } } //Whether or not we could figure out the error, we can always still continue flattening. todelete.insert(element); continue; } else { delete allElements; return ret; } } SBase* direct = reference->getDirectReference(); bool adddirect = true; if (type == SBML_COMP_REPLACEDBY) { SBase* rbParent = reference->getParentSBMLObject(); if (uniqueRefs.insert(rbParent).second == false) { if (doc) { string error = "Error discovered in CompModelPlugin::saveAllReferencedElements when checking " + modname + ": a <" + rbParent->getElementName() + "> "; if (direct->isSetId()) { error += "with the id '" + rbParent->getId() + "'"; if (rbParent->isSetMetaId()) { error += ", and the metaid '" + rbParent->getMetaId() + "'"; } } else if (rbParent->isSetMetaId()) { error += "with the metaId '" + rbParent->getMetaId() + "'"; } error += " has a <replacedBy> child and is also pointed to by a <port>, <deletion>, <replacedElement>, or one or more <replacedBy> objects."; doc->getErrorLog()->logPackageError("comp", CompNoMultipleReferences, getPackageVersion(), getLevel(), getVersion(), error); } delete allElements; return LIBSBML_OPERATION_FAILED; } adddirect = replacedBys.insert(direct).second; } if (type==SBML_COMP_REPLACEDELEMENT && re->isSetDeletion()) { adddirect = RE_deletions.insert(direct).second; } if (adddirect) { if (uniqueRefs.insert(direct).second == false) { if (doc) { string error = "Error discovered in CompModelPlugin::saveAllReferencedElements when checking " + modname + ": "; if (replacedBys.find(direct) != replacedBys.end()) { error += "one or more <replacedBy> elements, plus a <deletion>, <replacedElement>, or <port> element"; } else if (RE_deletions.find(direct) != RE_deletions.end()) { error += "one or more <replacedElement> elements using a 'deletion' attribute, plus a <deletion>, <replacedElement>, or <port> element"; } else { error += "multiple <deletion>, <replacedElement>, and/or <port> elements"; } error += " point directly to the <" + direct->getElementName() + "> "; if (direct->isSetId()) { error += "with the id '" + direct->getId() + "'"; if (direct->isSetMetaId()) { error += ", and the metaid '" + direct->getMetaId() + "'"; } error += "."; } else if (direct->isSetMetaId()) { error += "with the metaId '" + direct->getMetaId() + "'."; } doc->getErrorLog()->logPackageError("comp", CompNoMultipleReferences, getPackageVersion(), getLevel(), getVersion(), error); } delete allElements; return LIBSBML_OPERATION_FAILED; } } } } for(set<SBase*>::iterator el=todelete.begin(); el != todelete.end(); el++) { (*el)->removeFromParentAndDelete(); } delete allElements; //Now call saveAllReferencedElements for all instantiated submodels. for (unsigned long sm=0; sm<getNumSubmodels(); ++sm) { Model* sub = getSubmodel((unsigned int)sm)->getInstantiation(); if (sub==NULL) { return LIBSBML_OPERATION_FAILED; } CompModelPlugin* subplug = static_cast<CompModelPlugin*>(sub->getPlugin(getPrefix())); if (subplug==NULL) { return LIBSBML_OPERATION_FAILED; } ret = subplug->saveAllReferencedElements(uniqueRefs, replacedBys); if (ret != LIBSBML_OPERATION_SUCCESS) { return ret; } } return LIBSBML_OPERATION_SUCCESS; }
int main(int argc,char** argv) { int retval = 0; SBMLNamespaces sbmlns(3,1,"comp",1); // create the document SBMLDocument *document = new SBMLDocument(&sbmlns); //Define the external model definition CompSBMLDocumentPlugin* compdoc = static_cast<CompSBMLDocumentPlugin*>(document->getPlugin("comp")); compdoc->setRequired(true); ExternalModelDefinition* extmod = compdoc->createExternalModelDefinition(); extmod->setId("ExtMod1"); extmod->setSource("enzyme_model.xml"); extmod->setModelRef("enzyme"); //Define the 'simple' model ModelDefinition* mod1 = compdoc->createModelDefinition(); mod1->setId("simple"); Compartment* comp=mod1->createCompartment(); comp->setSpatialDimensions((unsigned int)3); comp->setConstant(true); comp->setId("comp"); comp->setSize(1L); // We have to construct it this way because we get the comp // plugin from it later. Species spec(&sbmlns); spec.setCompartment("comp"); spec.setHasOnlySubstanceUnits(false); spec.setConstant(false); spec.setBoundaryCondition(false); spec.setId("S"); spec.setInitialConcentration(5); mod1->addSpecies(&spec); spec.setId("D"); spec.setInitialConcentration(10); mod1->addSpecies(&spec); Reaction rxn(&sbmlns); rxn.setReversible(true); rxn.setFast(false); rxn.setId("J0"); SpeciesReference sr(&sbmlns); sr.setConstant(true); sr.setStoichiometry(1); sr.setSpecies("S"); rxn.addReactant(&sr); sr.setSpecies("D"); rxn.addProduct(&sr); mod1->addReaction(&rxn); CompModelPlugin* mod1plug = static_cast<CompModelPlugin*>(mod1->getPlugin("comp")); Port port; port.setId("S_port"); port.setIdRef("S"); mod1plug->addPort(&port); Port* port2 = mod1plug->createPort(); port2->setId("D_port"); port2->setIdRef("D"); port.setId("comp_port"); port.setIdRef("comp"); mod1plug->addPort(&port); port.setId("J0_port"); port.setIdRef("J0"); mod1plug->addPort(&port); // create the Model Model* model=document->createModel(); model->setId("complexified"); // Set the submodels CompModelPlugin* mplugin = static_cast<CompModelPlugin*>(model->getPlugin("comp")); Submodel* submod1 = mplugin->createSubmodel(); submod1->setId("A"); submod1->setModelRef("ExtMod1"); Submodel* submod2 = mplugin->createSubmodel(); submod2->setId("B"); submod2->setModelRef("simple"); Deletion* del = submod2->createDeletion(); del->setPortRef("J0_port"); // Synchronize the compartments Compartment* mcomp=model->createCompartment(); mcomp->setSpatialDimensions((unsigned int)3); mcomp->setConstant(true); mcomp->setId("comp"); mcomp->setSize(1L); CompSBasePlugin* compartplug = static_cast<CompSBasePlugin*>(mcomp->getPlugin("comp")); ReplacedElement re; re.setIdRef("comp"); re.setSubmodelRef("A"); compartplug->addReplacedElement(&re); re.setSubmodelRef("B"); re.unsetIdRef(); re.setPortRef("comp_port"); compartplug->addReplacedElement(&re); //Synchronize the species spec.setId("S"); spec.unsetInitialConcentration(); CompSBasePlugin* specplug = static_cast<CompSBasePlugin*>(spec.getPlugin("comp")); ReplacedElement* sre = specplug->createReplacedElement(); sre->setSubmodelRef("A"); sre->setIdRef("S"); ReplacedBy* srb = specplug->createReplacedBy(); srb->setSubmodelRef("B"); srb->setPortRef("S_port"); model->addSpecies(&spec); spec.setId("D"); sre->setIdRef("D"); srb->setPortRef("D_port"); model->addSpecies(&spec); writeSBMLToFile(document,"eg-ports.xml"); writeSBMLToFile(document,"spec_example3.xml"); delete document; document = readSBMLFromFile("spec_example3.xml"); if (document == NULL) { cout << "Error reading back in file." << endl; retval = -1; } else { document->setConsistencyChecks(LIBSBML_CAT_UNITS_CONSISTENCY, false); document->checkConsistency(); if (document->getErrorLog()->getNumFailsWithSeverity(2) > 0 || document->getErrorLog()->getNumFailsWithSeverity(3) > 0) { stringstream errorstream; document->printErrors(errorstream); cout << "Errors encoutered when round-tripping SBML file: \n" << errorstream.str() << endl; retval = -1; } writeSBMLToFile(document, "spec_example3_rt.xml"); delete document; } #ifdef WIN32 if (retval != 0) { cout << "(Press any key to exit.)" << endl; _getch(); } #endif return retval; }
int main(int argc,char** argv) { int retval = 0; SBMLNamespaces sbmlns(3,1,"comp",1); // create the document SBMLDocument *document = new SBMLDocument(&sbmlns); //Define the external model definitions CompSBMLDocumentPlugin* compdoc = static_cast<CompSBMLDocumentPlugin*>(document->getPlugin("comp")); compdoc->setRequired(true); ExternalModelDefinition* extmod = compdoc->createExternalModelDefinition(); extmod->setId("ExtMod1"); extmod->setSource("enzyme_model.xml"); extmod->setModelRef("enzyme"); // create the main Model Model* model=document->createModel(); // Set the submodels CompModelPlugin* mplugin = static_cast<CompModelPlugin*>(model->getPlugin("comp")); Submodel* submod1 = mplugin->createSubmodel(); submod1->setId("A"); submod1->setModelRef("ExtMod1"); Submodel* submod2 = mplugin->createSubmodel(); submod2->setId("B"); submod2->setModelRef("ExtMod1"); // create a replacement compartment Compartment* comp=model->createCompartment(); comp->setSpatialDimensions((unsigned int)3); comp->setConstant(true); comp->setId("comp"); comp->setSize(1L); //Tell the model that this compartment replaces both of the inside ones. CompSBasePlugin* compartplug = static_cast<CompSBasePlugin*>(comp->getPlugin("comp")); ReplacedElement re; re.setIdRef("comp"); re.setSubmodelRef("A"); compartplug->addReplacedElement(&re); re.setSubmodelRef("B"); compartplug->addReplacedElement(&re); // create a replacement species Species* spec = model->createSpecies(); spec->setCompartment("comp"); spec->setHasOnlySubstanceUnits(false); spec->setConstant(false); spec->setBoundaryCondition(false); spec->setId("S"); //Tell the model that this species replaces both of the inside ones. CompSBasePlugin* spp = static_cast<CompSBasePlugin*>(spec->getPlugin("comp")); re.setIdRef("S"); re.setSubmodelRef("A"); spp->addReplacedElement(&re); re.setSubmodelRef("B"); spp->addReplacedElement(&re); writeSBMLToFile(document,"eg-import-external.xml"); writeSBMLToFile(document,"spec_example2.xml"); delete document; document = readSBMLFromFile("spec_example2.xml"); if (document == NULL) { cout << "Error reading back in file." << endl; retval = -1; } else { document->setConsistencyChecks(LIBSBML_CAT_UNITS_CONSISTENCY, false); document->checkConsistency(); if (document->getErrorLog()->getNumFailsWithSeverity(2) > 0 || document->getErrorLog()->getNumFailsWithSeverity(3) > 0) { stringstream errorstream; document->printErrors(errorstream); cout << "Errors encoutered when round-tripping SBML file: \n" << errorstream.str() << endl; retval = -1; } writeSBMLToFile(document, "spec_example2_rt.xml"); delete document; } #ifdef WIN32 if (retval != 0) { cout << "(Press any key to exit.)" << endl; _getch(); } #endif return retval; }
void UnitReplacementCheck::checkReferencedElement(ReplacedElement& repE, const Model& m) { // if the deletion attribute is set then it is not a true replacement if (repE.isSetDeletion() == true) { return; } unsigned int numErrsB4 = repE.getSBMLDocument()->getNumErrors(); SBase* refElem = repE.getReferencedElement(); // if there is an issue with references the getReferencedElement // will log errors and possibly fail // we dont want to try any further unsigned int numErrsAfter = repE.getSBMLDocument()->getNumErrors(); if (numErrsB4 != numErrsAfter || refElem == NULL) { return; } SBase * parent = repE.getParentSBMLObject()->getParentSBMLObject(); UnitDefinition *parentUnits = parent->getDerivedUnitDefinition(); UnitDefinition *refElemUnits = refElem->getDerivedUnitDefinition(); bool delrefelem = false; bool cfPresent = false; /* adjust the refElement units for conversion factor */ if (repE.isSetConversionFactor() == true && refElemUnits && refElemUnits->getNumUnits() > 0) { Parameter * p = const_cast<Model *>(&m) ->getParameter(repE.getConversionFactor()); UnitDefinition *ud = p->getDerivedUnitDefinition(); UnitDefinition *newRefElemUnits = UnitDefinition::combine(refElemUnits, ud); refElemUnits = newRefElemUnits; delrefelem = true; cfPresent = true; } if (parentUnits == NULL) { if (delrefelem) { delete refElemUnits; } return; } if (refElemUnits == NULL) { return; } if (parent->containsUndeclaredUnits() == true || refElem->containsUndeclaredUnits() == true) { if (delrefelem) { delete refElemUnits; } return; } if (UnitDefinition::areIdentical(parentUnits, refElemUnits) == false) { logMismatchUnits(repE, refElem, parent, cfPresent); } else { // if we have Compartments that have spatialDimensions but no units // we can check this if (parent->getTypeCode() == SBML_COMPARTMENT && parentUnits->getNumUnits() == 0 && refElem->getTypeCode() == SBML_COMPARTMENT && refElemUnits->getNumUnits() == 0) { if (static_cast<Compartment *>(parent)->isSetSpatialDimensions() == true && static_cast<Compartment *>(refElem)->isSetSpatialDimensions() == true) { if (util_isEqual( static_cast<Compartment *>(parent)->getSpatialDimensionsAsDouble(), static_cast<Compartment *>(refElem)->getSpatialDimensionsAsDouble()) == 0) { logMismatchSpatialDimensions(repE, refElem, parent); } } } } if (delrefelem) { delete refElemUnits; } }
void CompIdBase::checkId (const ReplacedElement& x) { if (x.isSetId()) doCheckId(x.getId(), x); }
LIBSBML_CPP_NAMESPACE_USE int main(int argc,char** argv) { DynPkgNamespaces sbmlns; sbmlns.addPackageNamespace("comp", 1, "comp"); // create the document SBMLDocument *document = new SBMLDocument(&sbmlns); document->setPackageRequired("dyn", true); document->setPackageRequired("comp", true); // create the Model Model* model=document->createModel(); model->setId("grid2x2"); // create the Compartment Compartment* compartment = model->createCompartment(); compartment->setId("Loc1"); compartment->setConstant(false); compartment->setSize(1); compartment->setSpatialDimensions(2.0); DynCompartmentPlugin* cplugin = static_cast<DynCompartmentPlugin*>(compartment->getPlugin("dyn")); SpatialComponent* component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANX); component->setVariable("q1_X"); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANY); component->setVariable("q1_Y"); CompSBasePlugin* compPlugin = static_cast<CompSBasePlugin*>(compartment->getPlugin("comp")); ReplacedElement* relement = compPlugin->createReplacedElement(); relement->setIdRef("C"); relement->setSubmodelRef("GRID_1_1_cell"); compartment = model->createCompartment(); compartment->setId("Loc2"); compartment->setConstant(false); compartment->setSize(1); compartment->setSpatialDimensions(2.0); cplugin = static_cast<DynCompartmentPlugin*>(compartment->getPlugin("dyn")); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANX); component->setVariable("q2_X"); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANY); component->setVariable("q2_Y"); compPlugin = static_cast<CompSBasePlugin*>(compartment->getPlugin("comp")); relement = compPlugin->createReplacedElement(); relement->setIdRef("C"); relement->setSubmodelRef("GRID_1_2_cell"); compartment = model->createCompartment(); compartment->setId("Loc3"); compartment->setConstant(false); compartment->setSize(1); compartment->setSpatialDimensions(2.0); cplugin = static_cast<DynCompartmentPlugin*>(compartment->getPlugin("dyn")); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANX); component->setVariable("q3_X"); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANY); component->setVariable("q3_Y"); compPlugin = static_cast<CompSBasePlugin*>(compartment->getPlugin("comp")); relement = compPlugin->createReplacedElement(); relement->setIdRef("C"); relement->setSubmodelRef("GRID_2_1_cell"); compartment = model->createCompartment(); compartment->setId("Loc4"); compartment->setConstant(false); compartment->setSize(1); compartment->setSpatialDimensions(2.0); cplugin = static_cast<DynCompartmentPlugin*>(compartment->getPlugin("dyn")); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANX); component->setVariable("q4_X"); component = cplugin->createSpatialComponent(); component->setSpatialIndex(DYN_SPATIALKIND_CARTESIANY); component->setVariable("q4_Y"); compPlugin = static_cast<CompSBasePlugin*>(compartment->getPlugin("comp")); relement = compPlugin->createReplacedElement(); relement->setIdRef("C"); relement->setSubmodelRef("GRID_2_2_cell"); // create Parameters Parameter* param = model->createParameter(); param->initDefaults(); param->setId("q1_X"); param->setValue(1); param = model->createParameter(); param->initDefaults(); param->setId("q1_Y"); param->setValue(1); param = model->createParameter(); param->initDefaults(); param->setId("q2_X"); param->setValue(2); param = model->createParameter(); param->initDefaults(); param->setId("q2_Y"); param->setValue(1); param = model->createParameter(); param->initDefaults(); param->setId("q3_X"); param->setValue(1); param = model->createParameter(); param->initDefaults(); param->setId("q3_Y"); param->setValue(2); param = model->createParameter(); param->initDefaults(); param->setId("q4_X"); param->setValue(2); param = model->createParameter(); param->initDefaults(); param->setId("q4_Y"); param->setValue(2); // create SubModels CompModelPlugin* mplugin = static_cast<CompModelPlugin*>(model->getPlugin("comp")); Submodel* submodel = mplugin->createSubmodel(); submodel->setId("GRID_1_1_cell"); submodel->setModelRef("Cell"); submodel = mplugin->createSubmodel(); submodel->setId("GRID_1_2_cell"); submodel->setModelRef("Cell"); submodel = mplugin->createSubmodel(); submodel->setId("GRID_2_1_cell"); submodel->setModelRef("Cell"); submodel = mplugin->createSubmodel(); submodel->setId("GRID_2_2_cell"); submodel->setModelRef("Cell"); // create the ModelDefinition CompSBMLDocumentPlugin* dplugin = static_cast<CompSBMLDocumentPlugin*>(document->getPlugin("comp")); ModelDefinition* mdef = dplugin->createModelDefinition(); mdef->setId("Cell"); compartment = mdef->createCompartment(); compartment->initDefaults(); compartment->setId("C"); compartment->setSpatialDimensions(2.0); compartment->setSize(1.0); Species* species = mdef->createSpecies(); species->setId("R"); species->setCompartment("C"); species->setHasOnlySubstanceUnits(false); species->setBoundaryCondition(false); species->setConstant(false); species = mdef->createSpecies(); species->setId("S"); species->setCompartment("C"); species->setHasOnlySubstanceUnits(false); species->setBoundaryCondition(false); species->setConstant(false); Reaction* reaction = mdef->createReaction(); reaction->setId("Degradation_R"); reaction->setReversible(false); reaction->setFast(false); reaction->setCompartment("C"); SpeciesReference* reactant = reaction->createReactant(); reactant->setSpecies("R"); reactant->setStoichiometry(1); reactant->setConstant(true); reaction = mdef->createReaction(); reaction->setId("Degradation_S"); reaction->setReversible(false); reaction->setFast(false); reaction->setCompartment("C"); reactant = reaction->createReactant(); reactant->setSpecies("S"); reactant->setStoichiometry(1); reactant->setConstant(true); document->checkConsistency(); Event* event = mdef->createEvent(); event->setId("event0"); event->setUseValuesFromTriggerTime(false); DynEventPlugin* eplugin = static_cast<DynEventPlugin*>(event->getPlugin("dyn")); eplugin->setApplyToAll(true); eplugin->setCboTerm("http://cbo.biocomplexity.indiana.edu/svn/cbo/trunk/CBO_1_0.owl#CellDivision"); Trigger* trigger = event->createTrigger(); trigger->setInitialValue(false); trigger->setPersistent(false); trigger->setMath(SBML_parseFormula("true")); if (document->getNumErrors(LIBSBML_SEV_ERROR) > 0) document->printErrors(); writeSBML(document,"dyn_example2.xml"); delete document; }