void RODFDetectorCon::writeEmitters(const std::string& file, const RODFDetectorFlows& flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, const RODFNet& net, bool writeCalibrators, bool includeUnusedRoutes, SUMOReal scale, int maxFollower, bool insertionsOnly) { // compute turn probabilities at detector for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) { (*i)->computeSplitProbabilities(&net, *this, flows, startTime, endTime, stepOffset); } // OutputDevice& out = OutputDevice::getDevice(file); out.writeXMLHeader("additional"); for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) { RODFDetector* det = *i; // get file name for values (emitter/calibrator definition) std::string escapedID = StringUtils::escapeXML(det->getID()); std::string defFileName; if (det->getType() == SOURCE_DETECTOR) { defFileName = file; } else if (writeCalibrators && det->getType() == BETWEEN_DETECTOR) { defFileName = FileHelpers::getFilePath(file) + "calibrator_" + escapedID + ".def.xml"; } else { defFileName = FileHelpers::getFilePath(file) + "other_" + escapedID + ".def.xml"; continue; } // try to write the definition SUMOReal defaultSpeed = net.getEdge(det->getEdgeID())->getSpeed(); // ... compute routes' distribution over time std::map<size_t, RandomDistributor<size_t>* > dists; if (!insertionsOnly && flows.knows(det->getID())) { det->buildDestinationDistribution(*this, flows, startTime, endTime, stepOffset, net, dists, maxFollower); } // ... write the definition if (!det->writeEmitterDefinition(defFileName, dists, flows, startTime, endTime, stepOffset, includeUnusedRoutes, scale, insertionsOnly, defaultSpeed)) { // skip if something failed... (!!!) continue; } // ... clear temporary values clearDists(dists); // write the declaration into the file if (writeCalibrators && det->getType() == BETWEEN_DETECTOR) { out << " <calibrator id=\"calibrator_" << escapedID << "\" pos=\"" << det->getPos() << "\" " << "lane=\"" << det->getLaneID() << "\" " << "friendlyPos=\"x\" " // !!! << "file=\"" << defFileName << "\"/>\n"; } } out.close(); }
void RODFDetectorCon::writeEmitters(const std::string& file, const RODFDetectorFlows& flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, const RODFNet& net, bool writeCalibrators, bool includeUnusedRoutes, SUMOReal scale, bool insertionsOnly) { // compute turn probabilities at detector for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) { (*i)->computeSplitProbabilities(&net, *this, flows, startTime, endTime, stepOffset); } // OutputDevice& out = OutputDevice::getDevice(file); out.writeXMLHeader("additional", "additional_file.xsd"); // write vType(s) const bool separateVTypeOutput = OptionsCont::getOptions().getString("vtype-output") != ""; OutputDevice& vTypeOut = separateVTypeOutput ? OutputDevice::getDevice(OptionsCont::getOptions().getString("vtype-output")) : out; if (separateVTypeOutput) { vTypeOut.writeXMLHeader("additional", "additional_file.xsd"); } const bool forceDev = !OptionsCont::getOptions().isDefault("speeddev"); const SUMOReal speedDev = OptionsCont::getOptions().getFloat("speeddev"); if (OptionsCont::getOptions().getBool("vtype")) { // write separate types SUMOVTypeParameter pkwType = SUMOVTypeParameter("PKW", SVC_PASSENGER); setSpeedFactorAndDev(pkwType, net.getMaxSpeedFactorPKW(), net.getAvgSpeedFactorPKW(), speedDev, forceDev); pkwType.setParameter |= VTYPEPARS_VEHICLECLASS_SET; pkwType.write(vTypeOut); SUMOVTypeParameter lkwType = SUMOVTypeParameter("LKW", SVC_TRUCK); setSpeedFactorAndDev(lkwType, net.getMaxSpeedFactorLKW(), net.getAvgSpeedFactorLKW(), speedDev, forceDev); lkwType.setParameter |= VTYPEPARS_VEHICLECLASS_SET; lkwType.write(vTypeOut); } else { // patch default type SUMOVTypeParameter type = SUMOVTypeParameter(DEFAULT_VTYPE_ID, SVC_PASSENGER); setSpeedFactorAndDev(type, MAX2(net.getMaxSpeedFactorPKW(), net.getMaxSpeedFactorLKW()), net.getAvgSpeedFactorPKW(), speedDev, forceDev); if (type.setParameter != 0) { type.write(vTypeOut); } } for (std::vector<RODFDetector*>::const_iterator i = myDetectors.begin(); i != myDetectors.end(); ++i) { RODFDetector* det = *i; // get file name for values (emitter/calibrator definition) std::string escapedID = StringUtils::escapeXML(det->getID()); std::string defFileName; if (det->getType() == SOURCE_DETECTOR) { defFileName = file; } else if (writeCalibrators && det->getType() == BETWEEN_DETECTOR) { defFileName = FileHelpers::getFilePath(file) + "calibrator_" + escapedID + ".def.xml"; } else { defFileName = FileHelpers::getFilePath(file) + "other_" + escapedID + ".def.xml"; continue; } // try to write the definition SUMOReal defaultSpeed = net.getEdge(det->getEdgeID())->getSpeed(); // ... compute routes' distribution over time std::map<SUMOTime, RandomDistributor<int>* > dists; if (!insertionsOnly && flows.knows(det->getID())) { det->buildDestinationDistribution(*this, startTime, endTime, stepOffset, net, dists); } // ... write the definition if (!det->writeEmitterDefinition(defFileName, dists, flows, startTime, endTime, stepOffset, includeUnusedRoutes, scale, insertionsOnly, defaultSpeed)) { // skip if something failed... (!!!) continue; } // ... clear temporary values clearDists(dists); // write the declaration into the file if (writeCalibrators && det->getType() == BETWEEN_DETECTOR) { out.openTag(SUMO_TAG_CALIBRATOR).writeAttr(SUMO_ATTR_ID, "calibrator_" + escapedID).writeAttr(SUMO_ATTR_POSITION, det->getPos()); out.writeAttr(SUMO_ATTR_LANE, det->getLaneID()).writeAttr(SUMO_ATTR_FRIENDLY_POS, true).writeAttr(SUMO_ATTR_FILE, defFileName).closeTag(); } } out.close(); if (separateVTypeOutput) { vTypeOut.close(); } }