SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00010 // Storage for a tracked value 00011 /****************************************************************************/ 00012 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00013 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00014 /****************************************************************************/ 00015 // 00016 // This file is part of SUMO. 00017 // SUMO is free software: you can redistribute it and/or modify 00018 // it under the terms of the GNU General Public License as published by 00019 // the Free Software Foundation, either version 3 of the License, or 00020 // (at your option) any later version. 00021 // 00022 /****************************************************************************/ 00023 // =========================================================================== 00024 // included modules 00025 // =========================================================================== 00026 #ifdef _MSC_VER 00027 #include <windows_config.h> 00028 #else 00029 #include <config.h> 00030 #endif 00031 00032 #include <string> 00033 #include <vector> 00034 #include <utils/common/RGBColor.h> 00035 #include <utils/gui/globjects/GUIGlObject.h> 00036 #include "TrackerValueDesc.h" 00037 00038 #ifdef CHECK_MEMORY_LEAKS 00039 #include <foreign/nvwa/debug_new.h> 00040 #endif // CHECK_MEMORY_LEAKS 00041 00042 00043 // =========================================================================== 00044 // method definitions 00045 // =========================================================================== 00046 TrackerValueDesc::TrackerValueDesc(const std::string& name, 00047 const RGBColor& col, 00048 SUMOTime recordBegin) 00049 : myName(name), myActiveCol(col), myInactiveCol(col), 00050 myMin(0), myMax(0), 00051 myAggregationInterval(TIME2STEPS(1) / DELTA_T), myInvalidValue(-1), myValidNo(0), 00052 myRecordingBegin(recordBegin), myTmpLastAggValue(0) {} 00053 00054 00055 TrackerValueDesc::~TrackerValueDesc() { 00056 // just to quit cleanly on a failure 00057 if (myLock.locked()) { 00058 myLock.unlock(); 00059 } 00060 } 00061 00062 00063 void 00064 TrackerValueDesc::addValue(SUMOReal value) { 00065 if (myValues.size() == 0) { 00066 myMin = value; 00067 myMax = value; 00068 } else { 00069 myMin = value < myMin ? value : myMin; 00070 myMax = value > myMax ? value : myMax; 00071 } 00072 myLock.lock(); 00073 myValues.push_back(value); 00074 if (value != myInvalidValue) { 00075 myTmpLastAggValue += value; 00076 myValidNo++; 00077 } 00078 const SUMOReal avg = myValidNo == 0 ? static_cast<SUMOReal>(0) : myTmpLastAggValue / static_cast<SUMOReal>(myValidNo); 00079 if (myAggregationInterval == 1 || myValues.size() % myAggregationInterval == 1) { 00080 myAggregatedValues.push_back(avg); 00081 } else { 00082 myAggregatedValues.back() = avg; 00083 } 00084 if (myValues.size() % myAggregationInterval == 0) { 00085 myTmpLastAggValue = 0; 00086 myValidNo = 0; 00087 } 00088 myLock.unlock(); 00089 } 00090 00091 00092 SUMOReal 00093 TrackerValueDesc::getRange() const { 00094 return myMax - myMin; 00095 } 00096 00097 00098 SUMOReal 00099 TrackerValueDesc::getMin() const { 00100 return myMin; 00101 } 00102 00103 00104 SUMOReal 00105 TrackerValueDesc::getMax() const { 00106 return myMax; 00107 } 00108 00109 00110 SUMOReal 00111 TrackerValueDesc::getYCenter() const { 00112 return (myMin + myMax) / 2.0f; 00113 } 00114 00115 00116 const RGBColor& 00117 TrackerValueDesc::getColor() const { 00118 return myActiveCol; 00119 } 00120 00121 00122 const std::vector<SUMOReal> & 00123 TrackerValueDesc::getValues() { 00124 myLock.lock(); 00125 return myValues; 00126 } 00127 00128 00129 const std::vector<SUMOReal> & 00130 TrackerValueDesc::getAggregatedValues() { 00131 myLock.lock(); 00132 return myAggregatedValues; 00133 } 00134 00135 00136 const std::string& 00137 TrackerValueDesc::getName() const { 00138 return myName; 00139 } 00140 00141 void 00142 TrackerValueDesc::unlockValues() { 00143 myLock.unlock(); 00144 } 00145 00146 00147 void 00148 TrackerValueDesc::setAggregationSpan(SUMOTime as) { 00149 myLock.lock(); 00150 if (myAggregationInterval != as / DELTA_T) { 00151 myAggregationInterval = as / DELTA_T; 00152 // ok, the aggregation has changed, 00153 // let's recompute the list of aggregated values 00154 myAggregatedValues.clear(); 00155 std::vector<SUMOReal>::const_iterator i = myValues.begin(); 00156 while (i != myValues.end()) { 00157 myTmpLastAggValue = 0; 00158 myValidNo = 0; 00159 for (int j = 0; j < myAggregationInterval && i != myValues.end(); j++, ++i) { 00160 if ((*i) != myInvalidValue) { 00161 myTmpLastAggValue += (*i); 00162 myValidNo++; 00163 } 00164 } 00165 if (myValidNo == 0) { 00166 myAggregatedValues.push_back(0); 00167 } else { 00168 myAggregatedValues.push_back(myTmpLastAggValue / static_cast<SUMOReal>(myValidNo)); 00169 } 00170 } 00171 } 00172 myLock.unlock(); 00173 } 00174 00175 00176 SUMOTime 00177 TrackerValueDesc::getAggregationSpan() const { 00178 return (SUMOTime)(myAggregationInterval) * DELTA_T; 00179 } 00180 00181 00182 SUMOTime 00183 TrackerValueDesc::getRecordingBegin() const { 00184 return myRecordingBegin; 00185 } 00186 00187 00188 00189 /****************************************************************************/ 00190