00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef LWH_VariAxis_H
00010 #define LWH_VariAxis_H
00011
00012
00013
00014
00015
00016 #include <limits>
00017 #include <cmath>
00018 #include <algorithm>
00019 #include <map>
00020 #include "AIAxis.h"
00021
00022 namespace LWH {
00023
00024 using namespace AIDA;
00025
00031 class VariAxis: public IAxis {
00032
00033 public:
00034
00038 VariAxis(const std::vector<double> & edges) {
00039 for ( int i = 0, N = edges.size(); i < N; ++i ) binco[edges[i]] = 0;
00040 std::map<double,int>::iterator it = binco.begin();
00041 for ( int i = 0, N = edges.size(); i < N; ++i ) (it++)->second = i;
00042 }
00043
00047 VariAxis(const VariAxis & a)
00048 : IAxis(a), binco(a.binco) {}
00049
00051 virtual ~VariAxis() { }
00052
00059 bool isFixedBinning() const {return false; }
00060
00066 double lowerEdge() const {
00067 if ( binco.size() ) return binco.begin()->first;
00068 return 0;
00069 }
00070
00076 double upperEdge() const {
00077 if ( !binco.size() ) return 0;
00078 std::map<double,int>::const_iterator last = binco.end();
00079 return (--last)->first;
00080 }
00081
00087 int bins() const { return binco.size() - 1; }
00088
00097 std::pair<double,double> binEdges(int index) const {
00098 std::pair<double,double> edges(0.0, 0.0);
00099 if ( !binco.size() ) return edges;
00100 std::map<double,int>::const_iterator lo = binco.end();
00101 std::map<double,int>::const_iterator up = binco.begin();
00102 if ( index >= 0 ) while ( index-- >= 0 && up != binco.end() ) lo = up++;
00103 edges.first = ( lo == binco.end() )? -std::numeric_limits<double>::max():
00104 lo->first;
00105 edges.second = ( up == binco.end() )? std::numeric_limits<double>::max():
00106 up->first;
00107 return edges;
00108 }
00109
00118 double binLowerEdge(int index) const {
00119 return binEdges(index).first;
00120 }
00121
00130 double binUpperEdge(int index) const {
00131 return binEdges(index).second;
00132 }
00133
00141 double binWidth(int index) const {
00142 std::pair<double,double> edges = binEdges(index);
00143 return edges.second - edges.first;
00144 }
00145
00155 int coordToIndex(double coord) const {
00156 std::map<double,int>::const_iterator up = binco.upper_bound(coord);
00157 if ( up == binco.begin() ) return UNDERFLOW_BIN;
00158 else if ( up == binco.end() ) return OVERFLOW_BIN;
00159 else return up->second - 1;
00160 }
00161
00166 double binMidPoint(int index) const {
00167 std::pair<double,double> edges = binEdges(index);
00168 return (edges.second + edges.first)/2.0;
00169 }
00170
00171 private:
00172
00177 std::map<double,int> binco;
00178
00179 };
00180
00181 }
00182
00183 #endif