void CChemEq::addElement(CCopasiVector < CChemEqElement > & structure, const CChemEqElement & element, CChemEq::MetaboliteRole role) { unsigned C_INT32 i; std::string key = element.getMetaboliteKey(); if (key == "") return; // don�t add empty element for (i = 0; i < structure.size(); i++) if (key == structure[i]->getMetaboliteKey()) break; if (i >= structure.size()) { CChemEqElement * Element = new CChemEqElement(element); if (role == CChemEq::SUBSTRATE) Element->setMultiplicity(- Element->getMultiplicity()); structure.add(Element, true); } else if (role == CChemEq::SUBSTRATE) structure[i]->addToMultiplicity(- element.getMultiplicity()); else structure[i]->addToMultiplicity(element.getMultiplicity()); }
std::string CODEExporterC::KineticFunction2ODEmember(const CReaction *reac) { std::ostringstream equation; if (reac->getFunction()->getType() != CEvaluationTree::MassAction) { const CFunctionParameters & params = reac->getFunctionParameters(); size_t k, params_size = params.size(); const std::vector<std::vector<std::string> > & keyMap = reac->getParameterMappings(); std::string name; equation << NameMap[reac->getFunction()->getKey()] << "("; for (k = 0; k < params_size; ++k) { CFunctionParameter::Role role = params[k]->getUsage(); CCopasiObject * obj = CCopasiRootContainer::getKeyFactory()->get(keyMap[k][0]); if ((role == CFunctionParameter::SUBSTRATE) || (role == CFunctionParameter::PRODUCT) || (role == CFunctionParameter::MODIFIER)) { if (obj) name = NameMap[obj->getKey()]; else name = "unknown"; } if (role == CFunctionParameter::PARAMETER) { if (!(reac->isLocalParameter(k))) { CModelValue* modval; modval = dynamic_cast< CModelValue * >(obj); name = NameMap[modval->getKey()]; } else { CCopasiParameter* param; param = dynamic_cast< CCopasiParameter * >(obj); name = NameMap[param->getKey()]; } } if (role == CFunctionParameter::VOLUME) { CCompartment* comp; comp = dynamic_cast< CCompartment * >(obj); name = NameMap[comp->getKey()]; } if (role == CFunctionParameter::TIME) { name = "T"; } if (name.empty()) { std::string message = "Could not export C code, since one of the arguments could not be resolved. Please consider filing a bug with the COPASI tracker: http://www.copasi.org/tracker"; CCopasiMessage(CCopasiMessage::EXCEPTION, message.c_str()); } equation << name; if (k != params_size - 1) equation << ", "; } equation << ")"; } else { const CCopasiVector<CChemEqElement> & substrs = reac->getChemEq().getSubstrates(); const CCopasiVector<CChemEqElement> & prods = reac->getChemEq().getProducts(); const std::vector<std::vector<std::string> > & keyMap = reac->getParameterMappings(); CCopasiObject * obj; size_t substrs_size = substrs.size(), prods_size = prods.size(); size_t k, m, mult; CChemEqElement* substr; CChemEqElement* prod; const CMassAction cMassAction = *static_cast<const CMassAction*>(reac->getFunction()); equation << "("; obj = CCopasiRootContainer::getKeyFactory()->get(keyMap[0][0]); if (!(reac->isLocalParameter(0))) { CModelValue* modval; modval = dynamic_cast< CModelValue * >(obj); equation << NameMap[modval->getKey()]; } else { CCopasiParameter* param; param = dynamic_cast< CCopasiParameter * >(obj); equation << NameMap[param->getKey()]; } for (k = 0; k < substrs_size; ++k) { substr = substrs[k]; mult = (size_t) substr->getMultiplicity(); assert(substr->getMetabolite()); equation << " * " << NameMap[substr->getMetabolite()->getKey()]; if (mult > 1) for (m = 1; m < mult; ++m) equation << " * " << NameMap[substr->getMetabolite()->getKey()]; } if (cMassAction.isReversible() == TriTrue) { equation << " - "; obj = CCopasiRootContainer::getKeyFactory()->get(keyMap[2][0]); if (!(reac->isLocalParameter(2))) { CModelValue* modval; modval = dynamic_cast< CModelValue * >(obj); equation << NameMap[modval->getKey()]; } else { CCopasiParameter* param; param = dynamic_cast< CCopasiParameter * >(obj); equation << NameMap[param->getKey()]; } for (k = 0; k < prods_size; ++k) { prod = prods[k]; mult = (size_t) prod->getMultiplicity(); assert(prod->getMetabolite()); equation << " * " << NameMap[prod->getMetabolite()->getKey()]; if (mult > 1) for (m = 1; m < mult; ++m) equation << " * " << NameMap[prod->getMetabolite()->getKey()]; } } equation << ") "; } return equation.str(); }