void checkSpecies(Model* model, set<string>& components, set<string>& tests, const map<string, vector<double> >& results, int type) { //Must call this after 'checkCompartments' because we look in 'tests' for 'NonUnityCompartment'. if (model->getNumSpecies() > 0) { components.insert("Species"); if (type==0) { tests.insert("Amount||Concentration"); } else if (type==2) { tests.insert("Amount"); } set<string> compartments; for (unsigned int s=0; s<model->getNumSpecies(); s++) { Species* species = model->getSpecies(s); if (species->isSetBoundaryCondition() && species->getBoundaryCondition()) { tests.insert("BoundaryCondition"); } if (species->getConstant()) { tests.insert("ConstantSpecies"); } if (species->isSetConversionFactor()) { tests.insert("ConversionFactors"); } if (species->isSetHasOnlySubstanceUnits() && species->getHasOnlySubstanceUnits()) { tests.insert("HasOnlySubstanceUnits"); } if (!species->isSetInitialAmount() && !species->isSetInitialConcentration()) { tests.insert("InitialValueReassigned"); } else if (species->isSetId() && initialOverriddenIn(species->getId(), model, results, tests)) { tests.insert("InitialValueReassigned"); } if (species->isSetCompartment()) { compartments.insert(species->getCompartment()); } } if (tests.find("MultiCompartment") != tests.end() && compartments.size()==1 && model->getNumSpecies() > 1) { cerr << "Error: multiple compartments discovered, but all species are in a single compartment." << endl; tests.insert("ERRORMultiCompartment"); } } }
void Model::assignRequiredValues() { // when converting to L3 some attributes which have default values in L1/L2 // but are required in L3 are not present or set unsigned int i, n; if (getNumUnitDefinitions() > 0) { for (i = 0; i < getNumUnitDefinitions(); i++) { for (n = 0; n < getUnitDefinition(i)->getNumUnits(); n++) { Unit *u = getUnitDefinition(i)->getUnit(n); if (!u->isSetExponent()) u->setExponent(1.0); if (!u->isSetScale()) u->setScale(0); if (!u->isSetMultiplier()) u->setMultiplier(1.0); } } } if (getNumCompartments() > 0) { for (i = 0; i < getNumCompartments(); i++) { Compartment *c = getCompartment(i); c->setConstant(c->getConstant()); } } if (getNumSpecies() > 0) { for (i = 0; i < getNumSpecies(); i++) { Species * s = getSpecies(i); s->setBoundaryCondition(s->getBoundaryCondition()); s->setHasOnlySubstanceUnits(s->getHasOnlySubstanceUnits()); s->setConstant(s->getConstant()); } } if (getNumParameters() > 0) { for (i = 0; i < getNumParameters(); i++) { Parameter * p = getParameter(i); p->setConstant(p->getConstant()); } } if (getNumReactions() > 0) { for (i = 0; i < getNumReactions(); i++) { Reaction * r = getReaction(i); r->setFast(r->getFast()); r->setReversible(r->getReversible()); if (r->getNumReactants() > 0) { for (n = 0; n < r->getNumReactants(); n++) { SpeciesReference *sr = r->getReactant(n); if (sr->isSetStoichiometryMath()) { sr->setConstant(false); } else { sr->setConstant(true); } } } if (r->getNumProducts() > 0) { for (n = 0; n < r->getNumProducts(); n++) { SpeciesReference *sr = r->getProduct(n); if (sr->isSetStoichiometryMath()) { sr->setConstant(false); } else { sr->setConstant(true); } } } } } if (getNumEvents() > 0) { for (i = 0; i < getNumEvents(); i++) { Event * e = getEvent(i); e->setUseValuesFromTriggerTime(e->getUseValuesFromTriggerTime()); if (e->isSetTrigger()) { Trigger *t = e->getTrigger(); t->setPersistent(true); t->setInitialValue(true); } } } }
void test000009::test_references_to_species() { // load the CPS file // export to SBML // check the resulting SBML model CCopasiDataModel* pDataModel = pCOPASIDATAMODEL; std::istringstream iss(test000009::MODEL_STRING); CPPUNIT_ASSERT(load_cps_model_from_stream(iss, *pDataModel) == true); CPPUNIT_ASSERT(pDataModel->getModel() != NULL); CPPUNIT_ASSERT(pDataModel->exportSBMLToString(NULL, 2, 3).empty() == false); SBMLDocument* pDocument = pDataModel->getCurrentSBMLDocument(); CPPUNIT_ASSERT(pDocument != NULL); Model* pModel = pDocument->getModel(); CPPUNIT_ASSERT(pModel != NULL); // assert that there is only one compartment and // assert the compartment is constant CPPUNIT_ASSERT(pModel->getNumCompartments() == 1); Compartment* pCompartment = pModel->getCompartment(0); CPPUNIT_ASSERT(pCompartment->getConstant() == false); CPPUNIT_ASSERT(pModel->getNumSpecies() == 2); Species* pSpecies = pModel->getSpecies(1); CPPUNIT_ASSERT(pSpecies->getHasOnlySubstanceUnits() == true); pSpecies = pModel->getSpecies(0); std::string idSpeciesA = pSpecies->getId(); CPPUNIT_ASSERT(pSpecies->getHasOnlySubstanceUnits() == true); CPPUNIT_ASSERT(pModel->getNumRules() == 2); // there are two rules, one is the rule for the compartment AssignmentRule* pRule = dynamic_cast<AssignmentRule*>(pModel->getRule(0)); CPPUNIT_ASSERT(pRule != NULL); CPPUNIT_ASSERT(pModel->getNumParameters() == 1); Parameter* pParameter = pModel->getParameter(0); CPPUNIT_ASSERT(pParameter != NULL); if (pRule->getVariable() != pParameter->getId()) { pRule = dynamic_cast<AssignmentRule*>(pModel->getRule(1)); } CPPUNIT_ASSERT(pRule->getVariable() == pParameter->getId()); const ASTNode* pMath = pRule->getMath(); CPPUNIT_ASSERT(pMath != NULL); // the expression should be the species divided by the volume CPPUNIT_ASSERT(pMath->getType() == AST_DIVIDE); CPPUNIT_ASSERT(pMath->getChild(0) != NULL); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == pSpecies->getId()); CPPUNIT_ASSERT(pMath->getChild(1) != NULL); CPPUNIT_ASSERT(pMath->getChild(1)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(1)->getName() == pCompartment->getId()); CPPUNIT_ASSERT(pModel->getNumReactions() == 2); Reaction* pReaction = pModel->getReaction(0); // make sure this is reaction A -> CPPUNIT_ASSERT(pReaction != NULL); CPPUNIT_ASSERT(pReaction->getNumReactants() == 1); CPPUNIT_ASSERT(pReaction->getNumProducts() == 0); // check if all references in the kinetic law are unmodified // math element must be a multiplication of the mass action term by // the compartment volume // the mass action term is a multiplication of the parameter node by // the species node // the code that multiplies the reaction by the compartments volume // recognizes the division of the species by the compartment and cancels // those two CPPUNIT_ASSERT(pReaction->isSetKineticLaw() == true); KineticLaw* pLaw = pReaction->getKineticLaw(); CPPUNIT_ASSERT(pLaw != NULL); CPPUNIT_ASSERT(pLaw->isSetMath() == true); pMath = pLaw->getMath(); CPPUNIT_ASSERT(pMath->getType() == AST_TIMES); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == std::string("k1")); CPPUNIT_ASSERT(pMath->getChild(1) != NULL); CPPUNIT_ASSERT(pMath->getChild(1)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(1)->getName() == idSpeciesA); pReaction = pModel->getReaction(1); // make sure this is reaction A -> S CPPUNIT_ASSERT(pReaction != NULL); CPPUNIT_ASSERT(pReaction->getNumReactants() == 1); CPPUNIT_ASSERT(pReaction->getNumProducts() == 1); // check if all references in the kinetic law are unmodified // math element must be a multiplication of the compartments volume with // a function call with three arguments // the first argument is the reference to the species CPPUNIT_ASSERT(pReaction->isSetKineticLaw() == true); pLaw = pReaction->getKineticLaw(); CPPUNIT_ASSERT(pLaw != NULL); CPPUNIT_ASSERT(pLaw->isSetMath() == true); pMath = pLaw->getMath(); CPPUNIT_ASSERT(pMath->getType() == AST_TIMES); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == pCompartment->getId()); pMath = pMath->getChild(1); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_FUNCTION); CPPUNIT_ASSERT(pMath->getNumChildren() == 3); pMath = pMath->getChild(0); CPPUNIT_ASSERT(pMath != NULL); CPPUNIT_ASSERT(pMath->getType() == AST_DIVIDE); CPPUNIT_ASSERT(pMath->getNumChildren() == 2); CPPUNIT_ASSERT(pMath->getChild(0) != NULL); CPPUNIT_ASSERT(pMath->getChild(0)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(0)->getName() == idSpeciesA); CPPUNIT_ASSERT(pMath->getChild(1) != NULL); CPPUNIT_ASSERT(pMath->getChild(1)->getType() == AST_NAME); CPPUNIT_ASSERT(pMath->getChild(1)->getName() == pCompartment->getId()); }
/* create MOLECULE */ const SbmlReader::sbmlStr_mooseId SbmlReader::createMolecule( map< string,Id > &comptSidMIdMap) { Shell* shell = reinterpret_cast< Shell* >( Id().eref().data() ); map< string, Id >molSidcmptMIdMap; double transvalue = 0.0; int num_species = model_->getNumSpecies(); if (num_species == 0) { baseId = Id(); errorFlag_ = true; return molSidcmptMIdMap; } for ( int sindex = 0; sindex < num_species; sindex++ ) { Species* spe = model_->getSpecies(sindex); if (!spe) { continue; } std::string compt = ""; if ( spe->isSetCompartment() ) { compt = spe->getCompartment(); } if (compt.length()< 1) { //cout << "compt is empty for species "<< sindex << endl; continue; } string id = spe->getId(); if (id.length() < 1) { continue; } std::string name = ""; if ( spe->isSetName() ) { name = spe->getName(); name = nameString(name); } if (name.empty()) name = id; double initvalue =0.0; if ( spe->isSetInitialConcentration() ) initvalue = spe->getInitialConcentration(); else if ( spe->isSetInitialAmount() ) initvalue = spe->getInitialAmount() ; else { unsigned int nr = model_->getNumRules(); bool found = false; for ( unsigned int r = 0; r < nr; r++ ) { Rule * rule = model_->getRule(r); bool assignRule = rule->isAssignment(); if ( assignRule ) { string rule_variable = rule->getVariable(); if (rule_variable.compare(id) == 0) { found = true; break; } } } if (found == false) { cout << "Invalid SBML: Either initialConcentration or initialAmount must be set or it should be found in assignmentRule but non happening for " << spe->getName() <<endl; return molSidcmptMIdMap; } } Id comptEl = comptSidMIdMap[compt]; Id meshEntry = Neutral::child( comptEl.eref(), "mesh" ); bool constant = spe->getConstant(); bool boundaryCondition = spe->getBoundaryCondition(); if (boundaryCondition == true) cout << "Pools having BoundaryCondition true " << name <<endl; Id pool; //If constant is true then its equivalent to BuffPool in moose if (constant == true) //if( (boundaryCondition == true) && (constant==false)) pool = shell->doCreate("BufPool",comptEl,name,1); else pool = shell->doCreate("Pool", comptEl, name ,1); molSidcmptMIdMap[id] = comptEl; //Map to Molecule SBML id to Moose Id molSidMIdMap_[id] = pool; //shell->doAddMsg( "OneToOne",pool, "mesh", meshEntry, "mesh" ); bool bcondition = spe->getBoundaryCondition(); if ( constant == true && bcondition == false) cout <<"The species "<< name << " should not appear in reactant or product as per sbml Rules"<< endl; unsigned int spatialDimen =Field< unsigned int >::get( comptEl, "numDimensions"); UnitDefinition * ud = spe->getDerivedUnitDefinition(); assert(ud != NULL); bool hasonlySubUnit = spe->getHasOnlySubstanceUnits(); //double v = Field< double >::get( comptEl.path(), "volume" ); transvalue = transformUnits(1,ud,"substance",hasonlySubUnit); if (hasonlySubUnit) { // In Moose, no. of molecules (nInit) and unit is "item" if (spatialDimen > 0 && spe->isSetInitialAmount() ) { //transvalue *= initvalue; initvalue *=transvalue; Field < double> :: set( pool, "nInit", initvalue); } } else { //transvalue *=initvalue; initvalue *=transvalue; Field <double> :: set(pool, "concInit",initvalue); } //cout << " poolMap_ "<< name << " " <<transvalue << " "<< hasonlySubUnit; //poolMap_.insert(make_pair(id,make_tuple(name,transvalue,hasonlySubUnit))); } return molSidcmptMIdMap; }