Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/gui/tracker/TrackerValueDesc.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 TrackerValueDesc.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @author Laura Bieker
19
/// @date Sept 2002
20
///
21
// Storage for a tracked value
22
/****************************************************************************/
23
#include <config.h>
24
25
#include <string>
26
#include <vector>
27
#include <utils/common/RGBColor.h>
28
#include <utils/gui/globjects/GUIGlObject.h>
29
#include "TrackerValueDesc.h"
30
31
32
// ===========================================================================
33
// method definitions
34
// ===========================================================================
35
TrackerValueDesc::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
47
TrackerValueDesc::~TrackerValueDesc() {
48
// just to quit cleanly on a failure
49
if (myLock.locked()) {
50
myLock.unlock();
51
}
52
}
53
54
55
void
56
TrackerValueDesc::addValue(double value) {
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) {
77
myTmpLastAggValue = 0;
78
myValidNo = 0;
79
}
80
}
81
82
83
double
84
TrackerValueDesc::getRange() const {
85
return myMax - myMin;
86
}
87
88
89
double
90
TrackerValueDesc::getMin() const {
91
return myMin;
92
}
93
94
95
double
96
TrackerValueDesc::getMax() const {
97
return myMax;
98
}
99
100
101
double
102
TrackerValueDesc::getYCenter() const {
103
return (myMin + myMax) / 2.0f;
104
}
105
106
107
const RGBColor&
108
TrackerValueDesc::getColor() const {
109
return myActiveCol;
110
}
111
112
113
const std::vector<double>&
114
TrackerValueDesc::getValues() {
115
myLock.lock();
116
return myValues;
117
}
118
119
120
const std::vector<double>&
121
TrackerValueDesc::getAggregatedValues() {
122
myLock.lock();
123
return myAggregatedValues;
124
}
125
126
127
const std::string&
128
TrackerValueDesc::getName() const {
129
return myName;
130
}
131
132
void
133
TrackerValueDesc::unlockValues() {
134
myLock.unlock();
135
}
136
137
138
void
139
TrackerValueDesc::setAggregationSpan(SUMOTime as) {
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()) {
148
myTmpLastAggValue = 0;
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
166
SUMOTime
167
TrackerValueDesc::getAggregationSpan() const {
168
return myAggregationInterval * DELTA_T;
169
}
170
171
172
SUMOTime
173
TrackerValueDesc::getRecordingBegin() const {
174
return myRecordingBegin;
175
}
176
177
178
/****************************************************************************/
179
180