42 #ifdef CHECK_MEMORY_LEAKS
44 #endif // CHECK_MEMORY_LEAKS
56 myJamHaltingSpeedThreshold(haltingSpeedThreshold),
57 myJamHaltingTimeThreshold(haltingTimeThreshold),
58 myJamDistanceThreshold(jamDistThreshold),
59 myStartPos(startPos), myEndPos(startPos + detLength),
61 myCurrentOccupancy(0), myCurrentMeanSpeed(-1), myCurrentJamNo(0),
62 myCurrentMaxJamLengthInMeters(0), myCurrentMaxJamLengthInVehicles(0),
63 myCurrentJamLengthInMeters(0), myCurrentJamLengthInVehicles(0), myCurrentStartedHalts(0)
67 assert(
myStartPos >= 0 && myStartPos < myLane->getLength());
158 std::map<SUMOVehicle*, SUMOTime> haltingVehicles;
159 std::map<SUMOVehicle*, SUMOTime> intervalHaltingVehicles;
160 std::vector<JamInfo*> jams;
197 bool isInJam =
false;
207 haltingVehicles[veh] =
DELTA_T;
208 intervalHaltingVehicles[veh] =
DELTA_T;
235 if (currentJam == 0) {
246 jams.push_back(currentJam);
255 if (currentJam != 0) {
256 jams.push_back(currentJam);
261 if (currentJam != 0) {
262 jams.push_back(currentJam);
271 for (std::vector<JamInfo*>::iterator i = jams.begin(); i != jams.end(); ++i) {
274 (*(*i)->firstStandingVehicle)->getPositionOnLane()
275 - (*(*i)->lastStandingVehicle)->getPositionOnLane()
276 + (*(*i)->lastStandingVehicle)->getVehicleType().getLengthWithGap();
278 if (occ && occ == *(*i)->firstStandingVehicle && occ != *(*i)->lastStandingVehicle) {
280 - (*(*i)->lastStandingVehicle)->getPositionOnLane()
281 + (*(*i)->lastStandingVehicle)->getVehicleType().getLengthWithGap();
283 unsigned jamLengthInVehicles = (unsigned) distance((*i)->firstStandingVehicle, (*i)->lastStandingVehicle) + 1;
318 for (std::vector<JamInfo*>::iterator i = jams.begin(); i != jams.end(); ++i) {
328 dev <<
" <interval begin=\"" <<
time2string(startTime) <<
"\" end=\"" <<
time2string(stopTime) <<
"\" " <<
"id=\"" <<
getID() <<
"\" ";
338 unsigned haltingNo = 0;
340 haltingDurationSum += (*i);
341 maxHaltingDuration =
MAX2(maxHaltingDuration, (*i));
345 haltingDurationSum += (*i).second;
346 maxHaltingDuration =
MAX2(maxHaltingDuration, (*i).second);
349 const SUMOTime meanHaltingDuration = haltingNo != 0 ? haltingDurationSum / haltingNo : 0;
351 SUMOTime intervalHaltingDurationSum = 0;
352 SUMOTime intervalMaxHaltingDuration = 0;
353 unsigned intervalHaltingNo = 0;
355 intervalHaltingDurationSum += (*i);
356 intervalMaxHaltingDuration =
MAX2(intervalMaxHaltingDuration, (*i));
360 intervalHaltingDurationSum += (*i).second;
361 intervalMaxHaltingDuration =
MAX2(intervalMaxHaltingDuration, (*i).second);
364 const SUMOTime intervalMeanHaltingDuration = intervalHaltingNo != 0 ? intervalHaltingDurationSum / intervalHaltingNo : 0;
367 <<
"meanSpeed=\"" << meanSpeed <<
"\" "
368 <<
"meanOccupancy=\"" << meanOccupancy <<
"\" "
370 <<
"meanMaxJamLengthInVehicles=\"" << meanJamLengthInVehicles <<
"\" "
371 <<
"meanMaxJamLengthInMeters=\"" << meanJamLengthInMeters <<
"\" "
376 <<
"meanHaltingDuration=\"" <<
STEPS2TIME(meanHaltingDuration) <<
"\" "
377 <<
"maxHaltingDuration=\"" <<
STEPS2TIME(maxHaltingDuration) <<
"\" "
378 <<
"haltingDurationSum=\"" <<
STEPS2TIME(haltingDurationSum) <<
"\" "
379 <<
"meanIntervalHaltingDuration=\"" <<
STEPS2TIME(intervalMeanHaltingDuration) <<
"\" "
380 <<
"maxIntervalHaltingDuration=\"" <<
STEPS2TIME(intervalMaxHaltingDuration) <<
"\" "
381 <<
"intervalHaltingDurationSum=\"" <<
STEPS2TIME(intervalHaltingDurationSum) <<
"\" "
383 <<
"meanVehicleNumber=\"" << meanVehicleNumber <<
"\" "
392 dev.
writeXMLHeader(
"detector",
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://sumo.sf.net/xsd/det_e2_file.xsd\"");