Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSMeanData_Net.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2004-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
20// Network state mean data collector for edges/lanes
21/****************************************************************************/
22#include <config.h>
23
24#ifdef HAVE_FOX
26#endif
31#include <microsim/MSEdge.h>
32#include <microsim/MSLane.h>
33#include <microsim/MSVehicle.h>
34#include <microsim/MSGlobals.h>
35#include <mesosim/MELoop.h>
36#include <mesosim/MESegment.h>
37#include "MSMeanData_Net.h"
38
39
40// ===========================================================================
41// debug constants
42// ===========================================================================
43//#define DEBUG_OCCUPANCY
44//#define DEBUG_OCCUPANCY2
45//#define DEBUG_NOTIFY_ENTER
46//#define DEBUG_COND (veh.getLane()->getID() == "")
47//#define DEBUG_COND (false)
48//#define DEBUG_COND2 (veh.getEdge()->getID() == "")
49
50
51// ===========================================================================
52// method definitions
53// ===========================================================================
54// ---------------------------------------------------------------------------
55// MSMeanData_Net::MSLaneMeanDataValues - methods
56// ---------------------------------------------------------------------------
58 const double length,
59 const bool doAdd,
60 const MSMeanData_Net* parent)
61 : MSMeanData::MeanDataValues(lane, length, doAdd, parent),
62 nVehDeparted(0), nVehArrived(0), nVehEntered(0), nVehLeft(0),
63 nVehVaporized(0), nVehTeleported(0), waitSeconds(0), timeLoss(0),
64 nVehLaneChangeFrom(0), nVehLaneChangeTo(0),
65 frontSampleSeconds(0), frontTravelledDistance(0),
66 vehLengthSum(0), occupationSum(0),
67 minimalVehicleLength(INVALID_DOUBLE),
68 myParent(parent) {}
69
70
73
74
75void
77 nVehDeparted = 0;
78 nVehArrived = 0;
79 nVehEntered = 0;
80 nVehLeft = 0;
81 nVehVaporized = 0;
82 nVehTeleported = 0;
83 nVehLaneChangeFrom = 0;
84 nVehLaneChangeTo = 0;
85 sampleSeconds = 0.;
86 travelledDistance = 0;
87 waitSeconds = 0;
88 timeLoss = 0;
89 frontSampleSeconds = 0;
90 frontTravelledDistance = 0;
91 vehLengthSum = 0;
92 occupationSum = 0;
93 minimalVehicleLength = INVALID_DOUBLE;
94 resetTime = SIMSTEP;
95}
96
97
98void
101 v.nVehDeparted += nVehDeparted;
102 v.nVehArrived += nVehArrived;
103 v.nVehEntered += nVehEntered;
104 v.nVehLeft += nVehLeft;
105 v.nVehVaporized += nVehVaporized;
106 v.nVehTeleported += nVehTeleported;
107 v.nVehLaneChangeFrom += nVehLaneChangeFrom;
108 v.nVehLaneChangeTo += nVehLaneChangeTo;
109 v.sampleSeconds += sampleSeconds;
110 v.travelledDistance += travelledDistance;
111 v.waitSeconds += waitSeconds;
112 v.timeLoss += timeLoss;
113 v.frontSampleSeconds += frontSampleSeconds;
114 v.frontTravelledDistance += frontTravelledDistance;
115 v.vehLengthSum += vehLengthSum;
116 v.occupationSum += occupationSum;
118 v.minimalVehicleLength = minimalVehicleLength;
119 } else {
120 v.minimalVehicleLength = MIN2(minimalVehicleLength, v.minimalVehicleLength);
121 }
122}
123
124
125void
127 const SUMOTrafficObject& veh, const double frontOnLane,
128 const double timeOnLane, const double /* meanSpeedFrontOnLane */,
129 const double meanSpeedVehicleOnLane,
130 const double travelledDistanceFrontOnLane,
131 const double travelledDistanceVehicleOnLane,
132 const double meanLengthOnLane) {
133#ifdef DEBUG_OCCUPANCY
134 if (DEBUG_COND2) {
135 std::cout << SIMTIME << "\n MSMeanData_Net::MSLaneMeanDataValues::notifyMoveInternal()\n"
136 << " veh '" << veh.getID() << "' on edge '" << veh.getEdge()->getID() << "'"
137 << ", timeOnLane=" << timeOnLane
138 << ", meanSpeedVehicleOnLane=" << meanSpeedVehicleOnLane
139 << ",\ntravelledDistanceFrontOnLane=" << travelledDistanceFrontOnLane
140 << ", travelledDistanceVehicleOnLane=" << travelledDistanceVehicleOnLane
141 << ", meanLengthOnLane=" << meanLengthOnLane
142 << std::endl;
143 }
144#endif
145 if (myParent != nullptr && !myParent->vehicleApplies(veh)) {
146 return;
147 }
148 sampleSeconds += timeOnLane;
149 travelledDistance += travelledDistanceVehicleOnLane;
150 vehLengthSum += veh.getVehicleType().getLength() * timeOnLane;
152 // For the mesosim case no information on whether the vehicle was occupying
153 // the lane with its whole length is available. We assume the whole length
154 // Therefore this increment is taken out with more information on the vehicle movement.
155 occupationSum += veh.getVehicleType().getLength() * timeOnLane;
156 } else {
157 // for the microsim case more elaborate calculation of the average length on the lane,
158 // is taken out in notifyMove(), refs #153
159 occupationSum += meanLengthOnLane * TS;
160 }
161 if (!veh.isStopped()) {
162 if (myParent != nullptr && (meanSpeedVehicleOnLane < myParent->myHaltSpeed
163 || (myParent->myHaltSpeedRel > 0 && meanSpeedVehicleOnLane / veh.getCurrentEdge()->getSpeedLimit(veh.getVClass()) < myParent->myHaltSpeedRel))) {
164 waitSeconds += timeOnLane;
165 } else if (MSGlobals::gUseMesoSim) {
166 waitSeconds += STEPS2TIME(veh.getWaitingTime());
167 }
168 const double vmax = veh.getLane() == nullptr ? veh.getEdge()->getVehicleMaxSpeed(&veh) : veh.getLane()->getVehicleMaxSpeed(&veh);
169 if (vmax > 0) {
170 timeLoss += timeOnLane * MAX2(0.0, vmax - meanSpeedVehicleOnLane) / vmax;
171 }
172 }
173 frontSampleSeconds += frontOnLane;
174 frontTravelledDistance += travelledDistanceFrontOnLane;
175 if (minimalVehicleLength == INVALID_DOUBLE) {
176 minimalVehicleLength = veh.getVehicleType().getLengthWithGap();
177 } else {
178 minimalVehicleLength = MIN2(minimalVehicleLength, veh.getVehicleType().getLengthWithGap());
179 }
180#ifdef DEBUG_OCCUPANCY2
181 // refs #3265
182 std::cout << SIMTIME << "ID: " << getDescription() << " minVehicleLength=" << minimalVehicleLength << std::endl;
183#endif
184}
185
186
187bool
189 if ((myParent == nullptr || myParent->vehicleApplies(veh)) && (
190 getLane() == nullptr || !veh.isVehicle() || getLane() == static_cast<MSVehicle&>(veh).getLane())) {
191#ifdef HAVE_FOX
192 ScopedLocker<> lock(myNotificationMutex, MSGlobals::gNumSimThreads > 1);
193#endif
195 removeFromVehicleUpdateValues(veh);
196 }
198 ++nVehArrived;
199 } else if (reason == MSMoveReminder::NOTIFICATION_LANE_CHANGE) {
200 ++nVehLaneChangeFrom;
201 } else if (myParent == nullptr || reason != MSMoveReminder::NOTIFICATION_SEGMENT) {
202 ++nVehLeft;
204 ++nVehTeleported;
206 ++nVehVaporized;
207 }
208 }
209 }
210 if (MSGlobals::gUseMesoSim || !veh.isVehicle()) {
211 // only microsim vehicles keep the reminder until their back has fully left the edge/lane
212 return false;
213 }
215}
216
217
218bool
220#ifdef DEBUG_NOTIFY_ENTER
221 std::cout << "\n" << SIMTIME << " MSMeanData_Net::MSLaneMeanDataValues: veh '" << veh.getID() << "' enters lane '" << enteredLane->getID() << "'" << std::endl;
222#else
223 UNUSED_PARAMETER(enteredLane);
224#endif
225 if (myParent == nullptr || myParent->vehicleApplies(veh)) {
226 if (getLane() == nullptr || !veh.isVehicle() || getLane() == static_cast<MSVehicle&>(veh).getLane()) {
227#ifdef HAVE_FOX
228 ScopedLocker<> lock(myNotificationMutex, MSGlobals::gNumSimThreads > 1);
229#endif
231 ++nVehDeparted;
232 } else if (reason == MSMoveReminder::NOTIFICATION_LANE_CHANGE) {
233 ++nVehLaneChangeTo;
234 } else if (myParent == nullptr || reason != MSMoveReminder::NOTIFICATION_SEGMENT) {
235 ++nVehEntered;
236 }
237 }
238 return true;
239 }
240 return false;
241}
242
243
244bool
246 return sampleSeconds == 0 && nVehDeparted == 0 && nVehArrived == 0 && nVehEntered == 0
247 && nVehLeft == 0 && nVehVaporized == 0 && nVehTeleported == 0 && nVehLaneChangeFrom == 0 && nVehLaneChangeTo == 0;
248}
249
250double
252 return occupationSum / STEPS2TIME(period) / myLaneLength / (double)numLanes * 100.;
253}
254
255void
257 const int numLanes, const double speedLimit, const double defaultTravelTime, const int numVehicles) const {
258
259 double density = frontSampleSeconds / STEPS2TIME(period) * 1000. / myLaneLength;
260 double overlapDensity = sampleSeconds / STEPS2TIME(period) * 1000. / myLaneLength;
262 // avoid exceeding upper bound
263 density = MIN2(density, 1000 * (double)numLanes / MAX2(minimalVehicleLength, NUMERICAL_EPS));
264 overlapDensity = MIN2(overlapDensity, 1000 * (double)numLanes / MAX2(minimalVehicleLength, NUMERICAL_EPS));
265 }
266 const double laneDensity = density / (double)numLanes;
267 const double occupancy = getOccupancy(period, numLanes);
268#ifdef DEBUG_OCCUPANCY2
269 // tests #3264
270 if (occupancy > 100) {
271 std::cout << SIMTIME << " Encountered bad occupancy: " << occupancy
272 << ", myLaneLength=" << myLaneLength << ", period=" << STEPS2TIME(period) << ", occupationSum=" << occupationSum
273 << std::endl;
274 }
275 // refs #3265
276 std::cout << SIMTIME << "ID: " << getDescription() << " minVehicleLength=" << minimalVehicleLength
277 << "\ndensity=" << density << "\n";
278#endif
279
280 if (myParent == nullptr) {
281 const double speed = sampleSeconds == 0 ? 0. : travelledDistance / sampleSeconds;
282 const double frontSpeed = frontSampleSeconds == 0 ? 0. : frontTravelledDistance / frontSampleSeconds;
283 dev.writeOptionalAttr(SUMO_ATTR_DENSITY, density, attributeMask, sampleSeconds == 0);
284 dev.writeOptionalAttr(SUMO_ATTR_LANEDENSITY, laneDensity, attributeMask, sampleSeconds == 0);
285 dev.writeOptionalAttr(SUMO_ATTR_OCCUPANCY, occupancy, attributeMask, sampleSeconds == 0);
286 dev.writeOptionalAttr(SUMO_ATTR_WAITINGTIME, waitSeconds, attributeMask, sampleSeconds == 0);
287 dev.writeOptionalAttr(SUMO_ATTR_TIMELOSS, timeLoss, attributeMask, sampleSeconds == 0);
288 dev.writeOptionalAttr(SUMO_ATTR_SPEED, speed, attributeMask, sampleSeconds == 0);
289 dev.writeOptionalAttr(SUMO_ATTR_SPEEDREL, speedLimit == 0. || sampleSeconds == 0 ? 0. : travelledDistance / sampleSeconds / speedLimit,
290 attributeMask, sampleSeconds == 0);
291 dev.writeOptionalAttr(SUMO_ATTR_DEPARTED, nVehDeparted, attributeMask);
292 dev.writeOptionalAttr(SUMO_ATTR_ARRIVED, nVehArrived, attributeMask);
293 dev.writeOptionalAttr(SUMO_ATTR_ENTERED, nVehEntered, attributeMask);
294 dev.writeOptionalAttr(SUMO_ATTR_LEFT, nVehLeft, attributeMask);
295 dev.writeOptionalAttr(SUMO_ATTR_VAPORIZED, nVehVaporized, attributeMask, nVehVaporized == 0);
296 dev.writeOptionalAttr(SUMO_ATTR_TELEPORTED, nVehTeleported, attributeMask, nVehTeleported == 0);
297 dev.writeOptionalAttr(SUMO_ATTR_FLOW, density * frontSpeed * 3.6, attributeMask, frontSampleSeconds == 0);
298 dev.closeTag();
299 return;
300 }
301 const bool haveSamples = sampleSeconds > myParent->myMinSamples;
302 const bool haveFrontSamples = frontSampleSeconds > myParent->myMinSamples;
303 const bool haveSamplesOrDefault = haveSamples || defaultTravelTime >= 0.;
304 bool haveTravelTime = haveSamplesOrDefault;
305 double traveltime = myParent->myMaxTravelTime;
306 if (haveSamples) {
307 if (numVehicles > 0) {
308 traveltime = sampleSeconds / numVehicles;
309 } else {
310 traveltime = myParent->myMaxTravelTime;
311 if (frontTravelledDistance > NUMERICAL_EPS) {
312 traveltime = MIN2(traveltime, myLaneLength * frontSampleSeconds / frontTravelledDistance);
313 } else if (defaultTravelTime >= 0.) {
314 traveltime = defaultTravelTime;
315 } else {
316 haveTravelTime = false;
317 }
318 }
319 } else if (defaultTravelTime >= 0.) {
320 traveltime = defaultTravelTime;
321 }
322 dev.writeOptionalAttr(SUMO_ATTR_TRAVELTIME, traveltime, attributeMask, !haveTravelTime);
323 double overlapTraveltime = myParent->myMaxTravelTime;
324 if (travelledDistance > 0.) {
325 // one vehicle has to drive lane length + vehicle length before it has left the lane
326 // thus we need to scale with an extended length, approximated by lane length + average vehicle length
327 overlapTraveltime = MIN2(overlapTraveltime, (myLaneLength + vehLengthSum / sampleSeconds) * sampleSeconds / travelledDistance);
328 }
329 dev.writeOptionalAttr(SUMO_ATTR_OVERLAPTRAVELTIME, overlapTraveltime, attributeMask, !haveSamples || numVehicles > 0);
330 dev.writeOptionalAttr(SUMO_ATTR_DENSITY, density, attributeMask, !haveSamples || numVehicles > 0);
331 dev.writeOptionalAttr(SUMO_ATTR_OVERLAPDENSITY, overlapDensity, attributeMask, sampleSeconds == 0);
332 dev.writeOptionalAttr(SUMO_ATTR_LANEDENSITY, laneDensity, attributeMask, !haveSamples || numVehicles > 0);
333 dev.writeOptionalAttr(SUMO_ATTR_OCCUPANCY, occupancy, attributeMask, !haveSamples || numVehicles > 0);
334 dev.writeOptionalAttr(SUMO_ATTR_WAITINGTIME, waitSeconds, attributeMask, !haveSamples);
335 dev.writeOptionalAttr(SUMO_ATTR_TIMELOSS, timeLoss, attributeMask, !haveSamples);
336 double speed = 0.;
337 double frontSpeed = 0.;
338 if (haveSamples) {
339 speed = travelledDistance / sampleSeconds;
340 } else if (defaultTravelTime > 0.) {
341 speed = myLaneLength / defaultTravelTime;
342 }
343 if (haveFrontSamples) {
344 frontSpeed = frontTravelledDistance / frontSampleSeconds;
345 } else if (defaultTravelTime > 0.) {
346 frontSpeed = myLaneLength / defaultTravelTime;
347 }
348 dev.writeOptionalAttr(SUMO_ATTR_SPEED, speed, attributeMask, !haveSamplesOrDefault);
349 dev.writeOptionalAttr(SUMO_ATTR_SPEEDREL, speedLimit == 0. ? 0. : speed / speedLimit, attributeMask, !haveSamplesOrDefault);
350 dev.writeOptionalAttr(SUMO_ATTR_DEPARTED, nVehDeparted, attributeMask);
351 dev.writeOptionalAttr(SUMO_ATTR_ARRIVED, nVehArrived, attributeMask);
352 dev.writeOptionalAttr(SUMO_ATTR_ENTERED, nVehEntered, attributeMask);
353 dev.writeOptionalAttr(SUMO_ATTR_LEFT, nVehLeft, attributeMask);
354 dev.writeOptionalAttr(SUMO_ATTR_LANECHANGEDFROM, nVehLaneChangeFrom, attributeMask);
355 dev.writeOptionalAttr(SUMO_ATTR_LANECHANGEDTO, nVehLaneChangeTo, attributeMask);
356 dev.writeOptionalAttr(SUMO_ATTR_VAPORIZED, nVehVaporized, attributeMask, nVehVaporized == 0);
357 dev.writeOptionalAttr(SUMO_ATTR_TELEPORTED, nVehTeleported, attributeMask, nVehTeleported == 0);
358 dev.writeOptionalAttr(SUMO_ATTR_FLOW, density * frontSpeed * 3.6, attributeMask, !haveSamples || numVehicles == 0);
359 dev.closeTag();
360}
361
362
363double
365 const SUMOTime period, const double numLanes, const double speedLimit) const {
367 switch (a) {
369 return MIN2(frontSampleSeconds / STEPS2TIME(period) * (double) 1000 / myLaneLength,
370 1000. * numLanes / MAX2(minimalVehicleLength, NUMERICAL_EPS));
372 const double density = MIN2(frontSampleSeconds / STEPS2TIME(period) * (double) 1000 / myLaneLength,
373 1000. * numLanes / MAX2(minimalVehicleLength, NUMERICAL_EPS));
374 return density / numLanes;
375 }
377 const double overlapDensity = MIN2(sampleSeconds / STEPS2TIME(period) * (double) 1000 / myLaneLength,
378 1000. * numLanes / MAX2(minimalVehicleLength, NUMERICAL_EPS));
379 return overlapDensity / numLanes;
380 }
382 return occupationSum / STEPS2TIME(period) / myLaneLength / numLanes * (double) 1000;
384 return waitSeconds;
386 return timeLoss;
387 case SUMO_ATTR_SPEED:
388 return travelledDistance / sampleSeconds;
390 return speedLimit == 0. ? 0. : travelledDistance / sampleSeconds / speedLimit;
392 return nVehDeparted;
394 return nVehArrived;
396 return nVehEntered;
397 case SUMO_ATTR_LEFT:
398 return nVehLeft;
400 return nVehVaporized;
402 return nVehTeleported;
403 case SUMO_ATTR_FLOW: {
404 const double density = MIN2(frontSampleSeconds / STEPS2TIME(period) * (double) 1000 / myLaneLength,
405 1000. * numLanes / MAX2(minimalVehicleLength, NUMERICAL_EPS));
406 const double speed = frontTravelledDistance / frontSampleSeconds;
407 return density * speed * 3.6;
408 }
409 default:
410 return 0;
411 }
412}
413
414// ---------------------------------------------------------------------------
415// MSMeanData_Net - methods
416// ---------------------------------------------------------------------------
417MSMeanData_Net::MSMeanData_Net(const std::string& id,
418 const SUMOTime dumpBegin,
419 const SUMOTime dumpEnd, const bool useLanes,
420 const std::string& excludeEmpty,
421 const bool withInternal,
422 const bool trackVehicles,
423 const int detectPersons,
424 const double maxTravelTime,
425 const double minSamples,
426 const double haltSpeed,
427 const double haltSpeedRel,
428 const std::string& vTypes,
429 const std::string& writeAttributes,
430 const std::vector<MSEdge*>& edges,
431 AggregateType aggregate) :
432 MSMeanData(id, dumpBegin, dumpEnd, useLanes, excludeEmpty,
433 withInternal, trackVehicles, detectPersons, maxTravelTime, minSamples, vTypes, writeAttributes, edges, aggregate),
434 myHaltSpeed(haltSpeed),
435 myHaltSpeedRel(haltSpeedRel)
436{ }
437
438
440
441
443MSMeanData_Net::createValues(MSLane* const lane, const double length, const bool doAdd) const {
444 return new MSLaneMeanDataValues(lane, length, doAdd, this);
445}
446
447
448std::vector<std::string>
450 std::vector<std::string> result;
451 result.push_back(toString(SUMO_ATTR_DENSITY));
452 result.push_back(toString(SUMO_ATTR_LANEDENSITY));
453 result.push_back(toString(SUMO_ATTR_OCCUPANCY));
454 result.push_back(toString(SUMO_ATTR_WAITINGTIME));
455 result.push_back(toString(SUMO_ATTR_TIMELOSS));
456 result.push_back(toString(SUMO_ATTR_SPEED));
457 result.push_back(toString(SUMO_ATTR_SPEEDREL));
458 result.push_back(toString(SUMO_ATTR_DEPARTED));
459 result.push_back(toString(SUMO_ATTR_ARRIVED));
460 result.push_back(toString(SUMO_ATTR_ENTERED));
461 result.push_back(toString(SUMO_ATTR_LEFT));
462 result.push_back(toString(SUMO_ATTR_VAPORIZED));
463 result.push_back(toString(SUMO_ATTR_TELEPORTED));
464 result.push_back(toString(SUMO_ATTR_FLOW));
465 return result;
466}
467
468
469double
470MSMeanData_Net::getAttributeValue(const MSLane* lane, SumoXMLAttr a, double defaultValue) const {
471 double result = defaultValue;
472 const std::vector<MeanDataValues*>* edgeValues = getEdgeValues(&lane->getEdge());
473 if (edgeValues == nullptr) {
474 return result;
475 }
476 MeanDataValues* values = nullptr;
477 if (!myAmEdgeBased) {
478 values = (*edgeValues)[lane->getIndex()];
479 } else {
480 MeanDataValues* sumData = createValues(nullptr, lane->getLength(), false);
481 for (MeanDataValues* meanData : (*edgeValues)) {
482 meanData->addTo(*sumData);
483 }
484 values = sumData;
485 }
486 const SUMOTime myLastResetTime = 0; // XXX store last reset time
487 const SUMOTime period = SIMSTEP - myLastResetTime;
488 result = values->getAttributeValue(a, period, lane->getEdge().getNumLanes(), lane->getSpeedLimit());
489 if (myAmEdgeBased) {
490 delete values;
491 }
492 return result;
493}
494
495
496/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define DEBUG_COND2(obj)
#define STEPS2TIME(x)
Definition SUMOTime.h:58
#define SIMSTEP
Definition SUMOTime.h:64
#define TS
Definition SUMOTime.h:45
#define SIMTIME
Definition SUMOTime.h:65
std::bitset< 96 > SumoXMLAttrMask
AggregateType
Numbers representing special SUMO-XML-attribute values Information on edgeData/laneData output should...
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_FLOW
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_WAITINGTIME
@ SUMO_ATTR_OVERLAPDENSITY
@ SUMO_ATTR_OVERLAPTRAVELTIME
@ SUMO_ATTR_LANECHANGEDFROM
@ SUMO_ATTR_TRAVELTIME
@ SUMO_ATTR_SPEEDREL
@ SUMO_ATTR_ARRIVED
@ SUMO_ATTR_TELEPORTED
@ SUMO_ATTR_LANECHANGEDTO
@ SUMO_ATTR_TIMELOSS
@ SUMO_ATTR_VAPORIZED
@ SUMO_ATTR_OCCUPANCY
@ SUMO_ATTR_ENTERED
@ SUMO_ATTR_DEPARTED
@ SUMO_ATTR_LANEDENSITY
@ SUMO_ATTR_DENSITY
@ SUMO_ATTR_LEFT
const double INVALID_DOUBLE
invalid double
Definition StdDefs.h:68
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
double getSpeedLimit() const
Returns the speed limit of the edge @caution The speed limit of the first lane is retured; should pro...
Definition MSEdge.cpp:1192
int getNumLanes() const
Definition MSEdge.h:172
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the maximum speed the vehicle may use on this edge.
Definition MSEdge.cpp:1211
static bool gUseMesoSim
Definition MSGlobals.h:106
static double gLateralResolution
Definition MSGlobals.h:100
static int gNumSimThreads
how many threads to use for simulation
Definition MSGlobals.h:149
Representation of a lane in the micro simulation.
Definition MSLane.h:84
double getSpeedLimit() const
Returns the lane's maximum allowed speed.
Definition MSLane.h:602
double getLength() const
Returns the lane's length.
Definition MSLane.h:632
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:575
int getIndex() const
Returns the lane's index.
Definition MSLane.h:668
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:790
Data structure for mean (aggregated) edge/lane values.
Definition MSMeanData.h:66
double travelledDistance
The sum of the distances the vehicles travelled.
Definition MSMeanData.h:190
virtual double getAttributeValue(SumoXMLAttr a, const SUMOTime period, const double numLanes, const double speedLimit) const
return attribute value
Definition MSMeanData.h:169
Data structure for mean (aggregated) edge/lane values.
bool notifyLeave(SUMOTrafficObject &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle leaves the reminder's lane.
double frontTravelledDistance
The travelled distance regarding the vehicle front.
void addTo(MSMeanData::MeanDataValues &val) const
Add the values of this to the given one and store them there.
void write(OutputDevice &dev, const SumoXMLAttrMask &attributeMask, const SUMOTime period, const int numLanes, const double speedLimit, const double defaultTravelTime, const int numVehicles=-1) const
Writes output values into the given stream.
int nVehLaneChangeTo
The number of vehicles that changed to this lane.
double getAttributeValue(SumoXMLAttr a, const SUMOTime period, const double numLanes, const double speedLimit) const
return attribute value
int nVehVaporized
The number of vehicles that left this lane via vaporization within the sample interval.
double minimalVehicleLength
minimal vehicle length in the current interval (used to determine a maximal density,...
double getOccupancy(SUMOTime period, int numLanes) const
bool isEmpty() const
Returns whether any data was collected.
bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Computes current values and adds them to their sums.
MSLaneMeanDataValues(MSLane *const lane, const double length, const bool doAdd, const MSMeanData_Net *parent)
Constructor.
void notifyMoveInternal(const SUMOTrafficObject &veh, const double frontOnLane, const double timeOnLane, const double, const double meanSpeedVehicleOnLane, const double travelledDistanceFrontOnLane, const double travelledDistanceVehicleOnLane, const double meanLengthOnLane)
Internal notification about the vehicle moves.
int nVehLeft
The number of vehicles that left this lane within the sample interval.
int nVehLaneChangeFrom
The number of vehicles that changed from this lane.
int nVehTeleported
The number of vehicles that left this lane via teleporting within the sample interval.
double timeLoss
The time loss accrued by vehicle probes.
double frontSampleSeconds
The number of vehicle probes regarding the vehicle front.
int nVehArrived
The number of vehicles that finished on the lane.
double waitSeconds
The number of vehicle probes with small speed.
double occupationSum
The sum of the occupation of the lane.
int nVehEntered
The number of vehicles that entered this lane within the sample interval.
double vehLengthSum
The sum of the lengths the vehicles had.
void reset(bool afterWrite=false)
Resets values so they may be used for the next interval.
Network state mean data collector for edges/lanes.
virtual ~MSMeanData_Net()
Destructor.
double getAttributeValue(const MSLane *lane, SumoXMLAttr a, double defaultValue) const
return attribute value for the given lane
std::vector< std::string > getAttributeNames() const
return all attributes that are (potentially) written by this output
MSMeanData::MeanDataValues * createValues(MSLane *const lane, const double length, const bool doAdd) const
Create an instance of MeanDataValues.
const double myHaltSpeedRel
the minimum relative speed to consider a vehicle halting
MSMeanData_Net(const std::string &id, const SUMOTime dumpBegin, const SUMOTime dumpEnd, const bool useLanes, const std::string &excludeEmpty, const bool withInternal, const bool trackVehicles, const int detectPersons, const double maxTravelTime, const double minSamples, const double haltSpeed, const double haltSpeedRel, const std::string &vTypes, const std::string &writeAttributes, const std::vector< MSEdge * > &edges, AggregateType aggregate)
Constructor.
const double myHaltSpeed
the minimum speed to consider a vehicle halting
Data collector for edges/lanes.
Definition MSMeanData.h:57
const bool myAmEdgeBased
Information whether the output shall be edge-based (not lane-based)
Definition MSMeanData.h:501
const std::vector< MeanDataValues * > * getEdgeValues(const MSEdge *edge) const
Notification
Definition of a vehicle state.
@ NOTIFICATION_ARRIVED
The vehicle arrived at its destination (is deleted)
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_VAPORIZED_CALIBRATOR
The vehicle got removed by a calibrator.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_SEGMENT
The vehicle changes the segment (meso only)
@ NOTIFICATION_LANE_CHANGE
The vehicle changes lanes (micro only)
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
double getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
double getLength() const
Get vehicle's length [m].
const std::string & getID() const
Returns the id.
Definition Named.h:73
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeOptionalAttr(const SumoXMLAttr attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute unless null
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
Representation of a vehicle, person, or container.
virtual bool isVehicle() const
Whether it is a vehicle.
virtual const MSEdge * getCurrentEdge() const =0
Returns the edge (normal or internal) the object is currently at.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual SUMOTime getWaitingTime(const bool accumulated=false) const =0
virtual bool isStopped() const =0
Returns whether the object is at a stop.
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
virtual const MSEdge * getEdge() const =0
Returns the (normal) route edge the object is currently at.
A scoped lock which only triggers on condition.
#define UNUSED_PARAMETER(x)