Logo ROOT  
Reference Guide
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 {
31private:
32 THn(const THn&); // Not implemented
33 THn& operator=(const THn&); // Not implemented
34
35protected:
36 void AllocCoordBuf() const;
37 void InitStorage(Int_t* nbins, Int_t chunkSize);
38
39 THn(): fCoordBuf() {}
40 THn(const char* name, const char* title, Int_t dim, const Int_t* nbins,
41 const Double_t* xmin, const Double_t* xmax);
42
43public:
44 virtual ~THn();
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;
54 Long64_t GetNbins() const { return GetArray().GetNbins(); }
55
56 Long64_t GetBin(const Int_t* idx) const {
57 return GetArray().GetBin(idx);
58 }
59 Long64_t GetBin(const Double_t* x) const {
61 for (Int_t d = 0; d < fNdimensions; ++d) {
63 }
64 return GetArray().GetBin(fCoordBuf);
65 }
66 Long64_t GetBin(const char* name[]) const {
68 for (Int_t d = 0; d < fNdimensions; ++d) {
70 }
71 return GetArray().GetBin(fCoordBuf);
72 }
73
74 Long64_t GetBin(const Int_t* idx, Bool_t /*allocate*/ = kTRUE) {
75 return const_cast<const THn*>(this)->GetBin(idx);
76 }
77 Long64_t GetBin(const Double_t* x, Bool_t /*allocate*/ = kTRUE) {
78 return const_cast<const THn*>(this)->GetBin(x);
79 }
80 Long64_t GetBin(const char* name[], Bool_t /*allocate*/ = kTRUE) {
81 return const_cast<const THn*>(this)->GetBin(name);
82 }
83
84 void FillBin(Long64_t bin, Double_t w) {
85 // Increment the bin content of "bin" by "w",
86 // return the bin index.
87 GetArray().AddAt(bin, w);
88 if (GetCalculateErrors()) {
89 fSumw2.AddAt(bin, w * w);
90 }
91 FillBinBase(w);
92 }
93
94 void SetBinContent(const Int_t* idx, Double_t v) {
95 // Forwards to THnBase::SetBinContent().
96 // Non-virtual, CINT-compatible replacement of a using declaration.
98 }
100 GetArray().SetAsDouble(bin, v);
101 }
103 if (!GetCalculateErrors()) Sumw2();
104 fSumw2.At(bin) = e2;
105 }
106 void AddBinContent(const Int_t* idx, Double_t v = 1.) {
107 // Forwards to THnBase::SetBinContent().
108 // Non-virtual, CINT-compatible replacement of a using declaration.
110 }
112 GetArray().AddAt(bin, v);
113 }
115 fSumw2.At(bin) += e2;
116 }
117 Double_t GetBinContent(const Int_t *idx) const {
118 // Forwards to THnBase::GetBinContent() overload.
119 // Non-virtual, CINT-compatible replacement of a using declaration.
120 return THnBase::GetBinContent(idx);
121 }
122 Double_t GetBinContent(Long64_t bin, Int_t* idx = 0) const {
123 // Get the content of bin, and set its index if idx is != 0.
124 if (idx) {
125 const TNDArray& arr = GetArray();
126 Long64_t prevCellSize = arr.GetNbins();
127 for (Int_t i = 0; i < GetNdimensions(); ++i) {
128 Long64_t cellSize = arr.GetCellSize(i);
129 idx[i] = (bin % prevCellSize) / cellSize;
130 prevCellSize = cellSize;
131 }
132 }
133 return GetArray().AtAsDouble(bin);
134 }
136 return GetCalculateErrors() ? fSumw2.At(linidx) : GetBinContent(linidx);
137 }
138
139 virtual const TNDArray& GetArray() const = 0;
140 virtual TNDArray& GetArray() = 0;
141
142 void Sumw2();
143
144 TH1D* Projection(Int_t xDim, Option_t* option = "") const {
145 // Forwards to THnBase::Projection().
146 // Non-virtual, as a CINT-compatible replacement of a using
147 // declaration.
148 return THnBase::Projection(xDim, option);
149 }
150
152 Option_t* option = "") const {
153 // Forwards to THnBase::Projection().
154 // Non-virtual, as a CINT-compatible replacement of a using
155 // declaration.
156 return THnBase::Projection(yDim, xDim, option);
157 }
158
159 TH3D* Projection(Int_t xDim, Int_t yDim, Int_t zDim,
160 Option_t* option = "") const {
161 // Forwards to THnBase::Projection().
162 // Non-virtual, as a CINT-compatible replacement of a using
163 // declaration.
164 return THnBase::Projection(xDim, yDim, zDim, option);
165 }
166
167 THn* Projection(Int_t ndim, const Int_t* dim,
168 Option_t* option = "") const {
169 return (THn*) ProjectionND(ndim, dim, option);
170 }
171
173 return (THn*) RebinBase(group);
174 }
175 THn* Rebin(const Int_t* group) const {
176 return (THn*) RebinBase(group);
177 }
178
179 void Reset(Option_t* option = "");
180
181protected:
182 TNDArrayT<Double_t> fSumw2; // bin error, lazy allocation happens in TNDArrayT
183 mutable Int_t* fCoordBuf; //! Temporary buffer
184
185 ClassDef(THn, 1); //Base class for multi-dimensional histogram
186};
187
188
189
190//______________________________________________________________________________
191/** \class THnT
192 Templated implementation of the abstract base THn.
193 All functionality and the interfaces to be used are in THn!
194
195 THn does not know how to store any bin content itself. Instead, this
196 is delegated to the derived, templated class: the template parameter decides
197 what the format for the bin content is. The actual storage is delegated to
198 TNDArrayT<T>.
199
200 Typedefs exist for template parematers with ROOT's generic types:
201
202 Templated name | Typedef | Bin content type
203 -----------------|---------------|--------------------
204 THnT<Char_t> | THnC | Char_t
205 THnT<Short_t> | THnS | Short_t
206 THnT<Int_t> | THnI | Int_t
207 THnT<Long_t> | THnL | Long_t
208 THnT<Float_t> | THnF | Float_t
209 THnT<Double_t> | THnD | Double_t
210
211 We recommend to use THnC wherever possible, and to map its value space
212 of 256 possible values to e.g. float values outside the class. This saves an
213 enourmous amount of memory. Only if more than 256 values need to be
214 distinguished should e.g. THnS or even THnF be chosen.
215
216 Implementation detail: the derived, templated class is kept extremely small
217 on purpose. That way the (templated thus inlined) uses of this class will
218 only create a small amount of machine code, in contrast to e.g. STL.
219*/
220
221template <typename T>
222class THnT: public THn {
223public:
224 THnT() {}
225
226 THnT(const char* name, const char* title,
227 Int_t dim, const Int_t* nbins,
228 const Double_t* xmin, const Double_t* xmax):
229 THn(name, title, dim, nbins, xmin, xmax),
230 fArray(dim, nbins, true) {}
231
232 const TNDArray& GetArray() const { return fArray; }
233 TNDArray& GetArray() { return fArray; }
234
235protected:
236 TNDArrayT<T> fArray; // bin content
237 ClassDef(THnT, 1); // multi-dimensional histogram with templated storage
238};
239
247
248#endif // ROOT_THN
#define d(i)
Definition: RSha256.hxx:102
int Int_t
Definition: RtypesCore.h:43
const Bool_t kFALSE
Definition: RtypesCore.h:90
bool Bool_t
Definition: RtypesCore.h:61
double Double_t
Definition: RtypesCore.h:57
long long Long64_t
Definition: RtypesCore.h:71
const Bool_t kTRUE
Definition: RtypesCore.h:89
const char Option_t
Definition: RtypesCore.h:64
#define ClassDef(name, id)
Definition: Rtypes.h:322
char name[80]
Definition: TGX11.cxx:109
float xmin
Definition: THbookFile.cxx:93
float xmax
Definition: THbookFile.cxx:93
THnT< Int_t > THnI
Definition: THn.h:244
THnT< Long_t > THnL
Definition: THn.h:245
THnT< Float_t > THnF
Definition: THn.h:240
THnT< Short_t > THnS
Definition: THn.h:243
THnT< Double_t > THnD
Definition: THn.h:241
THnT< Long64_t > THnL64
Definition: THn.h:246
THnT< Char_t > THnC
Definition: THn.h:242
Iterator over THnBase bins (internal implementation).
Definition: THnBase.h:285
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
Definition: TAxis.cxx:290
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
Definition: TAxis.cxx:416
1-Dim function class
Definition: TF1.h:210
1-D histogram with a double per channel (see TH1 documentation)}
Definition: TH1.h:614
The TH1 histogram class.
Definition: TH1.h:56
2-D histogram with a double per channel (see TH1 documentation)}
Definition: TH2.h:292
3-D histogram with a double per channel (see TH1 documentation)}
Definition: TH3.h:304
Multidimensional histogram base.
Definition: THnBase.h:43
void AddBinContent(const Int_t *x, Double_t v=1.)
Definition: THnBase.h:164
TH1D * Projection(Int_t xDim, Option_t *option="") const
Project all bins into a 1-dimensional histogram, keeping only axis "xDim".
Definition: THnBase.h:197
Int_t GetNdimensions() const
Definition: THnBase.h:135
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:197
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:1057
THnBase * ProjectionND(Int_t ndim, const Int_t *dim, Option_t *option="") const
Definition: THnBase.h:228
Bool_t GetCalculateErrors() const
Definition: THnBase.h:136
Double_t GetBinContent(const Int_t *idx) const
Definition: THnBase.h:168
void SetBinContent(const Int_t *idx, Double_t v)
Definition: THnBase.h:178
TAxis * GetAxis(Int_t dim) const
Definition: THnBase.h:125
Int_t fNdimensions
Definition: THnBase.h:45
void FillBinBase(Double_t w)
Increment the statistics due to filled weight "w",.
Definition: THnBase.h:84
Efficient multidimensional histogram.
Definition: THnSparse.h:36
Templated implementation of the abstract base THn.
Definition: THn.h:222
const TNDArray & GetArray() const
Definition: THn.h:232
TNDArrayT< T > fArray
Definition: THn.h:236
THnT()
Definition: THn.h:224
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:226
TNDArray & GetArray()
Definition: THn.h:233
Multidimensional histogram.
Definition: THn.h:30
THn()
Definition: THn.h:39
void AllocCoordBuf() const
Create the coordinate buffer.
Definition: THn.cxx:227
void FillBin(Long64_t bin, Double_t w)
Definition: THn.h:84
Double_t GetBinError2(Long64_t linidx) const
Definition: THn.h:135
TH1D * Projection(Int_t xDim, Option_t *option="") const
Definition: THn.h:144
THn(const THn &)
void AddBinContent(const Int_t *idx, Double_t v=1.)
Definition: THn.h:106
void InitStorage(Int_t *nbins, Int_t chunkSize)
Initialize the storage of a histogram created via Init()
Definition: THn.cxx:235
static THn * CreateHn(const char *name, const char *title, const TH1 *h1)
Definition: THn.h:46
void AddBinContent(Long64_t bin, Double_t v=1.)
Definition: THn.h:111
THn * Rebin(Int_t group) const
Definition: THn.h:172
Double_t GetBinContent(const Int_t *idx) const
Definition: THn.h:117
Long64_t GetBin(const Int_t *idx) const
Definition: THn.h:56
Long64_t GetBin(const char *name[], Bool_t=kTRUE)
Definition: THn.h:80
void SetBinContent(Long64_t bin, Double_t v)
Definition: THn.h:99
Long64_t GetBin(const char *name[]) const
Definition: THn.h:66
Int_t * fCoordBuf
Definition: THn.h:183
TH2D * Projection(Int_t yDim, Int_t xDim, Option_t *option="") const
Definition: THn.h:151
THn * Rebin(const Int_t *group) const
Definition: THn.h:175
virtual ~THn()
Destruct a THn.
Definition: THn.cxx:193
static THn * CreateHn(const char *name, const char *title, const THnBase *hn)
Definition: THn.h:49
Long64_t GetBin(const Int_t *idx, Bool_t=kTRUE)
Definition: THn.h:74
TNDArrayT< Double_t > fSumw2
Definition: THn.h:182
void SetBinContent(const Int_t *idx, Double_t v)
Definition: THn.h:94
Double_t GetBinContent(Long64_t bin, Int_t *idx=0) const
Definition: THn.h:122
THn & operator=(const THn &)
void Reset(Option_t *option="")
Reset the contents of a THn.
Definition: THn.cxx:245
Long64_t GetBin(const Double_t *x, Bool_t=kTRUE)
Definition: THn.h:77
Long64_t GetNbins() const
Definition: THn.h:54
TH3D * Projection(Int_t xDim, Int_t yDim, Int_t zDim, Option_t *option="") const
Definition: THn.h:159
void AddBinError2(Long64_t bin, Double_t e2)
Definition: THn.h:114
virtual TNDArray & GetArray()=0
void Sumw2()
Enable calculation of errors.
Definition: THn.cxx:211
virtual const TNDArray & GetArray() const =0
Long64_t GetBin(const Double_t *x) const
Definition: THn.h:59
THn * Projection(Int_t ndim, const Int_t *dim, Option_t *option="") const
Definition: THn.h:167
ROOT::Internal::THnBaseBinIter * CreateIter(Bool_t respectAxisRange) const
Create an iterator over all bins. Public interface is THnIter.
Definition: THn.cxx:202
void SetBinError2(Long64_t bin, Double_t e2)
Definition: THn.h:102
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:72
Long64_t GetCellSize(Int_t dim) const
Definition: TNDArray.h:73
Long64_t GetBin(const Int_t *idx) const
Definition: TNDArray.h:75
virtual void SetAsDouble(ULong64_t linidx, Double_t value)=0
Double_t x[n]
Definition: legend1.C:17
TH1F * h1
Definition: legend1.C:5