48 #include <mesosim/MELoop.h>
49 #include <mesosim/MESegment.h>
52 #ifdef CHECK_MEMORY_LEAKS
54 #endif // CHECK_MEMORY_LEAKS
65 const std::set<std::string>*
const vTypes) :
66 MSMoveReminder(
"meandata_" + (lane == 0 ?
"NULL" : lane->getID()), lane, doAdd),
70 myVehicleTypes(vTypes) {}
80 return vehicleApplies(veh);
90 if (oldPos < 0 && newSpeed != 0) {
91 timeOnLane = newPos / newSpeed;
95 if (fabs(timeOnLane) < 0.001) {
100 if (timeOnLane < 0) {
101 WRITE_ERROR(
"Negative vehicle step fraction for '" + veh.
getID() +
"' on lane '" + getLane()->getID() +
"'.");
104 if (timeOnLane == 0) {
107 notifyMoveInternal(veh, timeOnLane, newSpeed);
127 return sampleSeconds == 0;
138 return sampleSeconds;
147 const std::set<std::string>*
const vTypes,
161 myCurrentData.pop_front();
163 myCurrentData.push_back(
new TrackerEntry(myParent->createValues(myLane, myLaneLength,
false)));
170 myCurrentData.front()->myValues->addTo(val);
176 myTrackedData[&veh]->myValues->notifyMoveInternal(veh, timeOnLane, speed);
183 myTrackedData[&veh]->myNumVehicleLeft++;
185 return myTrackedData[&veh]->myValues->notifyLeave(veh, lastPos, reason);
194 if (vehicleApplies(veh) && myTrackedData.find(&veh) == myTrackedData.end()) {
195 myTrackedData[&veh] = myCurrentData.back();
196 myTrackedData[&veh]->myNumVehicleEntered++;
197 if (!myTrackedData[&veh]->myValues->notifyEnter(veh, reason)) {
198 myTrackedData[&veh]->myNumVehicleLeft++;
199 myTrackedData.erase(&veh);
210 return myCurrentData.front()->myValues->isEmpty();
220 myCurrentData.front()->myValues->write(dev, period, numLanes,
222 myCurrentData.front()->myNumVehicleEntered);
229 for (std::list<TrackerEntry*>::const_iterator it = myCurrentData.begin(); it != myCurrentData.end(); ++it) {
230 if ((*it)->myNumVehicleEntered == (*it)->myNumVehicleLeft) {
242 return myCurrentData.front()->myValues->getSamples();
251 const bool useLanes,
const bool withEmpty,
252 const bool printDefaults,
const bool withInternal,
const bool trackVehicles,
255 const std::set<std::string> vTypes) :
273 for (std::vector<MSEdge*>::const_iterator e = edges.begin(); e != edges.end(); ++e) {
276 myMeasures.push_back(std::vector<MeanDataValues*>());
277 const std::vector<MSLane*>& lanes = (*e)->getLanes();
287 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**e);
289 s->addDetector(data);
290 s->prepareDetectorForWriting(*data);
291 s = s->getNextSegment();
301 for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) {
304 (*lane)->addMoveReminder(
myMeasures.back().back());
318 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
319 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
331 std::vector<MSEdge*>::iterator edge =
myEdges.begin();
332 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
333 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**edge);
336 s->prepareDetectorForWriting(*data);
337 s = s->getNextSegment();
344 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
345 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
354 return edge->
getID();
360 const std::vector<MeanDataValues*>& edgeValues,
364 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(*edge);
367 s->prepareDetectorForWriting(*data);
368 s = s->getNextSegment();
371 data->
write(dev, stopTime - startTime,
379 std::vector<MeanDataValues*>::const_iterator lane;
383 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
384 if (!(*lane)->isEmpty()) {
393 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
398 meanData.
reset(
true);
409 meanData.
reset(
true);
412 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
414 meanData.
addTo(*sumData);
451 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
452 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
466 while (numReady-- > 0) {
473 std::vector<MSEdge*>::iterator edge =
myEdges.begin();
474 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
475 writeEdge(dev, (*i), *edge, startTime, stopTime);
484 dev.
writeXMLHeader(
"meandata",
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo-sim.org/xsd/meandata_file.xsd\"");