Path: blob/main/src/utils/gui/tracker/TrackerValueDesc.cpp
169684 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file TrackerValueDesc.cpp14/// @author Daniel Krajzewicz15/// @author Jakob Erdmann16/// @author Michael Behrisch17/// @author Laura Bieker18/// @date Sept 200219///20// Storage for a tracked value21/****************************************************************************/22#include <config.h>2324#include <string>25#include <vector>26#include <utils/common/RGBColor.h>27#include <utils/gui/globjects/GUIGlObject.h>28#include "TrackerValueDesc.h"293031// ===========================================================================32// method definitions33// ===========================================================================34TrackerValueDesc::TrackerValueDesc(const std::string& name,35const RGBColor& col,36SUMOTime recordBegin,37double aggregationSeconds)38: myName(name), myActiveCol(col), myInactiveCol(col),39myMin(0), myMax(0),40myAggregationInterval(MAX2(1, (int)(TIME2STEPS(aggregationSeconds) / DELTA_T))),41myInvalidValue(INVALID_DOUBLE),42myValidNo(0),43myRecordingBegin(recordBegin), myTmpLastAggValue(0) {}444546TrackerValueDesc::~TrackerValueDesc() {47// just to quit cleanly on a failure48if (myLock.locked()) {49myLock.unlock();50}51}525354void55TrackerValueDesc::addValue(double value) {56if (myValues.size() == 0) {57myMin = value;58myMax = value;59} else {60myMin = value < myMin ? value : myMin;61myMax = value > myMax ? value : myMax;62}63FXMutexLock locker(myLock);64myValues.push_back(value);65if (value != myInvalidValue) {66myTmpLastAggValue += value;67myValidNo++;68}69const double avg = myValidNo == 0 ? static_cast<double>(0) : myTmpLastAggValue / static_cast<double>(myValidNo);70if (myAggregationInterval == 1 || myValues.size() % myAggregationInterval == 1) {71myAggregatedValues.push_back(avg);72} else {73myAggregatedValues.back() = avg;74}75if (myValues.size() % myAggregationInterval == 0) {76myTmpLastAggValue = 0;77myValidNo = 0;78}79}808182double83TrackerValueDesc::getRange() const {84return myMax - myMin;85}868788double89TrackerValueDesc::getMin() const {90return myMin;91}929394double95TrackerValueDesc::getMax() const {96return myMax;97}9899100double101TrackerValueDesc::getYCenter() const {102return (myMin + myMax) / 2.0f;103}104105106const RGBColor&107TrackerValueDesc::getColor() const {108return myActiveCol;109}110111112const std::vector<double>&113TrackerValueDesc::getValues() {114myLock.lock();115return myValues;116}117118119const std::vector<double>&120TrackerValueDesc::getAggregatedValues() {121myLock.lock();122return myAggregatedValues;123}124125126const std::string&127TrackerValueDesc::getName() const {128return myName;129}130131void132TrackerValueDesc::unlockValues() {133myLock.unlock();134}135136137void138TrackerValueDesc::setAggregationSpan(SUMOTime as) {139FXMutexLock locker(myLock);140if (myAggregationInterval != as / DELTA_T) {141myAggregationInterval = (int)(as / DELTA_T);142// ok, the aggregation has changed,143// let's recompute the list of aggregated values144myAggregatedValues.clear();145std::vector<double>::const_iterator i = myValues.begin();146while (i != myValues.end()) {147myTmpLastAggValue = 0;148myValidNo = 0;149for (int j = 0; j < myAggregationInterval && i != myValues.end(); j++, ++i) {150if ((*i) != myInvalidValue) {151myTmpLastAggValue += (*i);152myValidNo++;153}154}155if (myValidNo == 0) {156myAggregatedValues.push_back(0);157} else {158myAggregatedValues.push_back(myTmpLastAggValue / static_cast<double>(myValidNo));159}160}161}162}163164165SUMOTime166TrackerValueDesc::getAggregationSpan() const {167return myAggregationInterval * DELTA_T;168}169170171SUMOTime172TrackerValueDesc::getRecordingBegin() const {173return myRecordingBegin;174}175176177/****************************************************************************/178179180