CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Histogram.h
Go to the documentation of this file.
1 #ifndef CondFormats_PhysicsToolsObjects_Histogram_h
2 #define CondFormats_PhysicsToolsObjects_Histogram_h
3 
5 
6 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
7 #include <atomic>
8 #endif
9 
10 #include <vector>
11 #include <cmath>
12 
13 namespace PhysicsTools {
14 namespace Calibration {
15 
16 template<typename Axis_t>
17 struct Range {
18  inline Range() {}
19 
20  template<typename OAxis_t>
21  inline Range(const Range<OAxis_t> &orig) :
22  min(orig.min), max(orig.max) {}
23 
24  inline Range(Axis_t min, Axis_t max) : min(min), max(max) {}
25 
26  ~Range() {}
27 
28  inline Axis_t width() const { return max - min; }
29 
30  Axis_t min, max;
31 
33 };
34 
35 template<typename Value_t, typename Axis_t = Value_t>
36 class Histogram {
37  public:
39 
40  Histogram();
41 
42  Histogram(const Histogram &orig);
43 
44  template<typename OValue_t, typename OAxis_t>
46 
47  Histogram(const std::vector<Axis_t> &binULimits);
48 
49  template<typename OAxis_t>
50  Histogram(const std::vector<OAxis_t> &binULimits);
51 
52  template<typename OAxis_t>
53  Histogram(unsigned int nBins,
55 
56  Histogram(unsigned int nBins, Axis_t min, Axis_t max);
57 
58  ~Histogram();
59 
60  Histogram &operator = (const Histogram &orig);
61 
62  template<typename OValue_t, typename OAxis_t>
64 
65  void reset();
66 
67  const std::vector<Axis_t> upperLimits() const { return binULimits; }
68 
69  Value_t binContent(int bin) const { return binValues[bin]; }
70  Value_t value(Axis_t x) const { return binContent(findBin(x)); }
71  Value_t normalizedValue(Axis_t x) const
72  { return binContent(findBin(x)) / normalization(); }
73 
74  Value_t binError(int bin) const { return std::sqrt(binContent(bin)); }
75  Value_t error(Axis_t x) const { return binError(findBin(x)); }
76  Value_t normalizedError(Axis_t x) const
77  { return std::sqrt(binContent(findBin(x))) / normalization(); }
78 
79  void setBinContent(int bin, Value_t value);
80  void fill(Axis_t x, Value_t weight = 1.0);
81 
82  bool empty() const { return binValues.empty(); }
83  bool hasEquidistantBins() const { return binULimits.empty(); }
84  int numberOfBins() const { return binValues.size() - 2; }
85 
86  inline const std::vector<Value_t> &values() const
87  { return binValues; }
88 
89  void setValues(const std::vector<Value_t> &values);
90 
91  template<typename OValue_t>
92  void setValues(const std::vector<OValue_t> &values);
93 
94  inline Range range() const { return limits; }
95  Range binRange(int bin) const;
96 
97  int findBin(Axis_t x) const;
98  Value_t normalization() const;
99 
100  Value_t integral(Axis_t hBound, Axis_t lBound = 0.0, int mode = 1) const;
101  Value_t normalizedIntegral(Axis_t hBound, Axis_t lBound = 0.0, int mode = 1) const
102  { return integral(hBound, lBound, mode) / normalization(); }
103 
104  protected:
105  std::vector<Axis_t> binULimits;
106  std::vector<Value_t> binValues;
108 
109  // transient cache variables
110  mutable Value_t total COND_TRANSIENT; //CMS-THREADING protected by totalValid
111 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
112  mutable std::atomic<bool> totalValid COND_TRANSIENT;
113 #else
114  mutable bool totalValid COND_TRANSIENT;
115 #endif
116 
118 };
119 
122 
123 } // namespace Calibration
124 } // namespace PhysicsTools
125 
126 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
127 #include "CondFormats/PhysicsToolsObjects/interface/Histogram.icc"
128 #endif
129 
130 #endif // CondFormats_PhysicsToolsObjects_Histogram_h
std::atomic< bool > totalValid
Definition: Histogram.h:112
Histogram< float > HistogramF
Definition: Histogram.h:120
Value_t normalizedIntegral(Axis_t hBound, Axis_t lBound=0.0, int mode=1) const
Definition: Histogram.h:101
PhysicsTools::Calibration::Range< Axis_t > Range
Definition: Histogram.h:38
void setBinContent(int bin, Value_t value)
Value_t binContent(int bin) const
Definition: Histogram.h:69
Value_t binError(int bin) const
Definition: Histogram.h:74
Range(Axis_t min, Axis_t max)
Definition: Histogram.h:24
void fill(Axis_t x, Value_t weight=1.0)
T sqrt(T t)
Definition: SSEVec.h:48
T min(T a, T b)
Definition: MathUtil.h:58
Value_t normalizedValue(Axis_t x) const
Definition: Histogram.h:71
const std::vector< Axis_t > upperLimits() const
Definition: Histogram.h:67
#define COND_TRANSIENT
Definition: Serializable.h:60
Histogram< double > HistogramD
Definition: Histogram.h:121
const std::vector< Value_t > & values() const
Definition: Histogram.h:86
Value_t error(Axis_t x) const
Definition: Histogram.h:75
Range(const Range< OAxis_t > &orig)
Definition: Histogram.h:21
Histogram & operator=(const Histogram &orig)
#define COND_SERIALIZABLE
Definition: Serializable.h:37
std::vector< Axis_t > binULimits
Definition: Histogram.h:105
void setValues(const std::vector< Value_t > &values)
std::vector< Value_t > binValues
Definition: Histogram.h:106
Value_t value(Axis_t x) const
Definition: Histogram.h:70
Value_t normalizedError(Axis_t x) const
Definition: Histogram.h:76
Value_t integral(Axis_t hBound, Axis_t lBound=0.0, int mode=1) const