Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2009-2024 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 : /****************************************************************************/
14 : /// @file MSDevice_Tripinfo.h
15 : /// @author Daniel Krajzewicz
16 : /// @author Michael Behrisch
17 : /// @author Jakob Erdmann
18 : /// @date Fri, 30.01.2009
19 : ///
20 : // A device which collects info on the vehicle trip
21 : /****************************************************************************/
22 : #pragma once
23 : #include <config.h>
24 :
25 : #include "MSVehicleDevice.h"
26 : #include <utils/common/SUMOTime.h>
27 :
28 : // ===========================================================================
29 : // class declarations
30 : // ===========================================================================
31 : class SUMOVehicle;
32 : class SUMOTrafficObject;
33 :
34 : // ===========================================================================
35 : // class definitions
36 : // ===========================================================================
37 : /**
38 : * @class MSDevice_Tripinfo
39 : * @brief A device which collects info on the vehicle trip (mainly on departure and arrival)
40 : *
41 : * Each device collects departure time, lane and speed and the same for arrival.
42 : *
43 : * @see MSDevice
44 : */
45 : class MSDevice_Tripinfo : public MSVehicleDevice {
46 : public:
47 : /** @brief Inserts MSDevice_Tripinfo-options
48 : * @param[filled] oc The options container to add the options to
49 : */
50 : static void insertOptions(OptionsCont& oc);
51 :
52 : /** @brief Build devices for the given vehicle, if needed
53 : *
54 : * The options are read and evaluated whether a tripinfo-device shall be built
55 : * for the given vehicle.
56 : *
57 : * The built device is stored in the given vector.
58 : *
59 : * @param[in] v The vehicle for which a device may be built
60 : * @param[filled] into The vector to store the built device in
61 : */
62 : static void buildVehicleDevices(SUMOVehicle& v, std::vector<MSVehicleDevice*>& into);
63 :
64 : /// @brief generate output for vehicles which are still in the network
65 : static void generateOutputForUnfinished();
66 :
67 : /// @brief record tripinfo data for pedestrians
68 : static void addPedestrianData(double walkLength, SUMOTime walkDuration, SUMOTime walkTimeLoss);
69 :
70 : /// @brief record tripinfo data for rides and transports
71 : static void addRideTransportData(const bool isPerson, const double distance, const SUMOTime duration,
72 : const SUMOVehicleClass vClass, const std::string& line, const SUMOTime waitingTime);
73 :
74 : /// @brief get statistics for printing to stdout
75 : static std::string printStatistics();
76 :
77 : /// @brief write statistic output to (xml) file
78 : static void writeStatistics(OutputDevice& od);
79 :
80 : /// @brief accessors for GUINet-Parameters
81 : static double getAvgRouteLength();
82 : static double getAvgTripSpeed();
83 : static double getAvgDuration();
84 : static double getAvgWaitingTime();
85 : static double getAvgTimeLoss();
86 : static double getAvgDepartDelay();
87 : static double getAvgDepartDelayWaiting();
88 : static double getTotalDepartDelay();
89 :
90 : static double getAvgBikeRouteLength();
91 : static double getAvgBikeTripSpeed();
92 : static double getAvgBikeDuration();
93 : static double getAvgBikeWaitingTime();
94 : static double getAvgBikeTimeLoss();
95 :
96 : static double getAvgWalkRouteLength();
97 : static double getAvgWalkDuration();
98 : static double getAvgWalkTimeLoss();
99 :
100 : static double getAvgRideRouteLength();
101 : static double getAvgRideWaitingTime();
102 : static double getAvgRideDuration();
103 :
104 : public:
105 : /// @brief Destructor.
106 : ~MSDevice_Tripinfo();
107 :
108 :
109 : /// @brief resets counters
110 : static void cleanup();
111 :
112 :
113 : /// @name Methods called on vehicle movement / state change, overwriting MSDevice
114 : /// @{
115 :
116 : /** @brief Checks for waiting steps when the vehicle moves
117 : *
118 : * @param[in] veh Vehicle that asks this reminder.
119 : * @param[in] oldPos Position before move.
120 : * @param[in] newPos Position after move with newSpeed.
121 : * @param[in] newSpeed Moving speed.
122 : * @return True (always).
123 : */
124 : bool notifyMove(SUMOTrafficObject& veh, double oldPos, double newPos, double newSpeed);
125 :
126 : /** @brief record idling as waiting time - cf issue 2233
127 : *
128 : * @param[in] veh The idling vehicle.
129 : * @return Always true
130 : *
131 : * @see MSMoveReminder::notifyIdle
132 : */
133 : bool notifyIdle(SUMOTrafficObject& veh);
134 :
135 : /** @brief Saves departure info on insertion
136 : *
137 : * @param[in] veh The entering vehicle.
138 : * @param[in] reason how the vehicle enters the lane
139 : * @return Always true
140 : * @see MSMoveReminder::notifyEnter
141 : * @see MSMoveReminder::Notification
142 : */
143 : bool notifyEnter(SUMOTrafficObject& veh, MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
144 :
145 :
146 : /** @brief Saves arrival info
147 : *
148 : * @param[in] veh The leaving vehicle.
149 : * @param[in] lastPos Position on the lane when leaving.
150 : * @param[in] isArrival whether the vehicle arrived at its destination
151 : * @param[in] isLaneChange whether the vehicle changed from the lane
152 : * @return True if it did not leave the net.
153 : */
154 : bool notifyLeave(SUMOTrafficObject& veh, double lastPos, MSMoveReminder::Notification reason, const MSLane* enteredLane = 0);
155 : /// @}
156 :
157 :
158 : /// @brief return the name for this type of device
159 2470 : const std::string deviceName() const {
160 2470 : return "tripinfo";
161 : }
162 :
163 : /** @brief Called on writing tripinfo output
164 : *
165 : * @param[in] os The stream to write the information into
166 : * @exception IOError not yet implemented
167 : * @see MSDevice::generateOutput
168 : */
169 : void generateOutput(OutputDevice* tripinfoOut) const;
170 :
171 : /** @brief Saves the state of the device
172 : *
173 : * @param[in] out The OutputDevice to write the information into
174 : */
175 : void saveState(OutputDevice& out) const;
176 :
177 : /** @brief Loads the state of the device from the given description
178 : *
179 : * @param[in] attrs XML attributes describing the current state
180 : */
181 : void loadState(const SUMOSAXAttributes& attrs);
182 :
183 : /// @brief update stopping time for meso
184 : void updateStopTime(const SUMOTime time) {
185 13061258 : myStoppingTime += time;
186 13061258 : }
187 :
188 :
189 : /// @brief try to retrieve the given parameter from this device. Throw exception for unsupported key
190 : std::string getParameter(const std::string& key) const;
191 :
192 : /// @brief try to retrieve the given parameter from the global statistics. Throw exception for unsupported key
193 : static std::string getGlobalParameter(const std::string& prefixedKey);
194 :
195 : private:
196 : /** @brief Constructor
197 : *
198 : * @param[in] holder The vehicle that holds this device
199 : * @param[in] id The ID of the device
200 : */
201 : MSDevice_Tripinfo(SUMOVehicle& holder, const std::string& id);
202 :
203 :
204 : protected:
205 : /** @brief Internal notification about the vehicle moves, see MSMoveReminder::notifyMoveInternal()
206 : *
207 : */
208 : void notifyMoveInternal(const SUMOTrafficObject& veh,
209 : const double frontOnLane,
210 : const double timeOnLane,
211 : const double meanSpeedFrontOnLane,
212 : const double meanSpeedVehicleOnLane,
213 : const double travelledDistanceFrontOnLane,
214 : const double travelledDistanceVehicleOnLane,
215 : const double meanLengthOnLane);
216 :
217 : /// @brief update stopping time after parking
218 : void updateParkingStopTime();
219 :
220 : static void printRideStatistics(std::ostringstream& msg, const std::string& category, const std::string& modeName, const int index);
221 :
222 : static void writeRideStatistics(OutputDevice& od, const std::string& category, const int index);
223 :
224 : static bool lowAcceleration(const SUMOTrafficObject& veh);
225 :
226 : private:
227 : /// @brief The lane the vehicle departed at
228 : std::string myDepartLane;
229 :
230 : /// @brief The speed on departure
231 : double myDepartSpeed;
232 :
233 : /// @brief The lateral depart position
234 : double myDepartPosLat;
235 :
236 : /// @brief The overall waiting time
237 : SUMOTime myWaitingTime;
238 :
239 : /// @brief Whether the vehicle is currently waiting
240 : bool myAmWaiting;
241 :
242 : /// @brief The overall number of unintended stops
243 : int myWaitingCount;
244 :
245 : /// @brief The overall intentional stopping time
246 : SUMOTime myStoppingTime;
247 :
248 : /// @brief The time when parking started
249 : SUMOTime myParkingStarted;
250 :
251 : /// @brief The vehicle's arrival time
252 : SUMOTime myArrivalTime;
253 :
254 : /// @brief The lane the vehicle arrived at
255 : std::string myArrivalLane;
256 :
257 : /// @brief The position on the lane the vehicle arrived at
258 : double myArrivalPos;
259 :
260 : /// @brief The lateral position on the lane the vehicle arrived at
261 : double myArrivalPosLat;
262 :
263 : /// @brief The speed when arriving
264 : double myArrivalSpeed;
265 :
266 : /// @brief The reason for vehicle arrival
267 : MSMoveReminder::Notification myArrivalReason;
268 :
269 : /// @brief The time loss when compared to the desired and allowed speed
270 : SUMOTime myMesoTimeLoss;
271 :
272 : /// @brief The route length
273 : double myRouteLength;
274 :
275 : /// @brief devices which may still need to produce output
276 : static std::set<const MSDevice_Tripinfo*, ComparatorNumericalIdLess> myPendingOutput;
277 :
278 : /// @brief global tripinfo statistics
279 : static int myVehicleCount;
280 : static int myUndepartedVehicleCount;
281 : static double myTotalRouteLength;
282 : static double myTotalSpeed;
283 : static SUMOTime myTotalDuration;
284 : static SUMOTime myTotalWaitingTime;
285 : static SUMOTime myTotalTimeLoss;
286 : static SUMOTime myTotalDepartDelay;
287 : static SUMOTime myWaitingDepartDelay;
288 :
289 : /// @brief separate values for bicycles
290 : static int myBikeCount;
291 : static double myTotalBikeRouteLength;
292 : static double myTotalBikeSpeed;
293 : static SUMOTime myTotalBikeDuration;
294 : static SUMOTime myTotalBikeWaitingTime;
295 : static SUMOTime myTotalBikeTimeLoss;
296 :
297 : static int myWalkCount;
298 : static double myTotalWalkRouteLength;
299 : static SUMOTime myTotalWalkDuration;
300 : static SUMOTime myTotalWalkTimeLoss;
301 :
302 : static std::vector<int> myRideCount;
303 : static std::vector<int> myRideBusCount;
304 : static std::vector<int> myRideRailCount;
305 : static std::vector<int> myRideTaxiCount;
306 : static std::vector<int> myRideBikeCount;
307 : static std::vector<int> myRideAbortCount;
308 : static std::vector<SUMOTime> myTotalRideWaitingTime;
309 : static std::vector<double> myTotalRideRouteLength;
310 : static std::vector<SUMOTime> myTotalRideDuration;
311 :
312 : private:
313 : /// @brief Invalidated copy constructor.
314 : MSDevice_Tripinfo(const MSDevice_Tripinfo&);
315 :
316 : /// @brief Invalidated assignment operator.
317 : MSDevice_Tripinfo& operator=(const MSDevice_Tripinfo&);
318 :
319 :
320 : };
|