Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
TrackerValueDesc.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-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/****************************************************************************/
21// Storage for a tracked value
22/****************************************************************************/
23#include <config.h>
24
25#include <string>
26#include <vector>
29#include "TrackerValueDesc.h"
30
31
32// ===========================================================================
33// method definitions
34// ===========================================================================
35TrackerValueDesc::TrackerValueDesc(const std::string& name,
36 const RGBColor& col,
37 SUMOTime recordBegin,
38 double aggregationSeconds)
39 : myName(name), myActiveCol(col), myInactiveCol(col),
40 myMin(0), myMax(0),
41 myAggregationInterval(MAX2(1, (int)(TIME2STEPS(aggregationSeconds) / DELTA_T))),
42 myInvalidValue(INVALID_DOUBLE),
43 myValidNo(0),
44 myRecordingBegin(recordBegin), myTmpLastAggValue(0) {}
45
46
48 // just to quit cleanly on a failure
49 if (myLock.locked()) {
50 myLock.unlock();
51 }
52}
53
54
55void
57 if (myValues.size() == 0) {
58 myMin = value;
59 myMax = value;
60 } else {
61 myMin = value < myMin ? value : myMin;
62 myMax = value > myMax ? value : myMax;
63 }
64 FXMutexLock locker(myLock);
65 myValues.push_back(value);
66 if (value != myInvalidValue) {
67 myTmpLastAggValue += value;
68 myValidNo++;
69 }
70 const double avg = myValidNo == 0 ? static_cast<double>(0) : myTmpLastAggValue / static_cast<double>(myValidNo);
71 if (myAggregationInterval == 1 || myValues.size() % myAggregationInterval == 1) {
72 myAggregatedValues.push_back(avg);
73 } else {
74 myAggregatedValues.back() = avg;
75 }
76 if (myValues.size() % myAggregationInterval == 0) {
78 myValidNo = 0;
79 }
80}
81
82
83double
85 return myMax - myMin;
86}
87
88
89double
91 return myMin;
92}
93
94
95double
97 return myMax;
98}
99
100
101double
103 return (myMin + myMax) / 2.0f;
104}
105
106
107const RGBColor&
109 return myActiveCol;
110}
111
112
113const std::vector<double>&
115 myLock.lock();
116 return myValues;
117}
118
119
120const std::vector<double>&
125
126
127const std::string&
129 return myName;
130}
131
132void
136
137
138void
140 FXMutexLock locker(myLock);
141 if (myAggregationInterval != as / DELTA_T) {
142 myAggregationInterval = (int)(as / DELTA_T);
143 // ok, the aggregation has changed,
144 // let's recompute the list of aggregated values
145 myAggregatedValues.clear();
146 std::vector<double>::const_iterator i = myValues.begin();
147 while (i != myValues.end()) {
149 myValidNo = 0;
150 for (int j = 0; j < myAggregationInterval && i != myValues.end(); j++, ++i) {
151 if ((*i) != myInvalidValue) {
152 myTmpLastAggValue += (*i);
153 myValidNo++;
154 }
155 }
156 if (myValidNo == 0) {
157 myAggregatedValues.push_back(0);
158 } else {
159 myAggregatedValues.push_back(myTmpLastAggValue / static_cast<double>(myValidNo));
160 }
161 }
162 }
163}
164
165
170
171
176
177
178/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
#define TIME2STEPS(x)
Definition SUMOTime.h:57
const double INVALID_DOUBLE
invalid double
Definition StdDefs.h:64
T MAX2(T a, T b)
Definition StdDefs.h:82
void addValue(double value)
Adds a new value to the list.
void setAggregationSpan(SUMOTime as)
set the aggregation amount
RGBColor myActiveCol
The color to use when the value is set as "active".
int myValidNo
Counter for valid numbers within the current aggregation interval.
const std::string & getName() const
Returns the name of the value.
double getMax() const
Returns the values maximum.
void unlockValues()
Releases the locking after the values have been drawn.
std::vector< double > myValues
Values collected.
~TrackerValueDesc()
Destructor.
double getYCenter() const
Returns the center of the value.
SUMOTime myRecordingBegin
The time step the values are added from.
double getRange() const
returns the maximum value range
std::string myName
The name of the value.
const std::vector< double > & getValues()
returns the vector of collected values The values will be locked - no further addition will be perfom...
SUMOTime getAggregationSpan() const
get the aggregation amount
const std::vector< double > & getAggregatedValues()
returns the vector of aggregated values The values will be locked - no further addition will be perfo...
const RGBColor & getColor() const
Returns the color to use to display the value.
SUMOTime getRecordingBegin() const
Returns the timestep the recording started.
double myTmpLastAggValue
Temporary storage for the last aggregation interval.
double getMin() const
Returns the values minimum.
int myAggregationInterval
The aggregation interval in simulation steps.
double myInvalidValue
Values like this shall not be counted on aggregation.
TrackerValueDesc(const std::string &name, const RGBColor &col, SUMOTime recordBegin, double aggregationSeconds)
Constructor.
double myMin
The minimum and the maximum of the value.
std::vector< double > myAggregatedValues
Collected values in their aggregated form.