00001 #ifndef CondFormats_PhysicsToolsObjects_Histogram2D_h
00002 #define CondFormats_PhysicsToolsObjects_Histogram2D_h
00003
00004 #include <utility>
00005 #include <vector>
00006 #include <cmath>
00007
00008 #include "CondFormats/PhysicsToolsObjects/interface/Histogram.h"
00009
00010 namespace PhysicsTools {
00011 namespace Calibration {
00012
00013 template<typename Value_t, typename AxisX_t = Value_t,
00014 typename AxisY_t = AxisX_t>
00015 class Histogram2D {
00016 public:
00017 typedef Range<AxisX_t> RangeX;
00018 typedef Range<AxisY_t> RangeY;
00019
00020 Histogram2D();
00021
00022 Histogram2D(const Histogram2D &orig);
00023
00024 template<typename OValue_t, typename OAxisX_t, typename OAxisY_t>
00025 Histogram2D(const Histogram2D<OValue_t, OAxisX_t, OAxisY_t> &orig);
00026
00027 Histogram2D(const std::vector<AxisX_t> &binULimitsX,
00028 const std::vector<AxisY_t> &binULimitsY);
00029
00030 template<typename OAxisX_t, typename OAxisY_t>
00031 Histogram2D(const std::vector<OAxisX_t> &binULimitsX,
00032 const std::vector<OAxisY_t> &binULimitsY);
00033
00034 template<typename OAxisX_t, typename OAxisY_t>
00035 Histogram2D(const std::vector<OAxisX_t> &binULimitsX,
00036 unsigned int nBinsY,
00037 const PhysicsTools::Calibration::Range<OAxisY_t> &rangeY);
00038
00039 template<typename OAxisX_t, typename OAxisY_t>
00040 Histogram2D(unsigned int nBinsX,
00041 const PhysicsTools::Calibration::Range<OAxisX_t> &rangeX,
00042 const std::vector<OAxisY_t> &binULimitsY);
00043
00044 template<typename OAxisX_t, typename OAxisY_t>
00045 Histogram2D(unsigned int nBinsX,
00046 const PhysicsTools::Calibration::Range<OAxisX_t> &rangeX,
00047 unsigned int nBinsY,
00048 const PhysicsTools::Calibration::Range<OAxisY_t> &rangeY);
00049
00050 Histogram2D(unsigned int nBinsX, AxisX_t minX, AxisX_t maxX,
00051 unsigned int nBinsY, AxisY_t minY, AxisY_t maxY);
00052
00053 ~Histogram2D();
00054
00055 Histogram2D &operator = (const Histogram2D &orig);
00056
00057 template<typename OValue_t, typename OAxisX_t, typename OAxisY_t>
00058 Histogram2D &operator = (const Histogram2D<OValue_t,
00059 OAxisX_t, OAxisY_t> &orig);
00060
00061 void reset();
00062
00063 const std::vector<AxisX_t> upperLimitsX() const { return binULimitsX; }
00064 const std::vector<AxisY_t> upperLimitsY() const { return binULimitsY; }
00065
00066 inline int bin2D(int binX, int binY) const
00067 { return binY * stride + binX; }
00068
00069 Value_t binContent(int bin) const { return binValues[bin]; }
00070 Value_t binContent(int binX, int binY) const
00071 { return binValues[bin2D(binX, binY)]; }
00072 Value_t value(AxisX_t x, AxisY_t y) const
00073 { return binContent(findBin(x, y)); }
00074 Value_t normalizedValue(AxisX_t x, AxisY_t y) const
00075 { return binContent(findBin(x, y)) / normalization(); }
00076 Value_t normalizedXValue(AxisX_t x, AxisY_t y) const;
00077 Value_t normalizedYValue(AxisX_t x, AxisY_t y) const;
00078
00079 Value_t binError(int bin) const { return std::sqrt(binContent(bin)); }
00080 Value_t binError(int binX, int binY) const
00081 { return binError(bin2D(binX, binY)); }
00082 Value_t error(AxisX_t x, AxisY_t y) const
00083 { return binError(findBin(x, y)); }
00084 Value_t normalizedError(AxisX_t x, AxisY_t y) const
00085 { return std::sqrt(binContent(findBin(x, y))) / normalization(); }
00086 Value_t normalizedXError(AxisX_t x, AxisY_t y) const;
00087 Value_t normalizedYError(AxisX_t x, AxisY_t y) const;
00088
00089 void setBinContent(int bin, Value_t value);
00090 void setBinContent(int binX, int binY, Value_t value)
00091 { setBinContent(bin2D(binX, binY), value); }
00092 void fill(AxisX_t x, AxisY_t y, Value_t weight = 1.0);
00093
00094 bool empty() const { return binValues.empty(); }
00095 bool hasEquidistantBinsX() const { return binULimitsX.empty(); }
00096 bool hasEquidistantBinsY() const { return binULimitsY.empty(); }
00097 int numberOfBinsX() const { return stride - 2; }
00098 int numberOfBinsY() const { return binValues.size() / stride - 2; }
00099 int numberOfBins() const
00100 { return numberOfBinsX() * numberOfBinsY(); }
00101
00102 inline const std::vector<Value_t> &values() const
00103 { return binValues; }
00104
00105 void setValues(const std::vector<Value_t> &values);
00106
00107 template<typename OValue_t>
00108 void setValues(const std::vector<OValue_t> &values);
00109
00110 inline RangeX rangeX() const { return limitsX; }
00111 inline RangeY rangeY() const { return limitsY; }
00112 RangeX binRangeX(int binX) const;
00113 RangeY binRangeY(int binY) const;
00114 std::pair<RangeX, RangeY> binRange(int bin) const;
00115 std::pair<RangeX, RangeY> binRange(int binX, int binY) const
00116 { return binRange(bin2D(binX, binY)); }
00117
00118 int findBinX(AxisX_t x) const;
00119 int findBinY(AxisY_t y) const;
00120 int findBin(AxisX_t x, AxisY_t y) const
00121 { return bin2D(findBinX(x), findBinY(y)); }
00122 Value_t normalization() const;
00123 Value_t normalizationX(int binY) const;
00124 Value_t normalizationY(int binX) const;
00125
00126 protected:
00127 unsigned int stride;
00128 std::vector<AxisX_t> binULimitsX;
00129 std::vector<AxisY_t> binULimitsY;
00130 std::vector<Value_t> binValues;
00131 RangeX limitsX;
00132 RangeY limitsY;
00133
00134
00135 mutable Value_t total;
00136 mutable bool totalValid;
00137 mutable std::vector<Value_t> rowTotal;
00138 mutable std::vector<Value_t> columnTotal;
00139 };
00140
00141 typedef Histogram2D<float> HistogramF2D;
00142 typedef Histogram2D<double> HistogramD2D;
00143
00144
00145
00146 struct VHistogramD2D {
00147 std::vector<PhysicsTools::Calibration::HistogramD2D> vHist;
00148 std::vector<double> vValues;
00149 };
00150
00151 }
00152 }
00153
00154 #include "CondFormats/PhysicsToolsObjects/interface/Histogram2D.icc"
00155
00156 #endif // CondFormats_PhysicsToolsObjects_Histogram2D_h