void AssignmentCycles::addReactionDependencies(const Model& m, const Reaction& object) { unsigned int ns; std::string thisId = object.getId(); /* loop thru the list of names in the Math * if they refer to a Reaction, an Assignment Rule * or an Initial Assignment add to the map * with the variable as key */ List* variables = object.getKineticLaw()->getMath() ->getListOfNodes( ASTNode_isName ); for (ns = 0; ns < variables->getSize(); ns++) { ASTNode* node = static_cast<ASTNode*>( variables->get(ns) ); string name = node->getName() ? node->getName() : ""; if (m.getReaction(name)) { mIdMap.insert(pair<const std::string, std::string>(thisId, name)); } else if (m.getRule(name) && m.getRule(name)->isAssignment()) { mIdMap.insert(pair<const std::string, std::string>(thisId, name)); } else if (m.getInitialAssignment(name)) { mIdMap.insert(pair<const std::string, std::string>(thisId, name)); } } delete variables; }
/* * Logs a message about species with boundary condition false * being set by reaction and rules */ void SpeciesReactionOrRule::logConflict (const Species& s, const Reaction& r) { msg = //"A <species>'s quantity cannot be determined simultaneously by both " //"reactions and rules. More formally, if the identifier of a <species> " //"definition having 'boundaryCondition'='false' and 'constant'='false' is " //"referenced by a <speciesReference> anywhere in a model, then this " //"identifier cannot also appear as the value of a 'variable' in an " //"<assignmentRule> or a <rateRule>. (References: L2V1 Section 4.6.5; L2V2 " //"Section 4.8.6; L2V3 Section 4.8.6.) "The species '"; msg += s.getId(); msg += "' occurs in both a rule and reaction '"; msg += r.getId(); msg += "'."; logFailure(s); }
/* * Logs a message about an undefined variable in the given * FunctionDefinition. */ void KineticLawVars::logUndefined ( const Reaction& r, const string& varname ) { msg = //"All species referenced in the <kineticLaw> formula of a given reaction " //"must first be declared using <speciesReference> or " //"<modifierSpeciesReference>. More formally, if a <species> identifier " //"appears in a 'ci' element of a <reaction>'s <kineticLaw> formula, that " //"same identifier must also appear in at least one <speciesReference> or " //"<modifierSpeciesReference> in the <reaction> definition. (References: " //"L2V2 Section 4.13.5; L2V3 Section 4.13.5.)" "The species '"; msg += varname; msg += "' is not listed as a product, reactant, or modifier of reaction '"; msg += r.getId(); msg += "'."; logFailure(r); }
TEST_F(SimpleReactionTest, CheckReaction) { using namespace std; using namespace Helios; using namespace Ace; using namespace AceReaction; McEnvironment* environment = new McEnvironment; string name = "92235.03c"; vector<McObject*> ace_objects; ace_objects.push_back(new AceObject(name)); /* Setup environment */ environment->pushObjects(ace_objects.begin(), ace_objects.end()); environment->setup(); /* Get isotope from ACE reader */ NeutronTable* ace_table = dynamic_cast<NeutronTable*>(AceReader::getTable(name)); /* Get reactions (inelastic scattering) */ ReactionContainer reactions = ace_table->getReactions(); /* Inelastic scattering cross section (don't include fission and elastic scattering) */ CrossSection inelastic_xs; /* Map of MT with cross sections */ map<int,CrossSection> mt_map; for(ReactionContainer::const_iterator it = reactions.begin() ; it != reactions.end() ; ++it) { /* Get angular distribution type */ int angular_data = (*it).getAngular().getKind(); /* If the reaction does not contains angular data, we reach the end "secondary" particle's reactions */ if(angular_data == Ace::AngularDistribution::no_data) break; /* Get MT of the reaction */ int mt = (*it).getMt(); /* We shouldn't include elastic and fission here */ if(mt != 18 && mt != 2) { /* Cross section */ CrossSection xs = (*it).getXs(); /* Sum this reaction */ inelastic_xs = inelastic_xs + xs; /* Put the cross section on the map */ mt_map[mt] = xs; } } /* Get energy grid */ vector<double> energy_grid = ace_table->getEnergyGrid(); /* Energy */ double energy = 5; /* Interpolate on energy grid */ size_t idx = upper_bound(energy_grid.begin(), energy_grid.end(), energy) - energy_grid.begin() - 1; double factor = (energy - energy_grid[idx]) / (energy_grid[idx + 1] - energy_grid[idx]); double inel_total = factor * (inelastic_xs[idx + 1] - inelastic_xs[idx]) + inelastic_xs[idx]; /* Reaction histogram */ map<int,double> reaction_prob; for(map<int,CrossSection>::const_iterator it = mt_map.begin() ; it != mt_map.end() ; ++it) { /* Inelastic xs at this energy (total and from this reaction) */ double inel_rea = factor * ((*it).second[idx + 1] - (*it).second[idx]) + (*it).second[idx]; double prob = inel_rea / inel_total; /* Save */ reaction_prob[(*it).first] = prob; } /* Sample reactions */ size_t nsamples = 100000000; /* Get isotope */ AceIsotope* isotope = environment->getObject<AceModule,AceIsotope>(name)[0]; /* Random number */ Random random(1); /* Samples */ map<int,double> reaction_samples; for(size_t i = 0 ; i < nsamples ; ++i) { Energy energy_pair(0,energy); Reaction* rea = isotope->inelastic(energy_pair,random); int mt = rea->getId(); reaction_samples[mt]++; } /* Collect samples and check results */ for(map<int,double>::iterator it = reaction_samples.begin() ; it != reaction_samples.end() ; ++it) { (*it).second /= (double)nsamples; /* Get difference */ double error = 100.0* fabs(reaction_prob[(*it).first] - (*it).second) / reaction_prob[(*it).first]; cout << setw(6) << (*it).first << setw(15) << scientific << (*it).second << setw(15) << reaction_prob[(*it).first] << setw(15) << error << endl; } delete environment; }
void readSpatialSBML() { SBMLDocument *document2 = readSBML("spatial_example0.xml"); Model *model2 = document2->getModel(); Compartment *comp; SpatialCompartmentPlugin* cplugin; RequiredElementsSBasePlugin* reqplugin; for (unsigned int i = 0; i < model2->getNumCompartments(); i++) { comp = model2->getCompartment(i); cout << "Compartment" << i << ": " << comp->getId() << endl; reqplugin = static_cast<RequiredElementsSBasePlugin*>(comp->getPlugin("req")); if (!reqplugin->getMathOverridden().empty()) { cout << "Comp" << i << " req mathOverridden: " << reqplugin->getMathOverridden() << endl; } cplugin = static_cast<SpatialCompartmentPlugin*>(comp->getPlugin("spatial")); if (cplugin->getCompartmentMapping()->isSetSpatialId()) { cout << "Comp" << i << " CMSpId: " << cplugin->getCompartmentMapping()->getSpatialId() << endl; cout << "Comp" << i << " CM_Comp: " << cplugin->getCompartmentMapping()->getCompartment() << endl; cout << "Comp" << i << " CM_DType: " << cplugin->getCompartmentMapping()->getDomainType() << endl; cout << "Comp" << i << " CM_UnitSz: " << cplugin->getCompartmentMapping()->getUnitSize() << endl; } } Species *sp; SpatialSpeciesRxnPlugin* srplugin; for (unsigned int i = 0; i < model2->getNumSpecies(); i++) { sp = model2->getSpecies(i); cout << "Species" << i << ": " << sp->getId() << endl; srplugin = static_cast<SpatialSpeciesRxnPlugin*>(sp->getPlugin("spatial")); if (srplugin->getIsSpatial()) { cout << "species" << i << " isSpatial: " << srplugin->getIsSpatial() << endl; } } Parameter *param; SpatialParameterPlugin* pplugin; for (unsigned int i = 0; i < model2->getNumParameters(); i++) { param = model2->getParameter(i); cout << "Parameter" << i << ": " << param->getId() << endl; reqplugin = static_cast<RequiredElementsSBasePlugin*>(param->getPlugin("req")); if (!reqplugin->getMathOverridden().empty()) { cout << "Parameter" << i << " req mathOverridden: " << reqplugin->getMathOverridden() << endl; } pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial")); if (pplugin->getSpatialSymbolReference()->isSetSpatialId()) { cout << "Parameter" << i << " SpRefId: " << pplugin->getSpatialSymbolReference()->getSpatialId() << endl; cout << "Parameter" << i << " SpRefType: " << pplugin->getSpatialSymbolReference()->getType() << endl; } if (pplugin->getDiffusionCoefficient()->isSetVariable()) { cout << "Diff_" << i << " SpeciesVarId: " << pplugin->getDiffusionCoefficient()->getVariable() << endl; cout << "Diff_" << i << " SpCoordIndex: " << pplugin->getDiffusionCoefficient()->getCoordinateIndex() << endl; } if (pplugin->getAdvectionCoefficient()->isSetVariable()) { cout << "Adv_" << i << " SpeciesVarId: " << pplugin->getAdvectionCoefficient()->getVariable() << endl; cout << "Adv_" << i << " SpCoordIndex: " << pplugin->getAdvectionCoefficient()->getCoordinateIndex() << endl; } if (pplugin->getBoundaryCondition()->isSetVariable()) { cout << "BC_" << i << " SpeciesVarId: " << pplugin->getBoundaryCondition()->getVariable() << endl; cout << "BC_" << i << " SpCoordBoundary: " << pplugin->getBoundaryCondition()->getCoordinateBoundary() << endl; cout << "BC_" << i << " SpBoundaryType: " << pplugin->getBoundaryCondition()->getType() << endl; } } Reaction *rxn; for (unsigned int i = 0; i < model2->getNumReactions(); i++) { rxn = model2->getReaction(i); cout << "Reaction" << i << ": " << rxn->getId() << endl; srplugin = static_cast<SpatialSpeciesRxnPlugin*>(rxn->getPlugin("spatial")); if (srplugin->getIsLocal()) { cout << "rxn" << i << " isLocal: " << srplugin->getIsLocal() << endl; } } Rule *rule; for (unsigned int i = 0; i < model2->getNumRules(); i++) { rule = model2->getRule(i); cout << "Rule" << i << ": " << rule->getVariable() << endl; } // // Get a SpatialModelPlugin object plugged in the model object. // // The type of the returned value of SBase::getPlugin() function is // SBasePlugin*, and thus the value needs to be cast for the // corresponding derived class. // SpatialModelPlugin* mplugin2; mplugin2 = static_cast<SpatialModelPlugin*>(model2->getPlugin("spatial")); cout << "URI: " << mplugin2->getURI() << endl; cout << "prefix: " << mplugin2->getPrefix() << endl; // get a Geometry object via SpatialModelPlugin object. Geometry* geometry2 = mplugin2->getGeometry(); cout << "Geometry coordSystem: " << geometry2->getCoordinateSystem() << endl; // get a CoordComponent object via the Geometry object. CoordinateComponent* coordComp = geometry2->getCoordinateComponent(0); std::cout << "CoordComponent spatialId: " << coordComp->getSpatialId() << std::endl; std::cout << "CoordComponent compType: " << coordComp->getComponentType() << std::endl; std::cout << "CoordComponent sbmlUnit: " << coordComp->getSbmlUnit() << std::endl; std::cout << "CoordComponent index: " << coordComp->getIndex() << std::endl; BoundaryMin* minX = coordComp->getBoundaryMin(); std::cout << "minX name: " << minX->getSpatialId() << std::endl; std::cout << "minX value: " << minX->getValue() << std::endl; BoundaryMax* maxX = coordComp->getBoundaryMax(); std::cout << "maxX name: " << maxX->getSpatialId() << std::endl; std::cout << "maxX value: " << maxX->getValue() << std::endl; // get a DomainType object via the Geometry object. DomainType* domainType2 = geometry2->getDomainType(0); std::cout << "DomainType spatialId: " << domainType2->getSpatialId() << std::endl; std::cout << "DomainType spatialDim: " << domainType2->getSpatialDimensions() << std::endl; // get a Domain object via the Geometry object. Domain* domain = geometry2->getDomain(0); std::cout << "Domain1 spatialId: " << domain->getSpatialId() << std::endl; std::cout << "Domain1 implicit: " << domain->getImplicit() << std::endl; std::cout << "Domain1 domainType: " << domain->getDomainType() << std::endl; std::cout << "Domain1 Shape: " << domain->getShapeId() << std::endl; // get an internal point via the domain object InteriorPoint* internalPt = domain->getInteriorPoint(0); std::cout << "InternalPt_1 coord1: " << internalPt->getCoord1() << std::endl; // get a Domain object via the Geometry object. domain = geometry2->getDomain(1); std::cout << "Domain2 spatialId: " << domain->getSpatialId() << std::endl; std::cout << "Domain2 implicit: " << domain->getImplicit() << std::endl; std::cout << "Domain2 domainType: " << domain->getDomainType() << std::endl; std::cout << "Domain2 Shape: " << domain->getShapeId() << std::endl; // get an internal point via the domain object internalPt = domain->getInteriorPoint(0); std::cout << "InternalPt_2 coord1: " << internalPt->getCoord1() << std::endl; // get an AdjacentDomains object via the Geometry object. AdjacentDomains* adjDomain = geometry2->getAdjacentDomains(0); std::cout << "AdjDomain spatialId: " << adjDomain->getSpatialId() << std::endl; std::cout << "AdjDomain domain1: " << adjDomain->getDomain1() << std::endl; std::cout << "AdjDomain domain2: " << adjDomain->getDomain2() << std::endl; // get the different GeometryDefinition objects via the Geometry object. GeometryDefinition* gd; for (unsigned int i = 0; i < geometry2->getNumGeometryDefinitions(); i++) { gd = geometry2->getGeometryDefinition(i); if (gd->isAnalyticGeometry()) { AnalyticGeometry* analyticalGeom = static_cast<AnalyticGeometry*>(gd); std::cout << "AnalGeom spatialId: " << analyticalGeom->getSpatialId() << std::endl; // analVol from analGeom. AnalyticVolume* av = analyticalGeom->getAnalyticVolume(0); std::cout << "AnalVol spatialId: " << av->getSpatialId() << std::endl; std::cout << "AnalVol domainType: " << av->getDomainType() << std::endl; std::cout << "AnalVol funcType: " << av->getFunctionType() << std::endl; std::cout << "AnalVol ordinal: " << av->getOrdinal() << std::endl; const ASTNode* mathNode = av->getMath(); char* mathStr = writeMathMLToString(mathNode); std::cout << "AnalVol math: " << mathStr << std::endl; } if (gd->isSampledFieldGeometry()) { SampledFieldGeometry* sfGeom = static_cast<SampledFieldGeometry*>(gd); std::cout << "SampledFieldGeom spatialId: " << sfGeom->getSpatialId() << std::endl; // sampledField from sfGeom SampledField* sf = sfGeom->getSampledField(); std::cout << "SampledField spatialId: " << sf->getSpatialId() << std::endl; std::cout << "SampledField dataType: " << sf->getDataType() << std::endl; std::cout << "SampledField interpolation: " << sf->getInterpolationType() << std::endl; std::cout << "SampledField encoding: " << sf->getEncoding() << std::endl; std::cout << "SampledField numSamples1: " << sf->getNumSamples1() << std::endl; std::cout << "SampledField numSamples2: " << sf->getNumSamples2() << std::endl; std::cout << "SampledField numSamples3: " << sf->getNumSamples3() << std::endl; const ImageData* id = sf->getImageData(); int* samples = new int[id->getSamplesLength()]; id->getSamples(samples); std::cout << "ImageData samples[0]: " << samples[0] << std::endl; std::cout << "ImageData samplesLen: " << id->getSamplesLength() << std::endl; std::cout << "ImageData dataType: " << id->getDataType() << std::endl; // sampledVolVol from sfGeom. SampledVolume* sv = sfGeom->getSampledVolume(0); std::cout << "SampledVol spatialId: " << sv->getSpatialId() << std::endl; std::cout << "SampledVol domainType: " << sv->getDomainType() << std::endl; std::cout << "SampledVol sampledVal: " << sv->getSampledValue() << std::endl; std::cout << "SampledVol min: " << sv->getMinValue() << std::endl; std::cout << "SampledVol max: " << sv->getMaxValue() << std::endl; } if (gd->isParametricGeometry()) { ParametricGeometry* pGeom = static_cast<ParametricGeometry*>(gd); std::cout << "ParametricGeometry spatialId: " << pGeom->getSpatialId() << std::endl; // parametricObject from pGeom ParametricObject* pObj = pGeom->getParametricObject(0); std::cout << "ParametricObj spatialId: " << pObj->getSpatialId() << std::endl; std::cout << "ParametricObj domain: " << pObj->getDomain() << std::endl; std::cout << "ParametricObj polygonType: " << pObj->getPolygonType() << std::endl; const PolygonObject* po = pObj->getPolygonObject(); int* ptInd = new int[po->getIndicesLength()]; po->getPointIndices(ptInd); std::cout << "PolygonObj ptIndices[0]: " << ptInd[0] << std::endl; std::cout << "PolygonObj indLen: " << po->getIndicesLength() << std::endl; // SpatialPoint from pGeom. SpatialPoint* sp = pGeom->getSpatialPoint(0); std::cout << "SpatialPt spatialId: " << sp->getSpatialId() << std::endl; std::cout << "SpatialPt domain: " << sp->getDomain() << std::endl; std::cout << "SpatialPt coord1: " << sp->getCoord1() << std::endl; std::cout << "SpatialPt coord2: " << sp->getCoord2() << std::endl; std::cout << "SpatialPt coord3: " << sp->getCoord3() << std::endl; } if (gd->isCSGeometry()) { CSGeometry* csGeom = static_cast<CSGeometry*>(gd); std::cout << "CSGeometry spatialId: " << csGeom->getSpatialId() << std::endl; // CSGObject-CSGOperator from csGeom CSGObject* csgo; for (unsigned int i = 0; i < csGeom->getNumCSGObjects(); i++) { csgo = csGeom->getCSGObject(i); std::cout << "CSGObject spatialId: " << csgo->getSpatialId() << std::endl; std::cout << "CSGObject domainType: " << csgo->getDomainType() << std::endl; const CSGNode* csgnode = csgo->getCSGNodeRoot(); if (csgnode->isCSGTransformation()) { CSGTransformation* transf = (CSGTransformation*)csgnode; if (transf->isCSGScale()) { CSGScale* scale = static_cast<CSGScale*>(transf); std::cout << "CSGScale scaleX: " << scale->getScaleX() << std::endl; std::cout << "CSGScale scaleY: " << scale->getScaleY() << std::endl; std::cout << "CSGScale scaleZ: " << scale->getScaleZ() << std::endl; const CSGNode* scaleChild = scale->getChild(); if (scaleChild->isCSGPrimitive()) { CSGPrimitive* prim = (CSGPrimitive*)scaleChild; std::cout << "CSGPrimitive primitiveType: " << prim->getPrimitiveType() << std::endl; } } } if (csgnode->isCSGSetOperator()) { CSGSetOperator* setop = (CSGSetOperator*)(csgnode); std::cout << "CSGSetOperator opType: " << setop->getOperationType() << std::endl; for (unsigned int k = 0; k < setop->getNumCSGNodeChildren(); k++) { CSGNode* csgNode = setop->getCSGNodeChild(k); std::cout << "CSGNode type: " << csgNode->getTypeCode() << std::endl; } } } } } delete document2; }
/** * Load a gene network from an SBML file. Overrides Structure.load(). Format must * be equal GeneNetwork.SBML. Note, the SBML file must be in the exact same format * as the SBML files produced by writeSBML(). In particular, we assume that reactions are listed * *ordered* as we do in writeSBML(). * @param filename URL to the file describing the network to load * @param format File format (GML, DOT, etc.) * @throws IOException */ void GeneNetwork::load_sbml(const char *filename) { SBMLDocument* document; SBMLReader reader; document = reader.readSBML(filename); unsigned int errors = document->getNumErrors(); if (errors > 0) { std::cerr << "Failed to open file " << filename << std::endl; exit(1); } Model *m = document->getModel(); // ----------------------------------------- // Set the network size and create the genes // do not count the species _void_ int size = m->getNumSpecies() - 1; ListOfSpecies *species = m->getListOfSpecies(); for (int g=0; g < size; g++) { if (species->get(g)->getId() != "_void_") { //HillGene hg = new HillGene(this); //hg.setLabel(species.get(g).getId()); HillGene *n = new HillGene(species->get(g)->getId()); //n.setLabel(species->get(g)->getId()); nodes_.push_back(*n); delete n; } } x_ = Vec_DP(nodes_.size()); x_ = 0; y_ = Vec_DP(nodes_.size()); y_ = 0; //vector<string> parameterNames; // the names of the parameters //vector<double> parameterValues; // the values of the parameters std::map<std::string, double> params; std::vector<std::string> inputNodes; // the indexes of the inputs HillGene src, tgt; Parameter *param; // 2 loops for one gene: both synthesis and degradation reactions // (we assume that reactions are listed *ordered* as we do in writeSBML()) //int counter = 0; for (unsigned int i=0; i < m->getNumReactions(); i++) { Reaction *re = m->getReaction(i); std::string id = re->getId(); std::stringstream ss; ss << i; //::logging::log::emit<Debug>() << id.c_str() << // ::logging::log::endl; tgt = nodes_.at(getIndexOfNode(getGeneReactantId(id))); //tgt->setLabel(getGeneReactantId(*re)); //SpeciesReference *rt = re->getReactant(0); //Node *tgt = new HillGene(); //tgt->setLabel(rt->getSpecies()); //ListOfSpeciesReferences *modifiers = re->getListOfModifiers(); for (unsigned int j=0; j < re->getNumModifiers(); j++) { ModifierSpeciesReference *md = re->getModifier(j); src = nodes_.at(getIndexOfNode(md->getSpecies())); inputNodes.push_back(src.getLabel()); // set output genes std::vector<std::string> outputs = src.getOutputGenes(); outputs.push_back(tgt.getLabel()); src.setOutputGenes(outputs); // The edge type is unknown for now, it is initialized later Edge *e = new Edge(&src, &tgt, "+-"); edges_.push_back(*e); //delete src; delete e; } KineticLaw *kl = re->getKineticLaw(); for(unsigned int j=0; j < kl->getNumParameters(); j++) { param = kl->getParameter(j); params[param->getId()] = param->getValue(); //char buf[256]; //sprintf(buf, "%s\t%f", param->getId().c_str(), param->getValue()); //::logging::log::emit<Info>() << buf << ::logging::log::endl; } //::logging::log::emit<Info>() << ::logging::log::dec << params.size() << // ::logging::log::endl; // in the second iteration for this gene if (i%2 == 1) { // set parameters in gene //tgt.initialization(params, inputNodes); nodes_.at(getIndexOfNode(getGeneReactantId(id))).initialization(params, inputNodes);; //char buf[256]; //sprintf(buf, "%f", params["k_1"]); //::logging::log::emit<Info>() << buf << ::logging::log::endl; inputNodes.clear(); // don't clear because the reference was copied to the gene //parameterNames.clear(); // reset (they were not copied) //parameterValues.clear(); params.clear(); } //counter++; } //setEdgeTypesAccordingToDynamicalModel(); //signed_ = true; //delete document; //delete n; //delete e; }
void SBML_sim::loadSBML(SBMLDocument * doc) { if (!doc || doc->getNumErrors() > 0) { } else { Model * model = doc->getModel(); ListOfParameters * params = model->getListOfParameters(); ListOfReactions * reacs = model->getListOfReactions(); ListOfSpecies * species = model->getListOfSpecies(); ListOfSpeciesTypes * types = model->getListOfSpeciesTypes(); ListOfEvents * events = model->getListOfEvents(); ListOfRules * rules = model->getListOfRules(); vector<string> assignmentEquations, rateEquations, eventTriggers; vector< vector<string> > eventResponses; if (events) for (int i=0; i < events->size(); ++i) { Event * e = events->get(i); eventTriggers.push_back( SBML_formulaToString( e->getTrigger()->getMath() ) ); ListOfEventAssignments * eventAssn = e->getListOfEventAssignments(); vector<string> responses; string s; for (int j=0; j < eventAssn->size(); ++j) { s = eventAssn->get(j)->getVariable(); s.append("="); s.append( SBML_formulaToString( eventAssn->get(j)->getMath() ) ); responses.push_back(s); } eventResponses.push_back( responses ); } if (rules) for (int i=0; i < rules->size(); ++i) { Rule * r = rules->get(i); if (r->isAssignment()) { AssignmentRule * ar = (AssignmentRule*)r; assignmentVariables.push_back(ar->getVariable()); assignmentValues.push_back(1.0); assignmentEquations.push_back(ar->getFormula()); } } if (species) for (int i=0; i < species->size(); ++i) if (!species->get(i)->getConstant() && !species->get(i)->getBoundaryCondition()) { variableNames.push_back(species->get(i)->getId()); if (species->get(i)->isSetInitialAmount()) variableValues.push_back(species->get(i)->getInitialAmount()); else if (species->get(i)->isSetInitialConcentration()) variableValues.push_back(species->get(i)->getInitialConcentration()); else variableValues.push_back(0.0); } else { parameterNames.push_back(species->get(i)->getId()); if (species->get(i)->isSetInitialAmount()) parameterValues.push_back(species->get(i)->getInitialAmount()); else if (species->get(i)->isSetInitialConcentration()) parameterValues.push_back(species->get(i)->getInitialConcentration()); else parameterValues.push_back(0.0); } if (params) for (int i=0; i < params->size(); ++i) { parameterNames.push_back(params->get(i)->getId()); parameterValues.push_back(params->get(i)->getValue()); } int numReacs = 0; if (reacs) numReacs = reacs->size(); stoichiometryMatrix = new double[ numReacs * variableNames.size() ]; for (int i=0; i < numReacs; ++i) { Reaction * r = reacs->get(i); reactionNames.push_back(r->getId()); rateEquations.push_back(r->getKineticLaw()->getFormula()); ListOfSpeciesReferences * reactants = r->getListOfReactants(), * products = r->getListOfProducts(); for (int j=0; j < variableNames.size(); ++j) { stoichiometryMatrix[ j*numReacs + i ] = 0.0; for (int k=0; k < reactants->size(); ++k) if (reactants->get(k) && reactants->get(k)->getSpecies() == variableNames[j]) stoichiometryMatrix[ j*numReacs + i ] -= 1.0; //stoichiometryMatrix[ j*numReacs + i ] -= SpeciesReference_getStoichiometry(reactants->get(k)); for (int k=0; k < products->size(); ++k) if (products->get(k) && products->get(k)->getSpecies() == variableNames[j]) stoichiometryMatrix[ j*numReacs + i ] += 1.0; //stoichiometryMatrix[ j*numReacs + i ] += SpeciesReference_getStoichiometry(reactants->get(k)); } } for (int i=0; i < rateEquations.size(); ++i) { mu::Parser p; addSBMLFunctions(p); p.SetExpr(rateEquations[i]); for (int j=0; j < variableNames.size(); ++j) p.DefineVar("time",&(this->time)); for (int j=0; j < variableNames.size(); ++j) p.DefineVar("Time",&(this->time)); for (int j=0; j < variableNames.size(); ++j) p.DefineVar(variableNames[j],&variableValues[j]); for (int j=0; j < parameterNames.size(); ++j) p.DefineVar(parameterNames[j],¶meterValues[j]); for (int j=0; j < assignmentVariables.size(); ++j) p.DefineVar(assignmentVariables[j],&assignmentValues[j]); p.SetVarFactory(muparser_add_variable, (void*)this); try { p.Eval(); rateEqns.push_back(p); } catch(...) { //reactionNames.clear(); //rateEqns.clear(); break; } } for (int i=0; i < assignmentEquations.size(); ++i) { mu::Parser p; addSBMLFunctions(p); p.SetExpr(assignmentEquations[i]); for (int j=0; j < variableNames.size(); ++j) p.DefineVar(variableNames[j],&variableValues[j]); for (int j=0; j < parameterNames.size(); ++j) p.DefineVar(parameterNames[j],¶meterValues[j]); for (int j=0; j < assignmentVariables.size(); ++j) p.DefineVar(assignmentVariables[j],&assignmentValues[j]); //p.SetVarFactory(muparser_add_variable, (void*)this); try { p.Eval(); assignmentEqns.push_back(p); } catch(...) { std::cout << assignmentEquations[i] << std::endl; //assignmentVariables.clear(); //assignmentEqns.clear(); break; } } for (int i=0; i < eventTriggers.size(); ++i) { mu::Parser p; addSBMLFunctions(p); p.SetExpr(eventTriggers[i]); for (int j=0; j < variableNames.size(); ++j) p.DefineVar("time",&(this->time)); for (int j=0; j < variableNames.size(); ++j) p.DefineVar("Time",&(this->time)); for (int j=0; j < variableNames.size(); ++j) p.DefineVar(variableNames[j],&variableValues[j]); for (int j=0; j < parameterNames.size(); ++j) p.DefineVar(parameterNames[j],¶meterValues[j]); for (int j=0; j < assignmentVariables.size(); ++j) p.DefineVar(assignmentVariables[j],&assignmentValues[j]); try { p.Eval(); //resposes for the trigger vector<mu::Parser> responses; for (int j=0; j < eventResponses[i].size(); ++j) { mu::Parser p; addSBMLFunctions(p); p.SetExpr(eventResponses[i][j]); try { p.Eval(); responses.push_back(p); } catch(...) {} } if (responses.size() > 0) { triggerEqns.push_back(p); responseEqns.push_back(responses); } } catch(...) { //assignmentVariables.clear(); //assignmentEqns.clear(); break; } } //delete params; //delete reacs; } }
//create REACTION void SbmlReader::createReaction( map< string,Id > &molMap ) { map< string,double > rctMap; map< string,double >::iterator rctMap_iter; map< string,double >pdtMap; map< string,double >::iterator pdtMap_iter; map< string,Eref >::iterator elemt_iter; map< string,EnzymeInfo >enzInfoMap; double rctorder,pdtorder; static const Cinfo* moleculeCinfo = initMoleculeCinfo(); static const Finfo* reacFinfo =moleculeCinfo->findFinfo( "reac" ); static const Cinfo* reactionCinfo = initReactionCinfo(); static const Finfo* subFinfo = reactionCinfo->findFinfo( "sub" ); static const Finfo* prdFinfo = reactionCinfo->findFinfo( "prd" ); static const Finfo* kfFinfo = reactionCinfo->findFinfo( "kf" ); static const Finfo* kbFinfo = reactionCinfo->findFinfo( "kb" ); Reaction* reac; for ( unsigned int r = 0; r < model_->getNumReactions(); r++ ) { reac = model_->getReaction( r ); const string id=reac->getId(); //cout<<"reaction is "<<id<<endl; std::string name; if ( reac->isSetName() ){ name = reac->getName(); } string grpname = getAnnotation( reac,enzInfoMap ); if ( (grpname != "") && (enzInfoMap[grpname].stage == 3) ) setupEnzymaticReaction( enzInfoMap[grpname],grpname ); else if ( grpname == "" ) { if ( reac->getNumModifiers()> 0 ) setupMMEnzymeReaction( reac,id ); else{ bool rev=reac->getReversible(); bool fast=reac->getFast(); if ( fast ){ cout<<"warning: for now fast attribute is not handled"<<endl; errorFlag_ = true; } int numRcts = reac->getNumReactants(); int numPdts = reac->getNumProducts(); if ( numRcts == 0 && numPdts != 0 ){ const SpeciesReference* pdt = reac->getProduct( 0 ); std::string spName = pdt->getSpecies(); Id parent = molMap.find( spName )->second; //gives compartment of spName string parentCompt = parent()->name(); //cout<<"parent of reactant :"<<parentCompt<<endl; ostringstream spId; spId <<id<<"_Src"; molecule_ = Neutral::create( "Molecule",spId.str(),parent,Id::scratchId() );//create Molecule molMap[spId.str()] = parent; elmtMap_[spId.str()] = Eref( molecule_ ); ::set< double >( molecule_,"conc", 1 ); ::set< int >( molecule_,"mode",4 ); reaction_ = Neutral::create( "Reaction",id,parent,Id::scratchId() ); //create Reaction Eref( reaction_ ).add( subFinfo->msg(),elmtMap_[spId.str()],reacFinfo->msg(),ConnTainer::Default ); } else{ const SpeciesReference* rect=reac->getReactant(0); std::string sp=rect->getSpecies(); Id m = molMap.find(sp)->second; //gives compartment of sp reaction_ = Neutral::create( "Reaction",id,m,Id::scratchId() ); //create Reaction double rctcount=0.0; rctMap.clear(); for ( unsigned int rt=0;rt<reac->getNumReactants();rt++ ) { const SpeciesReference* rct=reac->getReactant(rt); sp=rct->getSpecies(); rctMap_iter = rctMap.find(sp); if ( rctMap_iter != rctMap.end() ){ rctcount = rctMap_iter->second; } else { rctcount = 0.0; } rctcount += rct->getStoichiometry(); rctMap[sp] = rctcount; for ( int i=0;(int)i<rct->getStoichiometry();i++ ) { Eref(reaction_).add( subFinfo->msg(),elmtMap_[sp],reacFinfo->msg(),ConnTainer::Default ); } } } double pdtcount = 0.0; pdtMap.clear(); for ( unsigned int pt=0;pt<reac->getNumProducts();pt++ ) { const SpeciesReference* pdt=reac->getProduct(pt); std::string sp=pdt->getSpecies(); pdtMap_iter = pdtMap.find(sp); if ( pdtMap_iter != pdtMap.end() ){ pdtcount = pdtMap_iter->second; } else { pdtcount = 0.0; } pdtcount += pdt->getStoichiometry(); pdtMap[sp] = pdtcount; for ( int i=0;i<pdt->getStoichiometry();i++ ) { Eref(reaction_).add( prdFinfo->msg(),elmtMap_[sp],reacFinfo->msg(),ConnTainer::Default ); } } //order of reactants rctorder = 0.0; string rsp = "",psp = ""; for ( rctMap_iter=rctMap.begin();rctMap_iter!=rctMap.end();rctMap_iter++ ) { rctorder += rctMap_iter->second; rsp=rctMap_iter->first; //species of the reactant } //cout<<"rct order = "<<rctorder<<endl; //order of products pdtorder = 0.0; for ( pdtMap_iter=pdtMap.begin();pdtMap_iter!=pdtMap.end();pdtMap_iter++ ) { pdtorder += pdtMap_iter->second; psp=pdtMap_iter->first; //species of the product } //cout<<"pdt order = "<<pdtorder<<endl; if ( reac->isSetKineticLaw() ) { KineticLaw * klaw=reac->getKineticLaw(); //vector< double > rate = getKLaw( klaw,rev ); vector< double > rate; rate.clear(); getKLaw( klaw,rev,rate ); if ( errorFlag_ ) return; else if ( !errorFlag_ ){ ::set< double >( reaction_, kfFinfo, rate[0] ); ::set< double >( reaction_, kbFinfo, rate[1] ); } } }//else modifier }//else }//reaction }//create reaction
void CompIdBase::checkId (const Reaction& x) { if (x.isSetId()) doCheckId(x.getId(), x); }
void readSpatialSBML() { SBMLDocument *document2 = readSBML("spatial_example2.xml"); Model *model2 = document2->getModel(); Compartment *comp; SpatialCompartmentPlugin* cplugin; for (unsigned int i = 0; i < model2->getNumCompartments(); i++) { comp = model2->getCompartment(i); cout << "Compartment" << i << ": " << comp->getId() << endl; cplugin = static_cast<SpatialCompartmentPlugin*>(comp->getPlugin("spatial")); if (cplugin->getCompartmentMapping()->isSetId()) { cout << "Comp" << i << " CMSpId: " << cplugin->getCompartmentMapping()->getId() << endl; cout << "Comp" << i << " CM_DType: " << cplugin->getCompartmentMapping()->getDomainType() << endl; cout << "Comp" << i << " CM_UnitSz: " << cplugin->getCompartmentMapping()->getUnitSize() << endl; } } Species *sp; SpatialSpeciesPlugin* srplugin; for (unsigned int i = 0; i < model2->getNumSpecies(); i++) { sp = model2->getSpecies(i); cout << "Species" << i << ": " << sp->getId() << endl; srplugin = static_cast<SpatialSpeciesPlugin*>(sp->getPlugin("spatial")); if (srplugin->getIsSpatial()) { cout << "species" << i << " isSpatial: " << srplugin->getIsSpatial() << endl; } } Parameter *param; SpatialParameterPlugin* pplugin; for (unsigned int i = 0; i < model2->getNumParameters(); i++) { param = model2->getParameter(i); cout << "Parameter" << i << ": " << param->getId() << endl; pplugin = static_cast<SpatialParameterPlugin*>(param->getPlugin("spatial")); if (pplugin->isSetSpatialSymbolReference()) { cout << "Parameter" << i << " SpRefId: " << pplugin->getSpatialSymbolReference()->getSpatialRef() << endl; } if (pplugin->isSetDiffusionCoefficient()) { cout << "Diff_" << i << " SpeciesVarId: " << pplugin->getDiffusionCoefficient()->getVariable() << endl; cout << "Diff_" << i << " Type: " << DiffusionKind_toString(pplugin->getDiffusionCoefficient()->getType()) << endl; for (unsigned int j = 0; j < pplugin->getDiffusionCoefficient()->getNumCoordinateReferences(); ++j) cout << "Diff_" << i << " SpCoordIndex " << j << " : " << CoordinateKind_toString(pplugin->getDiffusionCoefficient()->getCoordinateReference(j) ->getCoordinate()) << endl; } if (pplugin->isSetAdvectionCoefficient()) { cout << "Adv_" << i << " SpeciesVarId: " << pplugin->getAdvectionCoefficient()->getVariable() << endl; cout << "Adv_" << i << " SpCoordIndex: " << CoordinateKind_toString(pplugin->getAdvectionCoefficient()->getCoordinate()) << endl; } if (pplugin->isSetBoundaryCondition()) { cout << "BC_" << i << " SpeciesVarId: " << pplugin->getBoundaryCondition()->getVariable() << endl; cout << "BC_" << i << " SpCoordBoundary: " << pplugin->getBoundaryCondition()->getCoordinateBoundary() << endl; cout << "BC_" << i << " SpBoundaryType: " << pplugin->getBoundaryCondition()->getType() << endl; } } Reaction *rxn; SpatialReactionPlugin* rplugin; for (unsigned int i = 0; i < model2->getNumReactions(); i++) { rxn = model2->getReaction(i); cout << "Reaction" << i << ": " << rxn->getId() << endl; rplugin = static_cast<SpatialReactionPlugin*>(rxn->getPlugin("spatial")); if (rplugin->getIsLocal()) { cout << "rxn" << i << " isLocal: " << rplugin->getIsLocal() << endl; } } Rule *rule; for (unsigned int i = 0; i < model2->getNumRules(); i++) { rule = model2->getRule(i); cout << "Rule" << i << ": " << rule->getVariable() << endl; } // // Get a SpatialModelPlugin object plugged in the model object. // // The type of the returned value of SBase::getPlugin() function is // SBasePlugin*, and thus the value needs to be cast for the // corresponding derived class. // SpatialModelPlugin* mplugin2; mplugin2 = static_cast<SpatialModelPlugin*>(model2->getPlugin("spatial")); cout << "URI: " << mplugin2->getURI() << endl; cout << "prefix: " << mplugin2->getPrefix() << endl; // get a Geometry object via SpatialModelPlugin object. Geometry* geometry2 = mplugin2->getGeometry(); cout << "Geometry coordSystem: " << geometry2->getCoordinateSystem() << endl; // get a CoordComponent object via the Geometry object. CoordinateComponent* coordComp = geometry2->getCoordinateComponent(0); std::cout << "CoordComponent Id: " << coordComp->getId() << std::endl; std::cout << "CoordComponent type: " << CoordinateKind_toString( coordComp->getType()) << std::endl; std::cout << "CoordComponent sbmlUnit: " << coordComp->getUnit() << std::endl; if (coordComp->isSetBoundaryMin()) { Boundary* minX = coordComp->getBoundaryMin(); std::cout << "minX name: " << minX->getId() << std::endl; std::cout << "minX value: " << minX->getValue() << std::endl; } if (coordComp->isSetBoundaryMax()) { Boundary* maxX = coordComp->getBoundaryMax(); std::cout << "maxX name: " << maxX->getId() << std::endl; std::cout << "maxX value: " << maxX->getValue() << std::endl; } // get a DomainType object via the Geometry object. DomainType* domainType2 = geometry2->getDomainType(0); std::cout << "DomainType Id: " << domainType2->getId() << std::endl; std::cout << "DomainType spatialDim: " << domainType2->getSpatialDimension() << std::endl; // get a Domain object via the Geometry object. Domain* domain = geometry2->getDomain(0); std::cout << "Domain1 Id: " << domain->getId() << std::endl; std::cout << "Domain1 domainType: " << domain->getDomainType() << std::endl; // get an internal point via the domain object InteriorPoint* internalPt = domain->getInteriorPoint(0); std::cout << "InternalPt_1 coord1: " << internalPt->getCoord1() << std::endl; // get a Domain object via the Geometry object. domain = geometry2->getDomain(1); std::cout << "Domain2 Id: " << domain->getId() << std::endl; std::cout << "Domain2 domainType: " << domain->getDomainType() << std::endl; // get an internal point via the domain object internalPt = domain->getInteriorPoint(0); std::cout << "InternalPt_2 coord1: " << internalPt->getCoord1() << std::endl; // get an AdjacentDomains object via the Geometry object. AdjacentDomains* adjDomain = geometry2->getAdjacentDomains(0); std::cout << "AdjDomain Id: " << adjDomain->getId() << std::endl; std::cout << "AdjDomain domain1: " << adjDomain->getDomain1() << std::endl; std::cout << "AdjDomain domain2: " << adjDomain->getDomain2() << std::endl; // get an AnalyticGeometry object via the Geometry object. GeometryDefinition* gd; for (unsigned int i = 0; i < geometry2->getNumGeometryDefinitions(); i++) { gd = geometry2->getGeometryDefinition(i); if (gd->isAnalyticGeometry()) { AnalyticGeometry* analyticalGeom = static_cast<AnalyticGeometry*>(gd); std::cout << "AnalGeom Id: " << analyticalGeom->getId() << std::endl; // analVol from analGeom. AnalyticVolume* av = analyticalGeom->getAnalyticVolume(0); std::cout << "AnalVol Id: " << av->getId() << std::endl; std::cout << "AnalVol domainType: " << av->getDomainType() << std::endl; std::cout << "AnalVol funcType: " << av->getFunctionType() << std::endl; std::cout << "AnalVol ordinal: " << av->getOrdinal() << std::endl; const ASTNode* mathNode = av->getMath(); char* mathStr = writeMathMLToString(mathNode); std::cout << "AnalVol math: " << mathStr << std::endl; } if (gd->isSampledFieldGeometry()) { SampledFieldGeometry* sfGeom = static_cast<SampledFieldGeometry*>(gd); std::cout << "SampledFieldGeom Id: " << sfGeom->getId() << std::endl; // sampledField from sfGeom SampledField* sf = sfGeom->getSampledField(); std::cout << "SampledField Id: " << sf->getId() << std::endl; std::cout << "SampledField dataType: " << sf->getDataType() << std::endl; std::cout << "SampledField interpolation: " << sf->getInterpolationType() << std::endl; std::cout << "SampledField encoding: " << sf->getEncoding() << std::endl; std::cout << "SampledField numSamples1: " << sf->getNumSamples1() << std::endl; std::cout << "SampledField numSamples2: " << sf->getNumSamples2() << std::endl; std::cout << "SampledField numSamples3: " << sf->getNumSamples3() << std::endl; const ImageData* id = sf->getImageData(); int* samples = new int[id->getSamplesLength()]; id->getSamples(samples); std::cout << "ImageData samples[0]: " << samples[0] << std::endl; std::cout << "ImageData dtype: " << id->getDataType() << std::endl; std::cout << "ImageData samplesLen: " << id->getSamplesLength() << std::endl; // sampledVolVol from sfGeom. SampledVolume* sv = sfGeom->getSampledVolume(0); std::cout << "SampledVol Id: " << sv->getId() << std::endl; std::cout << "SampledVol domainType: " << sv->getDomainType() << std::endl; std::cout << "SampledVol sampledVal: " << sv->getSampledValue() << std::endl; std::cout << "SampledVol min: " << sv->getMinValue() << std::endl; std::cout << "SampledVol max: " << sv->getMaxValue() << std::endl; } } delete document2; }
//static void SBMLUtils::collectIds(Model* pModel, std::map<std::string, const SBase*>& ids, std::map<std::string, const SBase*>& metaIds) { if (pModel != NULL) { // the model itself SBase* pSBase = NULL; std::string id; if (pModel->isSetId()) { id = pModel->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pModel->isSetMetaId()) { id = pModel->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // ListOfFunctionDefinitions pSBase = pModel->getListOfFunctionDefinitions(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // all FunctionDefinitions unsigned int i, iMax = pModel->getListOfFunctionDefinitions()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getListOfFunctionDefinitions()->get(i); if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfUnitDefinition pSBase = pModel->getListOfUnitDefinitions(); if (pSBase != NULL) { if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // all UnitDefinitions // for each UnitDefinition: ListOfUnits, each Unit in ListOfUnits unsigned int i, iMax = pModel->getListOfUnitDefinitions()->size(); for (i = 0; i < iMax; ++i) { /* UnitDefinitions have their ids in a different namespace so we only consider meta ids. */ UnitDefinition* pUDef = pModel->getUnitDefinition(i); assert(pUDef != NULL); if (pUDef->isSetMetaId()) { id = pUDef->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pUDef)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } ListOf* pList = pUDef->getListOfUnits(); if (pList != NULL) { if (pList->isSetMetaId()) { id = pList->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pList)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } unsigned j, jMax = pList->size(); for (j = 0; j < jMax; ++j) { pSBase = pList->get(j); assert(pSBase != NULL); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } } } // ListOfCompartmentTypes pSBase = pModel->getListOfCompartmentTypes(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each compartment type unsigned int i, iMax = pModel->getListOfCompartmentTypes()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getCompartmentType(i); assert(pSBase != NULL); if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfSpeciesTypes pSBase = pModel->getListOfSpeciesTypes(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each species type unsigned int i, iMax = pModel->getListOfSpeciesTypes()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getSpeciesType(i); assert(pSBase != NULL); if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfCompartments pSBase = pModel->getListOfCompartments(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // all compartments unsigned int i, iMax = pModel->getListOfCompartments()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getCompartment(i); assert(pSBase != NULL); if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfSpecies pSBase = pModel->getListOfSpecies(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // all species unsigned int i, iMax = pModel->getListOfSpecies()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getSpecies(i); assert(pSBase != NULL); if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfParameters pSBase = pModel->getListOfParameters(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each parameter unsigned int i, iMax = pModel->getListOfParameters()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getParameter(i); assert(pSBase != NULL); if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfInitialAssignments pSBase = pModel->getListOfInitialAssignments(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each initial assignment unsigned int i, iMax = pModel->getListOfInitialAssignments()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getInitialAssignment(i); assert(pSBase != NULL); // initial assignments have no ids if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfRules pSBase = pModel->getListOfRules(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each rule unsigned int i, iMax = pModel->getListOfRules()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getRule(i); assert(pSBase != NULL); // rules don't have ids if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfConstraints pSBase = pModel->getListOfConstraints(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each constraint unsigned int i, iMax = pModel->getListOfConstraints()->size(); for (i = 0; i < iMax; ++i) { pSBase = pModel->getConstraint(i); assert(pSBase != NULL); // constraints don't have ids if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } // ListOfReactions pSBase = pModel->getListOfReactions(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // all reactions unsigned int i, iMax = pModel->getListOfReactions()->size(); for (i = 0; i < iMax; ++i) { Reaction* pReaction = pModel->getReaction(i); assert(pReaction != NULL); if (pReaction->isSetId()) { id = pReaction->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pReaction)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pReaction->isSetMetaId()) { id = pReaction->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pReaction)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // for each reaction: ListOfSubstrates, each substrate, ListOfProducts, each // Product, ListOfModifieres, each modifier, KineticLaw, ListOfparameters, // each parameter if (pReaction->getListOfReactants() != NULL) { pSBase = pReaction->getListOfReactants(); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } unsigned int j, jMax = pReaction->getListOfReactants()->size(); for (j = 0; j < jMax; ++j) { pSBase = pReaction->getReactant(j); assert(pSBase != NULL); // since L2V2 species references can have ids if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } if (pReaction->getListOfProducts() != NULL) { pSBase = pReaction->getListOfProducts(); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } unsigned int j, jMax = pReaction->getListOfProducts()->size(); for (j = 0; j < jMax; ++j) { pSBase = pReaction->getProduct(j); assert(pSBase != NULL); // since L2V2 species references can have ids if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } if (pReaction->getListOfModifiers() != NULL) { pSBase = pReaction->getListOfModifiers(); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } unsigned int j, jMax = pReaction->getListOfModifiers()->size(); for (j = 0; j < jMax; ++j) { pSBase = pReaction->getModifier(j); assert(pSBase != NULL); // since L2V2 species references can have ids if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } KineticLaw* pKLaw = pReaction->getKineticLaw(); if (pKLaw != NULL) { if (pKLaw->isSetMetaId()) { id = pKLaw->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pKLaw)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } pSBase = pKLaw->getListOfParameters(); if (pSBase != NULL) { if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } unsigned int j, jMax = pKLaw->getListOfParameters()->size(); for (j = 0; j < jMax; ++j) { pSBase = pKLaw->getParameter(j); assert(pSBase != NULL); // local parameters have their ids in a // different namespace if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } } } } // ListOfEvents pSBase = pModel->getListOfEvents(); if (pSBase != NULL) { if (pSBase->isSetId()) { id = pSBase->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pModel)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // each event unsigned int i, iMax = pModel->getListOfEvents()->size(); for (i = 0; i < iMax; ++i) { Event* pEvent = pModel->getEvent(i); assert(pEvent != NULL); if (pEvent->isSetId()) { id = pEvent->getId(); if (ids.find(id) == ids.end()) { ids.insert(std::pair<const std::string, const SBase*>(id, pEvent)); } else { CCopasiMessage(CCopasiMessage::EXCEPTION, MCSBML + 68, id.c_str()); } } if (pEvent->isSetMetaId()) { id = pEvent->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pEvent)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } // in each event Trigger,Delay,ListOfEventAssignments, each event assignment if (pEvent->isSetTrigger()) { pSBase = pEvent->getTrigger(); assert(pSBase != NULL); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } if (pEvent->isSetDelay()) { pSBase = pEvent->getDelay(); assert(pSBase != NULL); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } if (pEvent->getListOfEventAssignments() != NULL) { pSBase = pEvent->getListOfEventAssignments(); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } unsigned int j, jMax = pEvent->getListOfEventAssignments()->size(); for (j = 0; j < jMax; ++j) { pSBase = pEvent->getEventAssignment(j); assert(pSBase != NULL); if (pSBase->isSetMetaId()) { id = pSBase->getMetaId(); if (metaIds.find(id) == metaIds.end()) { metaIds.insert(std::pair<const std::string, const SBase*>(id, pSBase)); } else { CCopasiMessage(CCopasiMessage::WARNING, MCSBML + 67, id.c_str()); } } } } } } } }
void SbmlReader::createReaction(const map< string, Id > &molSidcmptMIdMap ) { Reaction* reac; map< string,double > rctMap; map< string,double >::iterator rctMap_iter; map< string,double >prdMap; map< string,double >::iterator prdMap_iter; map< string,EnzymeInfo >enzInfoMap; for ( unsigned int r = 0; r < model_->getNumReactions(); r++ ) { Id reaction_; reac = model_->getReaction( r ); noOfsub_ = 0; noOfprd_ = 0; std:: string id; //=reac->getId(); if ( reac->isSetId() ) id = reac->getId(); std::string name; if ( reac->isSetName() ) { name = reac->getName(); name = nameString(name); } if (name.empty()) { if (id.empty()) assert("Reaction id and name is empty"); else name = id; } string grpname = getAnnotation( reac,enzInfoMap ); if ( (grpname != "") && (enzInfoMap[grpname].stage == 3) ) { setupEnzymaticReaction( enzInfoMap[grpname],grpname ,molSidcmptMIdMap,name); } //if (grpname != "") // { //cout << "\n enz matic reaction " << enzInfoMap[grpname].stage; //setupEnzymaticReaction( enzInfoMap[grpname],grpname ,molSidcmptMIdMap); //} else if ( grpname == "" ) { if (reac->getNumModifiers() > 0) setupMMEnzymeReaction( reac,id,name ,molSidcmptMIdMap); else { bool rev=reac->getReversible(); bool fast=reac->getFast(); if ( fast ) { cout<<"warning: for now fast attribute is not handled"<<endl; errorFlag_ = true; } int numRcts = reac->getNumReactants(); int numPdts = reac->getNumProducts(); if ( numRcts == 0 && numPdts != 0 ) { cout << "Reaction with zero Substrate is not possible but exist in this model"; const SpeciesReference* pdt = reac->getProduct( 0 ); std::string spName = pdt->getSpecies(); Id parent = molSidcmptMIdMap.find( spName )->second; //gives compartment of spName cout << " \n \t ################################# Sub = 0 and prd != 0 need to the reac ############### "; const SpeciesReference* rect=reac->getReactant(0); std::string sp=rect->getSpecies(); Id comptRef = molSidcmptMIdMap.find(sp)->second; //gives compartment of sp Id meshEntry = Neutral::child( comptRef.eref(), "mesh" ); Shell* shell = reinterpret_cast< Shell* >( Id().eref().data() ); reaction_ = shell->doCreate("Reac", meshEntry, name, 1); //shell->doAddMsg( "Single", meshEntry, "remeshReacs", reaction_, "remesh"); //Get Substrate addSubPrd(reac,reaction_,"prd"); } //if numRcts == 0 else { const SpeciesReference* rect=reac->getReactant(0); std::string sp=rect->getSpecies(); Id comptRef = molSidcmptMIdMap.find(sp)->second; //gives compartment of sp Id meshEntry = Neutral::child( comptRef.eref(), "mesh" ); Shell* shell = reinterpret_cast< Shell* >( Id().eref().data() ); reaction_ = shell->doCreate("Reac", comptRef, name, 1); //shell->doAddMsg( "Single", meshEntry, "remeshReacs", reaction_, "remesh"); //Get Substrate addSubPrd(reac,reaction_,"sub"); //Get Product addSubPrd(reac,reaction_,"prd"); } if ( reac->isSetKineticLaw() ) { KineticLaw * klaw=reac->getKineticLaw(); //vector< double > rate = getKLaw( klaw,rev ); vector< double > rate; rate.clear(); getKLaw( klaw,rev,rate ); if ( errorFlag_ ) return; else if ( !errorFlag_ ) { //cout << " Reaction name " << name << " kf " << rate[0] << " kb " << rate[1]<<endl; Field < double > :: set( reaction_, "Kf", rate[0] ); Field < double > :: set( reaction_, "Kb", rate[1] ); /*if (numRcts > 1) rate[0] = rate[0]*pow(1e3,1.0); cout << "Reaction " << id << " " << name << " " << rate[0] << " " << rate[1]<<endl; Field < double > :: set( reaction_, "Kf", rate[0] ); Field < double > :: set( reaction_, "Kb", rate[1] ); */ } } //issetKineticLaw } //else } // else grpname == "" }//for unsigned } //reaction