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);
87 if (oldPos < 0 && newSpeed != 0) {
88 timeOnLane = newPos / newSpeed;
92 if (fabs(timeOnLane) < 0.001) {
98 WRITE_ERROR(
"Negative vehicle step fraction for '" + veh.
getID() +
"' on lane '" + getLane()->getID() +
"'.");
101 if (timeOnLane == 0) {
104 notifyMoveInternal(veh, timeOnLane, newSpeed);
124 return sampleSeconds == 0;
135 return sampleSeconds;
144 const std::set<std::string>*
const vTypes,
158 myCurrentData.pop_front();
160 myCurrentData.push_back(
new TrackerEntry(myParent->createValues(myLane, myLaneLength,
false)));
167 myCurrentData.front()->myValues->addTo(val);
173 myTrackedData[&veh]->myValues->notifyMoveInternal(veh, timeOnLane, speed);
180 myTrackedData[&veh]->myNumVehicleLeft++;
182 return myTrackedData[&veh]->myValues->notifyLeave(veh, lastPos, reason);
191 if (vehicleApplies(veh) && myTrackedData.find(&veh) == myTrackedData.end()) {
192 myTrackedData[&veh] = myCurrentData.back();
193 myTrackedData[&veh]->myNumVehicleEntered++;
194 if (!myTrackedData[&veh]->myValues->notifyEnter(veh, reason)) {
195 myTrackedData[&veh]->myNumVehicleLeft++;
196 myTrackedData.erase(&veh);
207 return myCurrentData.front()->myValues->isEmpty();
217 myCurrentData.front()->myValues->write(dev, period, numLanes,
219 myCurrentData.front()->myNumVehicleEntered);
226 for (std::list<TrackerEntry*>::const_iterator it = myCurrentData.begin(); it != myCurrentData.end(); ++it) {
227 if ((*it)->myNumVehicleEntered == (*it)->myNumVehicleLeft) {
239 return myCurrentData.front()->myValues->getSamples();
248 const bool useLanes,
const bool withEmpty,
249 const bool printDefaults,
const bool withInternal,
const bool trackVehicles,
252 const std::set<std::string> vTypes) :
270 for (std::vector<MSEdge*>::const_iterator e = edges.begin(); e != edges.end(); ++e) {
273 myMeasures.push_back(std::vector<MeanDataValues*>());
274 const std::vector<MSLane*> &lanes = (*e)->getLanes();
284 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**e);
286 s->addDetector(data);
287 s->prepareDetectorForWriting(*data);
288 s = s->getNextSegment();
298 for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) {
301 (*lane)->addMoveReminder(
myMeasures.back().back());
315 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
316 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
328 std::vector<MSEdge*>::iterator edge =
myEdges.begin();
329 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
330 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**edge);
333 s->prepareDetectorForWriting(*data);
334 s = s->getNextSegment();
341 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
342 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
351 const std::vector<MeanDataValues*> &edgeValues,
355 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(*edge);
358 s->prepareDetectorForWriting(*data);
359 s = s->getNextSegment();
362 data->
write(dev, stopTime - startTime,
370 std::vector<MeanDataValues*>::const_iterator lane;
374 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
375 if (!(*lane)->isEmpty()) {
384 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
387 meanData.
write(dev, stopTime - startTime, 1.f,
390 meanData.
reset(
true);
402 meanData.
reset(
true);
405 for (lane = edgeValues.begin(); lane != edgeValues.end(); ++lane) {
407 meanData.
addTo(*sumData);
438 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i) {
439 for (std::vector<MeanDataValues*>::const_iterator j = (*i).begin(); j != (*i).end(); ++j) {
453 while (numReady-- > 0) {
461 std::vector<MSEdge*>::iterator edge =
myEdges.begin();
462 for (std::vector<std::vector<MeanDataValues*> >::const_iterator i =
myMeasures.begin(); i !=
myMeasures.end(); ++i, ++edge) {
463 writeEdge(dev, (*i), *edge, startTime, stopTime);