47 #include <mesosim/MELoop.h>
48 #include <mesosim/MESegment.h>
51 #ifdef CHECK_MEMORY_LEAKS
53 #endif // CHECK_MEMORY_LEAKS
64 const std::set<std::string>*
const vTypes) :
69 myVehicleTypes(vTypes) {}
79 return vehicleApplies(veh);
89 if (oldPos < 0 && newSpeed != 0) {
90 timeOnLane = newPos / newSpeed;
94 if (fabs(timeOnLane) < 0.001) {
100 WRITE_ERROR(
"Negative vehicle step fraction for '" + veh.
getID() +
"' on lane '" + getLane()->getID() +
"'.");
103 if (timeOnLane == 0) {
106 notifyMoveInternal(veh, timeOnLane, newSpeed);
126 return sampleSeconds == 0;
137 return sampleSeconds;
146 const std::set<std::string>*
const vTypes,
160 myCurrentData.pop_front();
162 myCurrentData.push_back(
new TrackerEntry(myParent->createValues(myLane, myLaneLength,
false)));
169 myCurrentData.front()->myValues->addTo(val);
175 myTrackedData[&veh]->myValues->notifyMoveInternal(veh, timeOnLane, speed);
182 myTrackedData[&veh]->myNumVehicleLeft++;
184 return myTrackedData[&veh]->myValues->notifyLeave(veh, lastPos, reason);
193 if (vehicleApplies(veh) && myTrackedData.find(&veh) == myTrackedData.end()) {
194 myTrackedData[&veh] = myCurrentData.back();
195 myTrackedData[&veh]->myNumVehicleEntered++;
196 if (!myTrackedData[&veh]->myValues->notifyEnter(veh, reason)) {
197 myTrackedData[&veh]->myNumVehicleLeft++;
198 myTrackedData.erase(&veh);
209 return myCurrentData.front()->myValues->isEmpty();
219 myCurrentData.front()->myValues->write(dev, period, numLanes,
221 myCurrentData.front()->myNumVehicleEntered);
228 for (std::list<TrackerEntry*>::const_iterator it = myCurrentData.begin(); it != myCurrentData.end(); ++it) {
229 if ((*it)->myNumVehicleEntered == (*it)->myNumVehicleLeft) {
241 return myCurrentData.front()->myValues->getSamples();
250 const bool useLanes,
const bool withEmpty,
251 const bool printDefaults,
const bool withInternal,
const bool trackVehicles,
254 const std::set<std::string> vTypes) :
272 for (std::vector<MSEdge*>::const_iterator e = edges.begin(); e != edges.end(); ++e) {
275 myMeasures.push_back(std::vector<MeanDataValues*>());
276 const std::vector<MSLane*>& lanes = (*e)->getLanes();
286 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**e);
288 s->addDetector(data);
289 s->prepareDetectorForWriting(*data);
290 s = s->getNextSegment();
300 for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) {
303 (*lane)->addMoveReminder(
myMeasures.back().back());
317 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
318 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
330 std::vector<MSEdge*>::iterator edge =
myEdges.begin();
331 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
332 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**edge);
335 s->prepareDetectorForWriting(*data);
336 s = s->getNextSegment();
343 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
344 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
353 const std::vector<MeanDataValues*>& edgeValues,
357 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(*edge);
360 s->prepareDetectorForWriting(*data);
361 s = s->getNextSegment();
364 data->
write(dev, stopTime - startTime,
372 std::vector<MeanDataValues*>::const_iterator lane;
376 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
377 if (!(*lane)->isEmpty()) {
386 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
391 meanData.
reset(
true);
402 meanData.
reset(
true);
405 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
407 meanData.
addTo(*sumData);
437 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
438 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
452 while (numReady-- > 0) {
460 std::vector<MSEdge*>::iterator edge =
myEdges.begin();
461 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
462 writeEdge(dev, (*i), *edge, startTime, stopTime);
471 dev.
writeXMLHeader(
"meandata",
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.sf.net/xsd/meandata_file.xsd\"");