1    	// @(#)root/hist:$Id$
2    	// Author: Rene Brun   27/10/95
3    	
4    	/*************************************************************************
5    	 * Copyright (C) 1995-2000, 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_TH3
13   	#define ROOT_TH3
14   	
15   	
16   	//////////////////////////////////////////////////////////////////////////
17   	//                                                                      //
18   	// TH3                                                                  //
19   	//                                                                      //
20   	// 3-Dim histogram base class.                                          //
21   	//                                                                      //
22   	//////////////////////////////////////////////////////////////////////////
23   	
24   	#ifndef ROOT_TH1
25   	#include "TH1.h"
26   	#endif
27   	
28   	#ifndef ROOT_TAtt3D
29   	#include "TAtt3D.h"
30   	#endif
31   	
32   	class TH2D; 
33   	class TProfile2D;
34   	
35   	class TH3 : public TH1, public TAtt3D {
36   	
37   	protected:
38   	   Double_t     fTsumwy;          //Total Sum of weight*Y
39   	   Double_t     fTsumwy2;         //Total Sum of weight*Y*Y
40   	   Double_t     fTsumwxy;         //Total Sum of weight*X*Y
41   	   Double_t     fTsumwz;          //Total Sum of weight*Z
42   	   Double_t     fTsumwz2;         //Total Sum of weight*Z*Z
43   	   Double_t     fTsumwxz;         //Total Sum of weight*X*Z
44   	   Double_t     fTsumwyz;         //Total Sum of weight*Y*Z
45   	
46   	   TH3();
47   	   TH3(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
48   	                                  ,Int_t nbinsy,Double_t ylow,Double_t yup
49   	                                  ,Int_t nbinsz,Double_t zlow,Double_t zup);
50   	   TH3(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
51   	                                         ,Int_t nbinsy,const Float_t *ybins
52   	                                         ,Int_t nbinsz,const Float_t *zbins);
53   	   TH3(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
54   	                                         ,Int_t nbinsy,const Double_t *ybins
55   	                                         ,Int_t nbinsz,const Double_t *zbins);
56   	   virtual Int_t    BufferFill(Double_t x, Double_t y, Double_t z, Double_t w);
57   	
58   	   void DoFillProfileProjection(TProfile2D * p2, const TAxis & a1, const TAxis & a2, const TAxis & a3, Int_t bin1, Int_t bin2, Int_t bin3, Int_t inBin, Bool_t useWeights) const;
59   	
60   	   virtual Int_t    BufferFill(Double_t, Double_t) {return -2;} //may not use
61   	   virtual Int_t    BufferFill(Double_t, Double_t, Double_t) {return -2;} //may not use
62   	   Int_t    Fill(Double_t);        //MayNotUse
63   	   Int_t    Fill(Double_t,Double_t) {return Fill(0.);} //MayNotUse
64   	   Int_t    Fill(const char*, Double_t) {return Fill(0);} //MayNotUse
65   	   Int_t    Fill(Double_t,const char*,Double_t) {return Fill(0);} //MayNotUse
66   	   Int_t    Fill(const char*,Double_t,Double_t) {return Fill(0);} //MayNotUse
67   	   Int_t    Fill(const char*,const char*,Double_t) {return Fill(0);} //MayNotUse
68   	
69   	public:
70   	   TH3(const TH3&);
71   	   virtual ~TH3();
72   	   virtual Int_t    BufferEmpty(Int_t action=0);
73   	   virtual void     Copy(TObject &hnew) const;
74   	   virtual Int_t    Fill(Double_t x, Double_t y, Double_t z);
75   	   virtual Int_t    Fill(Double_t x, Double_t y, Double_t z, Double_t w);
76   	
77   	   virtual Int_t    Fill(const char *namex, const char *namey, const char *namez, Double_t w);
78   	   virtual Int_t    Fill(const char *namex, Double_t y, const char *namez, Double_t w);
79   	   virtual Int_t    Fill(const char *namex, const char *namey, Double_t z, Double_t w);
80   	   virtual Int_t    Fill(Double_t x, const char *namey, const char *namez, Double_t w);
81   	   virtual Int_t    Fill(Double_t x, const char *namey, Double_t z, Double_t w);
82   	   virtual Int_t    Fill(Double_t x, Double_t y, const char *namez, Double_t w);
83   	
84   	   virtual void     FillRandom(const char *fname, Int_t ntimes=5000);
85   	   virtual void     FillRandom(TH1 *h, Int_t ntimes=5000);
86   	   virtual Int_t    FindFirstBinAbove(Double_t threshold=0, Int_t axis=1) const;
87   	   virtual Int_t    FindLastBinAbove (Double_t threshold=0, Int_t axis=1) const;
88   	   virtual void     FitSlicesZ(TF1 *f1=0,Int_t binminx=1, Int_t binmaxx=0,Int_t binminy=1, Int_t binmaxy=0,
89   	                                        Int_t cut=0 ,Option_t *option="QNR"); // *MENU*
90   	   using TH1::GetBinErrorLow;
91   	   using TH1::GetBinErrorUp;
92   	   virtual Double_t GetBinErrorLow(Int_t binx, Int_t biny, Int_t binz) { return TH1::GetBinErrorLow( GetBin(binx, biny, binz) ); }
93   	   virtual Double_t GetBinErrorUp(Int_t binx, Int_t biny, Int_t binz)  { return TH1::GetBinErrorUp( GetBin(binx, biny, binz) ); }
94   	   virtual Double_t GetBinWithContent3(Double_t c, Int_t &binx, Int_t &biny, Int_t &binz, Int_t firstx=0, Int_t lastx=0,Int_t firsty=0, Int_t lasty=0, Int_t firstz=0, Int_t lastz=0, Double_t maxdiff=0) const;
95   	   virtual Double_t GetCorrelationFactor(Int_t axis1=1,Int_t axis2=2) const;
96   	   virtual Double_t GetCovariance(Int_t axis1=1,Int_t axis2=2) const;
97   	   virtual void     GetRandom3(Double_t &x, Double_t &y, Double_t &z);
98   	   virtual void     GetStats(Double_t *stats) const;
99   	   virtual Double_t Integral(Option_t *option="") const;
100  	   using TH1::Integral;
101  	   virtual Double_t Integral(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Int_t binz1, Int_t binz2, Option_t *option="") const;
102  	   using TH1::IntegralAndError;
103  	   virtual Double_t IntegralAndError(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Int_t binz1, Int_t binz2, Double_t & err, Option_t *option="") const;
104  	   virtual Double_t Interpolate(Double_t x);
105  	   virtual Double_t Interpolate(Double_t x, Double_t y);
106  	   virtual Double_t Interpolate(Double_t x, Double_t y, Double_t z);
107  	   virtual Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const;
108  	   virtual Long64_t Merge(TCollection *list);
109  	         TH1D      *ProjectionX(const char *name="_px", Int_t firstybin=0, Int_t lastybin=-1, Int_t firstzbin=0,
110  	                                Int_t lastzbin=-1, Option_t *option="") const; // *MENU*
111  	         TH1D      *ProjectionY(const char *name="_py", Int_t firstxbin=0, Int_t lastxbin=-1, Int_t firstzbin=0,
112  	                                Int_t lastzbin=-1, Option_t *option="") const; // *MENU*
113  	         TH1D      *ProjectionZ(const char *name="_pz", Int_t firstxbin=0, Int_t lastxbin=-1, Int_t firstybin=0,
114  	                                Int_t lastybin=-1, Option_t *option="") const; // *MENU*
115  	         TH1       *Project3D(Option_t *option="x") const; // *MENU*
116  	   virtual TProfile2D  *Project3DProfile(Option_t *option="xy") const; // *MENU*
117  	   virtual void     PutStats(Double_t *stats);
118  	   virtual TH3     *RebinX(Int_t ngroup = 2, const char *newname = "");
119  	   virtual TH3     *RebinY(Int_t ngroup = 2, const char *newname = "");
120  	   virtual TH3     *RebinZ(Int_t ngroup = 2, const char *newname = "");
121  	   virtual TH3     *Rebin3D(Int_t nxgroup = 2, Int_t nygroup = 2, Int_t nzgroup = 2, const char *newname = "");
122  	   virtual void     Reset(Option_t *option="");
123  	   virtual void     SetShowProjection(const char *option="xy",Int_t nbins=1);   // *MENU*
124  	
125  	protected:
126  	
127  	   virtual TH1D        *DoProject1D(const char* name, const char * title, TAxis* projX, 
128  	                         bool computeErrors, bool originalRange,
129  	                         bool useUF, bool useOF) const;
130  	   virtual TH2D        *DoProject2D(const char* name, const char * title, TAxis* projX, TAxis* projY, 
131  	                        bool computeErrors, bool originalRange,
132  	                         bool useUF, bool useOF) const;
133  	   virtual TProfile2D  *DoProjectProfile2D(const char* name, const char * title, TAxis* projX, TAxis* projY, 
134  	                                          bool originalRange, bool useUF, bool useOF) const;
135  	
136  	   // these functions are need to be used inside TProfile3D::DoProjectProfile2D
137  	   static TH1D         *DoProject1D(const TH3 & h, const char* name, const char * title, TAxis* projX,  
138  	                                    bool computeErrors, bool originalRange, bool useUF, bool useOF)  { 
139  	      return h.DoProject1D(name, title, projX, computeErrors, originalRange, useUF, useOF);
140  	   }
141  	   static TH2D         *DoProject2D(const TH3 & h, const char* name, const char * title, TAxis* projX, TAxis* projY, 
142  	                                    bool computeErrors, bool originalRange, bool useUF, bool useOF)  { 
143  	      return h.DoProject2D(name, title, projX,projY, computeErrors, originalRange, useUF, useOF);
144  	   }
145  	
146  	   ClassDef(TH3,5)  //3-Dim histogram base class
147  	};
148  	
149  	//________________________________________________________________________
150  	
151  	class TH3C : public TH3, public TArrayC {
152  	public:
153  	   TH3C();
154  	   TH3C(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
155  	                                  ,Int_t nbinsy,Double_t ylow,Double_t yup
156  	                                  ,Int_t nbinsz,Double_t zlow,Double_t zup);
157  	   TH3C(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
158  	                                          ,Int_t nbinsy,const Float_t *ybins
159  	                                          ,Int_t nbinsz,const Float_t *zbins);
160  	   TH3C(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
161  	                                          ,Int_t nbinsy,const Double_t *ybins
162  	                                          ,Int_t nbinsz,const Double_t *zbins);
163  	   TH3C(const TH3C &h3c);
164  	   virtual ~TH3C();
165  	   virtual void      AddBinContent(Int_t bin);
166  	   virtual void      AddBinContent(Int_t bin, Double_t w);
167  	   virtual void      Copy(TObject &hnew) const;
168  	   virtual TH1      *DrawCopy(Option_t *option="") const ;
169  	   virtual Double_t  GetBinContent(Int_t bin) const;
170  	   virtual Double_t  GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
171  	   virtual Double_t  GetBinContent(Int_t binx, Int_t biny, Int_t binz) const {return GetBinContent(GetBin(binx,biny,binz));}
172  	   virtual void      Reset(Option_t *option="");
173  	   virtual void      SetBinContent(Int_t bin, Double_t content);
174  	   virtual void      SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
175  	   virtual void      SetBinContent(Int_t binx, Int_t biny, Int_t binz, Double_t content) {SetBinContent(GetBin(binx,biny,binz),content);}
176  	   virtual void      SetBinsLength(Int_t n=-1);
177  	           TH3C&     operator=(const TH3C &h1);
178  	   friend  TH3C      operator*(Float_t c1, TH3C &h1);
179  	   friend  TH3C      operator*(TH3C &h1, Float_t c1) {return operator*(c1,h1);}
180  	   friend  TH3C      operator+(TH3C &h1, TH3C &h2);
181  	   friend  TH3C      operator-(TH3C &h1, TH3C &h2);
182  	   friend  TH3C      operator*(TH3C &h1, TH3C &h2);
183  	   friend  TH3C      operator/(TH3C &h1, TH3C &h2);
184  	
185  	   ClassDef(TH3C,3)  //3-Dim histograms (one char per channel)
186  	};
187  	
188  	//________________________________________________________________________
189  	
190  	class TH3S : public TH3, public TArrayS {
191  	public:
192  	   TH3S();
193  	   TH3S(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
194  	                                  ,Int_t nbinsy,Double_t ylow,Double_t yup
195  	                                  ,Int_t nbinsz,Double_t zlow,Double_t zup);
196  	   TH3S(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
197  	                                          ,Int_t nbinsy,const Float_t *ybins
198  	                                          ,Int_t nbinsz,const Float_t *zbins);
199  	   TH3S(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
200  	                                          ,Int_t nbinsy,const Double_t *ybins
201  	                                          ,Int_t nbinsz,const Double_t *zbins);
202  	   TH3S(const TH3S &h3s);
203  	   virtual ~TH3S();
204  	   virtual void      AddBinContent(Int_t bin);
205  	   virtual void      AddBinContent(Int_t bin, Double_t w);
206  	   virtual void      Copy(TObject &hnew) const;
207  	   virtual TH1      *DrawCopy(Option_t *option="") const;
208  	   virtual Double_t  GetBinContent(Int_t bin) const;
209  	   virtual Double_t  GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
210  	   virtual Double_t  GetBinContent(Int_t binx, Int_t biny, Int_t binz) const {return GetBinContent(GetBin(binx,biny,binz));}
211  	   virtual void      Reset(Option_t *option="");
212  	   virtual void      SetBinContent(Int_t bin, Double_t content);
213  	   virtual void      SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
214  	   virtual void      SetBinContent(Int_t binx, Int_t biny, Int_t binz, Double_t content) {SetBinContent(GetBin(binx,biny,binz),content);}
215  	   virtual void      SetBinsLength(Int_t n=-1);
216  	           TH3S&     operator=(const TH3S &h1);
217  	   friend  TH3S      operator*(Float_t c1, TH3S &h1);
218  	   friend  TH3S      operator*(TH3S &h1, Float_t c1) {return operator*(c1,h1);}
219  	   friend  TH3S      operator+(TH3S &h1, TH3S &h2);
220  	   friend  TH3S      operator-(TH3S &h1, TH3S &h2);
221  	   friend  TH3S      operator*(TH3S &h1, TH3S &h2);
222  	   friend  TH3S      operator/(TH3S &h1, TH3S &h2);
223  	
224  	   ClassDef(TH3S,3)  //3-Dim histograms (one short per channel)
225  	};
226  	
227  	//________________________________________________________________________
228  	
229  	class TH3I : public TH3, public TArrayI {
230  	public:
231  	   TH3I();
232  	   TH3I(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
233  	                                  ,Int_t nbinsy,Double_t ylow,Double_t yup
234  	                                  ,Int_t nbinsz,Double_t zlow,Double_t zup);
235  	   TH3I(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
236  	                                          ,Int_t nbinsy,const Float_t *ybins
237  	                                          ,Int_t nbinsz,const Float_t *zbins);
238  	   TH3I(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
239  	                                          ,Int_t nbinsy,const Double_t *ybins
240  	                                          ,Int_t nbinsz,const Double_t *zbins);
241  	   TH3I(const TH3I &h3i);
242  	   virtual ~TH3I();
243  	   virtual void      AddBinContent(Int_t bin);
244  	   virtual void      AddBinContent(Int_t bin, Double_t w);
245  	   virtual void      Copy(TObject &hnew) const;
246  	   virtual TH1      *DrawCopy(Option_t *option="") const;
247  	   virtual Double_t  GetBinContent(Int_t bin) const;
248  	   virtual Double_t  GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
249  	   virtual Double_t  GetBinContent(Int_t binx, Int_t biny, Int_t binz) const {return GetBinContent(GetBin(binx,biny,binz));}
250  	   virtual void      Reset(Option_t *option="");
251  	   virtual void      SetBinContent(Int_t bin, Double_t content);
252  	   virtual void      SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
253  	   virtual void      SetBinContent(Int_t binx, Int_t biny, Int_t binz, Double_t content) {SetBinContent(GetBin(binx,biny,binz),content);}
254  	   virtual void      SetBinsLength(Int_t n=-1);
255  	           TH3I&     operator=(const TH3I &h1);
256  	   friend  TH3I      operator*(Float_t c1, TH3I &h1);
257  	   friend  TH3I      operator*(TH3I &h1, Float_t c1) {return operator*(c1,h1);}
258  	   friend  TH3I      operator+(TH3I &h1, TH3I &h2);
259  	   friend  TH3I      operator-(TH3I &h1, TH3I &h2);
260  	   friend  TH3I      operator*(TH3I &h1, TH3I &h2);
261  	   friend  TH3I      operator/(TH3I &h1, TH3I &h2);
262  	
263  	   ClassDef(TH3I,3)  //3-Dim histograms (one 32 bits integer per channel)
264  	};
265  	
266  	
267  	//________________________________________________________________________
268  	
269  	class TH3F : public TH3, public TArrayF {
270  	public:
271  	   TH3F();
272  	   TH3F(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
273  	                                  ,Int_t nbinsy,Double_t ylow,Double_t yup
274  	                                  ,Int_t nbinsz,Double_t zlow,Double_t zup);
275  	   TH3F(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
276  	                                          ,Int_t nbinsy,const Float_t *ybins
277  	                                          ,Int_t nbinsz,const Float_t *zbins);
278  	   TH3F(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
279  	                                          ,Int_t nbinsy,const Double_t *ybins
280  	                                          ,Int_t nbinsz,const Double_t *zbins);
281  	   TH3F(const TH3F &h3f);
282  	   virtual ~TH3F();
283  	   virtual void      AddBinContent(Int_t bin) {++fArray[bin];}
284  	   virtual void      AddBinContent(Int_t bin, Double_t w)
285  	                                 {fArray[bin] += Float_t (w);}
286  	   virtual void      Copy(TObject &hnew) const;
287  	   virtual TH1      *DrawCopy(Option_t *option="") const;
288  	   virtual Double_t  GetBinContent(Int_t bin) const;
289  	   virtual Double_t  GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
290  	   virtual Double_t  GetBinContent(Int_t binx, Int_t biny, Int_t binz) const {return GetBinContent(GetBin(binx,biny,binz));}
291  	   virtual void      Reset(Option_t *option="");
292  	   virtual void      SetBinContent(Int_t bin, Double_t content);
293  	   virtual void      SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
294  	   virtual void      SetBinContent(Int_t binx, Int_t biny, Int_t binz, Double_t content) {SetBinContent(GetBin(binx,biny,binz),content);}
295  	   virtual void      SetBinsLength(Int_t n=-1);
296  	           TH3F&     operator=(const TH3F &h1);
297  	   friend  TH3F      operator*(Float_t c1, TH3F &h1);
298  	   friend  TH3F      operator*(TH3F &h1, Float_t c1) {return operator*(c1,h1);}
299  	   friend  TH3F      operator+(TH3F &h1, TH3F &h2);
300  	   friend  TH3F      operator-(TH3F &h1, TH3F &h2);
301  	   friend  TH3F      operator*(TH3F &h1, TH3F &h2);
302  	   friend  TH3F      operator/(TH3F &h1, TH3F &h2);
303  	
304  	   ClassDef(TH3F,3)  //3-Dim histograms (one float per channel)
305  	};
306  	
307  	//________________________________________________________________________
308  	
309  	class TH3D : public TH3, public TArrayD {
310  	public:
311  	   TH3D();
312  	   TH3D(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
313  	                                  ,Int_t nbinsy,Double_t ylow,Double_t yup
314  	                                  ,Int_t nbinsz,Double_t zlow,Double_t zup);
315  	   TH3D(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
316  	                                          ,Int_t nbinsy,const Float_t *ybins
317  	                                          ,Int_t nbinsz,const Float_t *zbins);
318  	   TH3D(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
319  	                                          ,Int_t nbinsy,const Double_t *ybins
320  	                                          ,Int_t nbinsz,const Double_t *zbins);
321  	   TH3D(const TH3D &h3d);
322  	   virtual ~TH3D();
323  	   virtual void      AddBinContent(Int_t bin) {++fArray[bin];}
324  	   virtual void      AddBinContent(Int_t bin, Double_t w)
325  	                                 {fArray[bin] += Double_t (w);}
326  	   virtual void      Copy(TObject &hnew) const;
327  	   virtual TH1      *DrawCopy(Option_t *option="") const;
328  	   virtual Double_t  GetBinContent(Int_t bin) const;
329  	   virtual Double_t  GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
330  	   virtual Double_t  GetBinContent(Int_t binx, Int_t biny, Int_t binz) const {return GetBinContent(GetBin(binx,biny,binz));}
331  	   virtual void      Reset(Option_t *option="");
332  	   virtual void      SetBinContent(Int_t bin, Double_t content);
333  	   virtual void      SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
334  	   virtual void      SetBinContent(Int_t binx, Int_t biny, Int_t binz, Double_t content) {SetBinContent(GetBin(binx,biny,binz),content);}
335  	   virtual void      SetBinsLength(Int_t n=-1);
336  	           TH3D&     operator=(const TH3D &h1);
337  	   friend  TH3D      operator*(Float_t c1, TH3D &h1);
338  	   friend  TH3D      operator*(TH3D &h1, Float_t c1) {return operator*(c1,h1);}
339  	   friend  TH3D      operator+(TH3D &h1, TH3D &h2);
340  	   friend  TH3D      operator-(TH3D &h1, TH3D &h2);
341  	   friend  TH3D      operator*(TH3D &h1, TH3D &h2);
342  	   friend  TH3D      operator/(TH3D &h1, TH3D &h2);
343  	
344  	   ClassDef(TH3D,3)  //3-Dim histograms (one double per channel)
345  	};
346  	
347  	#endif
348  	
349