Eclipse SUMO - Simulation of Urban MObility
MSMeanData.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2022 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 /****************************************************************************/
19 // Data collector for edges/lanes
20 /****************************************************************************/
21 #pragma once
22 #include <config.h>
23 
24 #include <vector>
25 #include <set>
26 #include <list>
27 #include <limits>
30 #include <utils/common/SUMOTime.h>
31 
32 
33 // ===========================================================================
34 // class declarations
35 // ===========================================================================
36 class OutputDevice;
37 class MSEdge;
38 class MSLane;
39 class SUMOTrafficObject;
40 
41 typedef std::vector<MSEdge*> MSEdgeVector;
42 
43 // ===========================================================================
44 // class definitions
45 // ===========================================================================
58 public:
66  class MeanDataValues : public MSMoveReminder {
67  public:
69  MeanDataValues(MSLane* const lane, const double length, const bool doAdd, const MSMeanData* const parent);
70 
72  virtual ~MeanDataValues();
73 
74 
77  virtual void reset(bool afterWrite = false) = 0;
78 
83  virtual void addTo(MeanDataValues& val) const = 0;
84 
85 
94  virtual bool notifyEnter(SUMOTrafficObject& veh, MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
95 
96 
110  bool notifyMove(SUMOTrafficObject& veh, double oldPos,
111  double newPos, double newSpeed);
112 
113 
122  virtual bool notifyLeave(SUMOTrafficObject& veh, double lastPos,
123  MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
124 
125 
130  virtual bool isEmpty() const;
131 
132 
135  virtual void update();
136 
144  virtual void write(OutputDevice& dev, long long int attributeMask, const SUMOTime period,
145  const double numLanes, const double speedLimit, const double defaultTravelTime,
146  const int numVehicles = -1) const = 0;
147 
151  virtual double getSamples() const;
152 
156  double getTravelledDistance() const {
157  return travelledDistance;
158  }
159 
160  protected:
162  const MSMeanData* const myParent;
163 
165  const double myLaneLength;
166 
171 
175 
176  };
177 
178 
184  public:
186  MeanDataValueTracker(MSLane* const lane, const double length,
187  const MSMeanData* const parent);
188 
190  virtual ~MeanDataValueTracker();
191 
194  void reset(bool afterWrite);
195 
200  void addTo(MSMeanData::MeanDataValues& val) const;
201 
204 
208  void notifyMoveInternal(const SUMOTrafficObject& veh, const double frontOnLane, const double timeOnLane, const double meanSpeedFrontOnLane, const double meanSpeedVehicleOnLane, const double travelledDistanceFrontOnLane, const double travelledDistanceVehicleOnLane, const double meanLengthOnLane);
209 
210 
220  bool notifyLeave(SUMOTrafficObject& veh, double lastPos, MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
221 
222 
234  bool notifyEnter(SUMOTrafficObject& veh, MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
236 
237  bool isEmpty() const;
238 
246  void write(OutputDevice& dev, long long int attributeMask, const SUMOTime period,
247  const double numLanes, const double speedLimit, const double defaultTravelTime,
248  const int numVehicles = -1) const;
249 
250  int getNumReady() const;
251 
252  void clearFirst();
253 
254  double getSamples() const;
255 
256  private:
257  class TrackerEntry {
258  public:
261  : myNumVehicleEntered(0), myNumVehicleLeft(0), myValues(values) {}
262 
264  virtual ~TrackerEntry() {
265  delete myValues;
266  }
267 
270 
273 
276  };
277 
279  std::map<const SUMOTrafficObject*, TrackerEntry*> myTrackedData;
280 
282  std::list<TrackerEntry*> myCurrentData;
283 
284  };
285 
286 
287 public:
303  MSMeanData(const std::string& id,
304  const SUMOTime dumpBegin, const SUMOTime dumpEnd,
305  const bool useLanes, const bool withEmpty,
306  const bool printDefaults, const bool withInternal,
307  const bool trackVehicles, const int detectPersons,
308  const double minSamples,
309  const double maxTravelTime,
310  const std::string& vTypes,
311  const std::string& writeAttributes);
312 
313 
315  virtual ~MSMeanData();
316 
319  void init();
320 
323 
338  void writeXMLOutput(OutputDevice& dev, SUMOTime startTime, SUMOTime stopTime);
339 
346  virtual void writeXMLDetectorProlog(OutputDevice& dev) const;
348 
351  virtual void detectorUpdate(const SUMOTime step);
352 
353  double getMinSamples() const {
354  return myMinSamples;
355  }
356 
357  double getMaxTravelTime() const {
358  return myMaxTravelTime;
359  }
360 
361  bool isEdgeData() const {
362  return myAmEdgeBased;
363  }
364 
365 
366 protected:
372  virtual MSMeanData::MeanDataValues* createValues(MSLane* const lane, const double length, const bool doAdd) const = 0;
373 
379  void resetOnly(SUMOTime stopTime);
380 
385  virtual std::string getEdgeID(const MSEdge* const edge);
386 
401  void writeEdge(OutputDevice& dev, const std::vector<MeanDataValues*>& edgeValues,
402  MSEdge* edge, SUMOTime startTime, SUMOTime stopTime);
403 
410  virtual void openInterval(OutputDevice& dev, const SUMOTime startTime, const SUMOTime stopTime);
411 
421  virtual bool writePrefix(OutputDevice& dev, const MeanDataValues& values,
422  const SumoXMLTag tag, const std::string id) const;
423 
424 protected:
426  const double myMinSamples;
427 
429  const double myMaxTravelTime;
430 
432  std::vector<std::vector<MeanDataValues*> > myMeasures;
433 
435  const bool myDumpEmpty;
436 
437 private:
438  static long long int initWrittenAttributes(const std::string writeAttributes, const std::string& id);
439 
441  const bool myAmEdgeBased;
442 
445 
448 
451 
453  const bool myPrintDefaults;
454 
456  const bool myDumpInternal;
457 
459  const bool myTrackVehicles;
460 
462  const long long int myWrittenAttributes;
463 
465  std::list< std::pair<SUMOTime, SUMOTime> > myPendingIntervals;
466 
467 private:
470 
473 
474 };
std::vector< MSEdge * > MSEdgeVector
Definition: MSEdge.h:73
std::vector< MSEdge * > MSEdgeVector
Definition: MSMeanData.h:39
long long int SUMOTime
Definition: SUMOTime.h:32
SumoXMLTag
Numbers representing SUMO-XML - element names.
Base of value-generating classes (detectors)
A road/street connecting two junctions.
Definition: MSEdge.h:77
Representation of a lane in the micro simulation.
Definition: MSLane.h:82
Definition: MSMeanData.h:257
MeanDataValues * myValues
The number of vehicles which left in the current interval.
Definition: MSMeanData.h:275
virtual ~TrackerEntry()
Constructor.
Definition: MSMeanData.h:264
int myNumVehicleEntered
The number of vehicles which entered in the current interval.
Definition: MSMeanData.h:269
TrackerEntry(MeanDataValues *const values)
Constructor.
Definition: MSMeanData.h:260
int myNumVehicleLeft
The number of vehicles which left in the current interval.
Definition: MSMeanData.h:272
Data structure for mean (aggregated) edge/lane values for tracked vehicles.
Definition: MSMeanData.h:183
double getSamples() const
Returns the number of collected sample seconds.
Definition: MSMeanData.cpp:404
MeanDataValueTracker(MSLane *const lane, const double length, const MSMeanData *const parent)
Constructor.
Definition: MSMeanData.cpp:288
bool notifyLeave(SUMOTrafficObject &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle leaves the reminder's lane.
Definition: MSMeanData.cpp:337
void addTo(MSMeanData::MeanDataValues &val) const
Add the values of this to the given one and store them there.
Definition: MSMeanData.cpp:325
void notifyMoveInternal(const SUMOTrafficObject &veh, const double frontOnLane, const double timeOnLane, const double meanSpeedFrontOnLane, const double meanSpeedVehicleOnLane, const double travelledDistanceFrontOnLane, const double travelledDistanceVehicleOnLane, const double meanLengthOnLane)
Internal notification about the vehicle moves.
Definition: MSMeanData.cpp:331
virtual ~MeanDataValueTracker()
Destructor.
Definition: MSMeanData.cpp:296
bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Computes current values and adds them to their sums.
Definition: MSMeanData.cpp:346
std::list< TrackerEntry * > myCurrentData
The currently active meandata "intervals".
Definition: MSMeanData.h:282
bool isEmpty() const
Returns whether any data was collected.
Definition: MSMeanData.cpp:370
void reset(bool afterWrite)
Resets values so they may be used for the next interval.
Definition: MSMeanData.cpp:313
void write(OutputDevice &dev, long long int attributeMask, const SUMOTime period, const double numLanes, const double speedLimit, const double defaultTravelTime, const int numVehicles=-1) const
Writes output values into the given stream.
Definition: MSMeanData.cpp:376
std::map< const SUMOTrafficObject *, TrackerEntry * > myTrackedData
The map of vehicles to data entries.
Definition: MSMeanData.h:279
Data structure for mean (aggregated) edge/lane values.
Definition: MSMeanData.h:66
virtual void addTo(MeanDataValues &val) const =0
Add the values of this to the given one and store them there.
virtual void write(OutputDevice &dev, long long int attributeMask, const SUMOTime period, const double numLanes, const double speedLimit, const double defaultTravelTime, const int numVehicles=-1) const =0
Writes output values into the given stream.
virtual bool notifyLeave(SUMOTrafficObject &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle leaves the reminder's lane.
Definition: MSMeanData.cpp:260
MeanDataValues(MSLane *const lane, const double length, const bool doAdd, const MSMeanData *const parent)
Constructor.
Definition: MSMeanData.cpp:60
double getTravelledDistance() const
Returns the total travelled distance.
Definition: MSMeanData.h:156
virtual void update()
Called if a per timestep update is needed. Default does nothing.
Definition: MSMeanData.cpp:275
double travelledDistance
The sum of the distances the vehicles travelled.
Definition: MSMeanData.h:173
virtual bool isEmpty() const
Returns whether any data was collected.
Definition: MSMeanData.cpp:269
bool notifyMove(SUMOTrafficObject &veh, double oldPos, double newPos, double newSpeed)
Checks whether the reminder still has to be notified about the vehicle moves.
Definition: MSMeanData.cpp:87
const double myLaneLength
The length of the lane / edge the data collector is on.
Definition: MSMeanData.h:165
virtual ~MeanDataValues()
Destructor.
Definition: MSMeanData.cpp:70
virtual void reset(bool afterWrite=false)=0
Resets values so they may be used for the next interval.
virtual bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Called if the vehicle enters the reminder's lane.
Definition: MSMeanData.cpp:75
const MSMeanData *const myParent
The meandata parent.
Definition: MSMeanData.h:162
virtual double getSamples() const
Returns the number of collected sample seconds.
Definition: MSMeanData.cpp:280
Data collector for edges/lanes.
Definition: MSMeanData.h:57
double getMaxTravelTime() const
Definition: MSMeanData.h:357
void writeXMLOutput(OutputDevice &dev, SUMOTime startTime, SUMOTime stopTime)
Writes collected values into the given stream.
Definition: MSMeanData.cpp:613
void writeEdge(OutputDevice &dev, const std::vector< MeanDataValues * > &edgeValues, MSEdge *edge, SUMOTime startTime, SUMOTime stopTime)
Writes edge values into the given stream.
Definition: MSMeanData.cpp:524
const bool myDumpInternal
Whether internal lanes/edges shall be written.
Definition: MSMeanData.h:456
const SUMOTime myDumpBegin
The first and the last time step to write information (-1 indicates always)
Definition: MSMeanData.h:444
virtual void detectorUpdate(const SUMOTime step)
Updates the detector.
Definition: MSMeanData.cpp:663
bool isEdgeData() const
Definition: MSMeanData.h:361
virtual ~MSMeanData()
Destructor.
Definition: MSMeanData.cpp:484
double getMinSamples() const
Definition: MSMeanData.h:353
virtual MSMeanData::MeanDataValues * createValues(MSLane *const lane, const double length, const bool doAdd) const =0
Create an instance of MeanDataValues.
void init()
Adds the value collectors to all relevant edges.
Definition: MSMeanData.cpp:438
const double myMinSamples
the minimum sample seconds
Definition: MSMeanData.h:426
void resetOnly(SUMOTime stopTime)
Resets network value in order to allow processing of the next interval.
Definition: MSMeanData.cpp:494
const long long int myWrittenAttributes
bit mask for checking attributes to be written
Definition: MSMeanData.h:462
const bool myPrintDefaults
Whether empty lanes/edges shall be written.
Definition: MSMeanData.h:453
MSMeanData(const MSMeanData &)
Invalidated copy constructor.
const bool myAmEdgeBased
Information whether the output shall be edge-based (not lane-based)
Definition: MSMeanData.h:441
SUMOTime myInitTime
time at which init was called();
Definition: MSMeanData.h:447
const double myMaxTravelTime
the maximum travel time to write
Definition: MSMeanData.h:429
const SUMOTime myDumpEnd
Definition: MSMeanData.h:444
std::list< std::pair< SUMOTime, SUMOTime > > myPendingIntervals
The intervals for which output still has to be generated (only in the tracking case)
Definition: MSMeanData.h:465
virtual std::string getEdgeID(const MSEdge *const edge)
Return the relevant edge id.
Definition: MSMeanData.cpp:518
static long long int initWrittenAttributes(const std::string writeAttributes, const std::string &id)
Definition: MSMeanData.cpp:671
virtual void writeXMLDetectorProlog(OutputDevice &dev) const
Opens the XML-output using "netstats" as root element.
Definition: MSMeanData.cpp:657
const bool myDumpEmpty
Whether empty lanes/edges shall be written.
Definition: MSMeanData.h:435
MSEdgeVector myEdges
The corresponding first edges.
Definition: MSMeanData.h:450
virtual void openInterval(OutputDevice &dev, const SUMOTime startTime, const SUMOTime stopTime)
Writes the interval opener.
Definition: MSMeanData.cpp:594
MSMeanData(const std::string &id, const SUMOTime dumpBegin, const SUMOTime dumpEnd, const bool useLanes, const bool withEmpty, const bool printDefaults, const bool withInternal, const bool trackVehicles, const int detectPersons, const double minSamples, const double maxTravelTime, const std::string &vTypes, const std::string &writeAttributes)
Constructor.
Definition: MSMeanData.cpp:412
std::vector< std::vector< MeanDataValues * > > myMeasures
Value collectors; sorted by edge, then by lane.
Definition: MSMeanData.h:432
virtual bool writePrefix(OutputDevice &dev, const MeanDataValues &values, const SumoXMLTag tag, const std::string id) const
Checks for emptiness and writes prefix into the given stream.
Definition: MSMeanData.cpp:601
const bool myTrackVehicles
Whether vehicles are tracked.
Definition: MSMeanData.h:459
MSMeanData & operator=(const MSMeanData &)
Invalidated assignment operator.
Something on a lane to be noticed about vehicle movement.
Notification
Definition of a vehicle state.
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
Representation of a vehicle, person, or container.