Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
THn.h
Go to the documentation of this file.
1// @(#)root/hist:$Id$
2// Author: Axel Naumann, Nov 2011
3
4/*************************************************************************
5 * Copyright (C) 1995-2012, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_THN
13#define ROOT_THN
14
15#include "THnBase.h"
16
17#include "TNDArray.h"
18
19#include "TArrayD.h"
20
21#include "TAxis.h"
22
23class TH1;
24class TH1D;
25class TH2D;
26class TH3D;
27class THnSparse;
28class TF1;
29
30class THn: public THnBase {
31
32protected:
33 void AllocCoordBuf() const;
34 void InitStorage(Int_t* nbins, Int_t chunkSize) override;
35
36 THn() = default;
37 THn(const char* name, const char* title, Int_t dim, const Int_t* nbins,
38 const Double_t* xmin, const Double_t* xmax);
39
40 THn(const char *name, const char *title, Int_t dim, const Int_t *nbins,
41 const std::vector<std::vector<double>> &xbins);
42
43public:
44 ~THn() override;
45
46 static THn* CreateHn(const char* name, const char* title, const TH1* h1) {
47 return (THn*) CreateHnAny(name, title, h1, kFALSE /*THn*/, -1);
48 }
49 static THn* CreateHn(const char* name, const char* title, const THnBase* hn) {
50 return (THn*) CreateHnAny(name, title, hn, kFALSE /*THn*/, -1);
51 }
52
53 ROOT::Internal::THnBaseBinIter* CreateIter(Bool_t respectAxisRange) const override;
54 Long64_t GetNbins() const override { return GetArray().GetNbins(); }
55
56 Long64_t GetBin(const Int_t* idx) const override {
57 return GetArray().GetBin(idx);
58 }
59 Long64_t GetBin(const Double_t* x) const override {
60 if (fCoordBuf.empty())
62 for (Int_t d = 0; d < fNdimensions; ++d) {
64 }
65 return GetArray().GetBin(fCoordBuf.data());
66 }
67 Long64_t GetBin(const char* name[]) const override {
68 if (fCoordBuf.empty())
70 for (Int_t d = 0; d < fNdimensions; ++d) {
72 }
73 return GetArray().GetBin(fCoordBuf.data());
74 }
75
76 Long64_t GetBin(const Int_t* idx, Bool_t /*allocate*/ = kTRUE) override {
77 return const_cast<const THn*>(this)->GetBin(idx);
78 }
79 Long64_t GetBin(const Double_t* x, Bool_t /*allocate*/ = kTRUE) override {
80 return const_cast<const THn*>(this)->GetBin(x);
81 }
82 Long64_t GetBin(const char* name[], Bool_t /*allocate*/ = kTRUE) override {
83 return const_cast<const THn*>(this)->GetBin(name);
84 }
85
86 /// Increment the bin content of "bin" by "w", return the bin index.
87 void FillBin(Long64_t bin, Double_t w) override {
88 GetArray().AddAt(bin, w);
89 if (GetCalculateErrors()) {
90 fSumw2.AddAt(bin, w * w);
91 }
93 }
94
95 /// Forwards to THnBase::SetBinContent().
96 /// Non-virtual, CINT-compatible replacement of a using declaration.
97 void SetBinContent(const Int_t* idx, Double_t v) {
99 }
100 void SetBinContent(Long64_t bin, Double_t v) override {
101 GetArray().SetAsDouble(bin, v);
102 }
103 void SetBinError2(Long64_t bin, Double_t e2) override {
104 if (!GetCalculateErrors()) Sumw2();
105 fSumw2.At(bin) = e2;
106 }
107 /// Forwards to THnBase::SetBinContent().
108 /// Non-virtual, CINT-compatible replacement of a using declaration.
109 void AddBinContent(const Int_t* idx, Double_t v = 1.) {
111 }
112 void AddBinContent(Long64_t bin, Double_t v = 1.) override {
113 GetArray().AddAt(bin, v);
114 }
115 void AddBinError2(Long64_t bin, Double_t e2) override {
116 fSumw2.At(bin) += e2;
117 }
118 /// Forwards to THnBase::GetBinContent() overload.
119 /// Non-virtual, CINT-compatible replacement of a using declaration.
120 Double_t GetBinContent(const Int_t *idx) const {
121 return THnBase::GetBinContent(idx);
122 }
123 /// Get the content of bin, and set its index if idx is != 0.
124 Double_t GetBinContent(Long64_t bin, Int_t* idx = nullptr) const override {
125 if (idx) {
126 const TNDArray& arr = GetArray();
127 Long64_t prevCellSize = arr.GetNbins();
128 for (Int_t i = 0; i < GetNdimensions(); ++i) {
129 Long64_t cellSize = arr.GetCellSize(i);
130 idx[i] = (bin % prevCellSize) / cellSize;
131 prevCellSize = cellSize;
132 }
133 }
134 return GetArray().AtAsDouble(bin);
135 }
136 Double_t GetBinError2(Long64_t linidx) const override {
137 return GetCalculateErrors() ? fSumw2.At(linidx) : GetBinContent(linidx);
138 }
139
140 virtual const TNDArray& GetArray() const = 0;
141 virtual TNDArray& GetArray() = 0;
142
143 void Sumw2() override;
144
145 /// Forwards to THnBase::Projection().
146 /// Non-virtual, as a CINT-compatible replacement of a using declaration.
147 TH1D* Projection(Int_t xDim, Option_t* option = "") const {
148 return THnBase::Projection(xDim, option);
149 }
150
151 /// Forwards to THnBase::Projection().
152 /// Non-virtual, as a CINT-compatible replacement of a using declaration.
154 Option_t* option = "") const {
155 return THnBase::Projection(yDim, xDim, option);
156 }
157
158 /// Forwards to THnBase::Projection().
159 /// Non-virtual, as a CINT-compatible replacement of a using declaration.
160 TH3D* Projection(Int_t xDim, Int_t yDim, Int_t zDim,
161 Option_t* option = "") const {
162 return THnBase::Projection(xDim, yDim, zDim, option);
163 }
164
165 THn* Projection(Int_t ndim, const Int_t* dim,
166 Option_t* option = "") const {
167 return (THn*) ProjectionND(ndim, dim, option);
168 }
169
171 return (THn*) RebinBase(group);
172 }
173 THn* Rebin(const Int_t* group) const {
174 return (THn*) RebinBase(group);
175 }
176
177 void Reset(Option_t* option = "") override;
178
179protected:
180 TNDArrayT<Double_t> fSumw2; // bin error, lazy allocation happens in TNDArrayT
181 mutable std::vector<Int_t> fCoordBuf; //! Temporary buffer
182
183 ClassDefOverride(THn, 1); //Base class for multi-dimensional histogram
184};
185
186
187//______________________________________________________________________________
188/** \class THnT
189 Templated implementation of the abstract base THn.
190 All functionality and the interfaces to be used are in THn!
191
192 THn does not know how to store any bin content itself. Instead, this
193 is delegated to the derived, templated class: the template parameter decides
194 what the format for the bin content is. The actual storage is delegated to
195 TNDArrayT<T>.
196
197 Typedefs exist for template parameters with ROOT's generic types:
198
199 Templated name | Typedef | Bin content type
200 -----------------|---------------|--------------------
201 THnT<Char_t> | THnC | Char_t
202 THnT<Short_t> | THnS | Short_t
203 THnT<Int_t> | THnI | Int_t
204 THnT<Long64_t> | THnL | Long64_t
205 THnT<Float_t> | THnF | Float_t
206 THnT<Double_t> | THnD | Double_t
207
208 We recommend to use THnC wherever possible, and to map its value space
209 of 256 possible values to e.g. float values outside the class. This saves an
210 enormous amount of memory. Only if more than 256 values need to be
211 distinguished should e.g. THnS or even THnF be chosen.
212
213 Implementation detail: the derived, templated class is kept extremely small
214 on purpose. That way the (templated thus inlined) uses of this class will
215 only create a small amount of machine code, in contrast to e.g. STL.
216*/
217
218template <typename T>
219class THnT: public THn {
220public:
221 THnT() {}
222
223 THnT(const char* name, const char* title,
224 Int_t dim, const Int_t* nbins,
225 const Double_t* xmin, const Double_t* xmax):
226 THn(name, title, dim, nbins, xmin, xmax),
227 fArray(dim, nbins, true) {}
228
229 THnT(const char *name, const char *title, Int_t dim, const Int_t *nbins,
230 const std::vector<std::vector<double>> &xbins)
231 : THn(name, title, dim, nbins, xbins), fArray(dim, nbins, true)
232 {
233 }
234
235 const TNDArray& GetArray() const override { return fArray; }
236 TNDArray& GetArray() override { return fArray; }
237
238protected:
239 TNDArrayT<T> fArray; ///< Bin content
240 ClassDefOverride(THnT, 1); ///< Multi-dimensional histogram with templated storage
241};
242
250
251#endif // ROOT_THN
#define d(i)
Definition RSha256.hxx:102
bool Bool_t
Definition RtypesCore.h:63
constexpr Bool_t kFALSE
Definition RtypesCore.h:101
long long Long64_t
Definition RtypesCore.h:80
constexpr Bool_t kTRUE
Definition RtypesCore.h:100
const char Option_t
Definition RtypesCore.h:66
#define ClassDefOverride(name, id)
Definition Rtypes.h:341
Option_t Option_t option
char name[80]
Definition TGX11.cxx:110
float xmin
float xmax
THnT< Int_t > THnI
Definition THn.h:247
THnT< Long64_t > THnL
Definition THn.h:248
THnT< Float_t > THnF
Definition THn.h:243
THnT< Short_t > THnS
Definition THn.h:246
THnT< Double_t > THnD
Definition THn.h:244
THnT< Long64_t > THnL64
Definition THn.h:249
THnT< Char_t > THnC
Definition THn.h:245
Iterator over THnBase bins (internal implementation).
Definition THnBase.h:312
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
Definition TAxis.cxx:293
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
Definition TAxis.cxx:419
1-Dim function class
Definition TF1.h:233
1-D histogram with a double per channel (see TH1 documentation)
Definition TH1.h:669
TH1 is the base class of all histogram classes in ROOT.
Definition TH1.h:59
2-D histogram with a double per channel (see TH1 documentation)
Definition TH2.h:357
3-D histogram with a double per channel (see TH1 documentation)
Definition TH3.h:363
Multidimensional histogram base.
Definition THnBase.h:43
void AddBinContent(const Int_t *x, Double_t v=1.)
Definition THnBase.h:191
TH1D * Projection(Int_t xDim, Option_t *option="") const
Project all bins into a 1-dimensional histogram, keeping only axis "xDim".
Definition THnBase.h:224
Int_t GetNdimensions() const
Definition THnBase.h:140
static THnBase * CreateHnAny(const char *name, const char *title, const TH1 *h1, Bool_t sparse, Int_t chunkSize=1024 *16)
Create a THn / THnSparse object from a histogram deriving from TH1.
Definition THnBase.cxx:323
THnBase * RebinBase(Int_t group) const
Combine the content of "group" neighboring bins into a new bin and return the resulting THnBase.
Definition THnBase.cxx:1209
THnBase * ProjectionND(Int_t ndim, const Int_t *dim, Option_t *option="") const
Definition THnBase.h:255
Bool_t GetCalculateErrors() const
Definition THnBase.h:141
Double_t GetBinContent(const Int_t *idx) const
Definition THnBase.h:195
void SetBinContent(const Int_t *idx, Double_t v)
Definition THnBase.h:205
TAxis * GetAxis(Int_t dim) const
Definition THnBase.h:130
Int_t fNdimensions
Number of dimensions.
Definition THnBase.h:45
void FillBinBase(Double_t w)
Increment the statistics due to filled weight "w",.
Definition THnBase.h:89
Efficient multidimensional histogram.
Definition THnSparse.h:37
Templated implementation of the abstract base THn.
Definition THn.h:219
const TNDArray & GetArray() const override
Definition THn.h:235
TNDArrayT< T > fArray
Bin content.
Definition THn.h:239
THnT()
Definition THn.h:221
THnT(const char *name, const char *title, Int_t dim, const Int_t *nbins, const Double_t *xmin, const Double_t *xmax)
Definition THn.h:223
THnT(const char *name, const char *title, Int_t dim, const Int_t *nbins, const std::vector< std::vector< double > > &xbins)
Definition THn.h:229
TNDArray & GetArray() override
Definition THn.h:236
Multidimensional histogram.
Definition THn.h:30
void AllocCoordBuf() const
Create the coordinate buffer.
Definition THn.cxx:232
void FillBin(Long64_t bin, Double_t w) override
Increment the bin content of "bin" by "w", return the bin index.
Definition THn.h:87
TH1D * Projection(Int_t xDim, Option_t *option="") const
Forwards to THnBase::Projection().
Definition THn.h:147
void AddBinContent(const Int_t *idx, Double_t v=1.)
Forwards to THnBase::SetBinContent().
Definition THn.h:109
void InitStorage(Int_t *nbins, Int_t chunkSize) override
Initialize the storage of a histogram created via Init()
Definition THn.cxx:240
Long64_t GetBin(const char *name[], Bool_t=kTRUE) override
Definition THn.h:82
static THn * CreateHn(const char *name, const char *title, const TH1 *h1)
Definition THn.h:46
THn * Rebin(Int_t group) const
Definition THn.h:170
Double_t GetBinContent(const Int_t *idx) const
Forwards to THnBase::GetBinContent() overload.
Definition THn.h:120
Long64_t GetBin(const Int_t *idx, Bool_t=kTRUE) override
Definition THn.h:76
Long64_t GetBin(const Double_t *x, Bool_t=kTRUE) override
Definition THn.h:79
~THn() override
Destruct a THn.
Definition THn.cxx:199
TH2D * Projection(Int_t yDim, Int_t xDim, Option_t *option="") const
Forwards to THnBase::Projection().
Definition THn.h:153
void AddBinError2(Long64_t bin, Double_t e2) override
Definition THn.h:115
THn * Rebin(const Int_t *group) const
Definition THn.h:173
static THn * CreateHn(const char *name, const char *title, const THnBase *hn)
Definition THn.h:49
std::vector< Int_t > fCoordBuf
Definition THn.h:181
TNDArrayT< Double_t > fSumw2
Definition THn.h:180
void SetBinContent(const Int_t *idx, Double_t v)
Forwards to THnBase::SetBinContent().
Definition THn.h:97
void SetBinError2(Long64_t bin, Double_t e2) override
Definition THn.h:103
Double_t GetBinContent(Long64_t bin, Int_t *idx=nullptr) const override
Get the content of bin, and set its index if idx is != 0.
Definition THn.h:124
Double_t GetBinError2(Long64_t linidx) const override
Definition THn.h:136
ROOT::Internal::THnBaseBinIter * CreateIter(Bool_t respectAxisRange) const override
Create an iterator over all bins. Public interface is THnIter.
Definition THn.cxx:207
void Reset(Option_t *option="") override
Reset the contents of a THn.
Definition THn.cxx:250
Long64_t GetBin(const Int_t *idx) const override
Definition THn.h:56
Long64_t GetBin(const char *name[]) const override
Definition THn.h:67
void Sumw2() override
Enable calculation of errors.
Definition THn.cxx:216
THn()=default
Long64_t GetBin(const Double_t *x) const override
Definition THn.h:59
void AddBinContent(Long64_t bin, Double_t v=1.) override
Definition THn.h:112
Long64_t GetNbins() const override
Definition THn.h:54
TH3D * Projection(Int_t xDim, Int_t yDim, Int_t zDim, Option_t *option="") const
Forwards to THnBase::Projection().
Definition THn.h:160
void SetBinContent(Long64_t bin, Double_t v) override
Definition THn.h:100
virtual TNDArray & GetArray()=0
virtual const TNDArray & GetArray() const =0
THn * Projection(Int_t ndim, const Int_t *dim, Option_t *option="") const
Definition THn.h:165
N-Dim array class.
Definition TNDArray.h:46
virtual void AddAt(ULong64_t linidx, Double_t value)=0
virtual Double_t AtAsDouble(ULong64_t linidx) const =0
Long64_t GetNbins() const
Definition TNDArray.h:69
Long64_t GetCellSize(Int_t dim) const
Definition TNDArray.h:70
Long64_t GetBin(const Int_t *idx) const
Definition TNDArray.h:72
virtual void SetAsDouble(ULong64_t linidx, Double_t value)=0
Double_t x[n]
Definition legend1.C:17
TH1F * h1
Definition legend1.C:5