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