std::string SEDMLUtils::findIdByNameAndType( const std::map<CCopasiObject*, SBase*>& map, int typeCode, const std::string& name) { std::map<CCopasiObject*, SBase*>::const_iterator it = map.begin(); std::string::size_type compartmentStart = name.find("{"); std::string nameOnly = name.substr(0, compartmentStart); while (it != map.end()) { SBase* current = it->second; if (((current->getTypeCode() & typeCode) == typeCode) && current->getName() == name) return current->getId(); if (typeCode == SBML_SPECIES && compartmentStart != std::string::npos) { if (((current->getTypeCode() & typeCode) == typeCode) && current->getName() == nameOnly) { std::string compName = name.substr(compartmentStart + 1, name.size() - compartmentStart - 2); std::string compId = findIdByNameAndType(map, SBML_COMPARTMENT, compName); Species* species = (Species*) current; if (species->getCompartment() == compId) return species->getId(); } } ++it; } return ""; }