bool getSetValue(string id, Model* model, const set<string>& tests, double& setValue) { SBase* element = model->getElementBySId(id); if (element==NULL) return false; Compartment* comp = static_cast<Compartment*>(element); Species* species = static_cast<Species*>(element); Parameter* param = static_cast<Parameter*>(element); Reaction* rxn = static_cast<Reaction*>(element); SpeciesReference* sr= static_cast<SpeciesReference*>(element); switch(element->getTypeCode()) { case SBML_COMPARTMENT: if (comp->isSetSize()) { setValue = comp->getSize(); return true; } break; case SBML_SPECIES: if (species->isSetInitialAmount()) { setValue = species->getInitialAmount(); if (tests.find("Concentration") != tests.end()) { comp = model->getCompartment(species->getCompartment()); if (comp->isSetSize()) { setValue = setValue/comp->getSize(); } } return true; } if (species->isSetInitialConcentration()) { setValue = species->getInitialConcentration(); if (tests.find("Amount") != tests.end()) { comp = model->getCompartment(species->getCompartment()); if (comp->isSetSize()) { setValue = setValue*comp->getSize(); } } return true; } break; case SBML_PARAMETER: if (param->isSetValue()) { setValue = param->getValue(); return true; } break; case SBML_REACTION: return false; //We'd have to calculate the math here, which I'm not going to do. case SBML_SPECIES_REFERENCE: if (sr->isSetStoichiometry()) { setValue = sr->getStoichiometry(); return true; } break; default: assert(false); //Uncaught type! return false; break; } return false; }
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"); } } }
/* create MOLECULE */ map< string,Id > SbmlReader::createMolecule( map< string,Id > &idMap ) { map<string,Id>molMap; static const Cinfo* moleculeCinfo = initMoleculeCinfo(); static const Finfo* modeFinfo = moleculeCinfo->findFinfo( "mode" ); static const Finfo* nInitFinfo = moleculeCinfo->findFinfo( "nInit" ); static const Cinfo* kincomptCinfo = initKinComptCinfo(); static const Finfo* dimensionFinfo = kincomptCinfo->findFinfo( "numDimensions" ); static const Finfo* sizeFinfo = kincomptCinfo->findFinfo( "size" ); int num_species = model_->getNumSpecies(); //cout << "num species: " << num_species << endl; for ( int sindex = 0; sindex < num_species; sindex++ ) { Species* s = model_->getSpecies(sindex); if (!s){ //cout << "species " << sindex << " is nul" << endl; continue; } std::string compt = ""; if ( s->isSetCompartment() ) compt = s->getCompartment(); if (compt.length()< 1){ cout << "compt is empty for species "<< sindex << endl; continue; } string id = s->getId(); //cout<<"species is :"<<id<<endl; if (id.length() < 1){ continue; } /*std::string name = ""; if ( s->isSetName() ){ name = s->getName(); }*/ Id comptEl = idMap[compt]; molecule_ = Neutral::create( "Molecule",id,comptEl,Id::scratchId() );//create Molecule molMap[id] = comptEl; elmtMap_[id] = Eref( molecule_ ); //printNotes(s); UnitDefinition * ud = s->getDerivedUnitDefinition(); assert(ud != NULL); /*string udef = UnitDefinition::printUnits(ud); //cout << "species unit :" << udef << endl;*/ double initvalue =0.0; if ( s->isSetInitialConcentration() ) initvalue = s->getInitialConcentration(); else if ( s->isSetInitialAmount() ) initvalue = s->getInitialAmount() ; else { cout << "Invalid SBML: Either initialConcentration or initialAmount must be set." << endl; return molMap; } double transvalue = transformUnits(1,ud); //cout << "initAmount: " << initvalue << endl; transvalue *= initvalue; //cout << "transvalue: " << transvalue << endl; unsigned int dimension; get< unsigned int >( comptEl.eref(), dimensionFinfo,dimension ); bool initconc = s->isSetInitialConcentration(); if ( dimension > 0 && initconc) { double size; get< double > (comptEl.eref(),sizeFinfo,size); transvalue *= size; } ::set< double >( molecule_, nInitFinfo, transvalue ); //initialAmount bool cons=s->getConstant(); bool bcondition = s->getBoundaryCondition(); if (cons){ ::set< int >( molecule_,modeFinfo,4 ); //cout << "set constant 4" << endl; }else if (bcondition) { ::set< int >( molecule_,modeFinfo,1 ); //cout << "set constant 1" << endl; }else { ::set< int >( molecule_,modeFinfo,0 ); //cout << "set constant 0" << endl; } } return molMap; }
/* 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; }