1    	// @(#)root/hist:$Id$
2    	// Author: Rene Brun   26/12/94
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_TH2
13   	#define ROOT_TH2
14   	
15   	
16   	//////////////////////////////////////////////////////////////////////////
17   	//                                                                      //
18   	// TH2                                                                  //
19   	//                                                                      //
20   	// 2-Dim histogram base class.                                          //
21   	//                                                                      //
22   	//////////////////////////////////////////////////////////////////////////
23   	
24   	#ifndef ROOT_TH1
25   	#include "TH1.h"
26   	#endif
27   	#ifndef ROOT_TMatrixFBasefwd
28   	#include "TMatrixFBasefwd.h"
29   	#endif
30   	#ifndef ROOT_TMatrixDBasefwd
31   	#include "TMatrixDBasefwd.h"
32   	#endif
33   	
34   	class TProfile;
35   	
36   	class TH2 : public TH1 {
37   	   
38   	protected:
39   	   Double_t     fScalefactor;     //Scale factor
40   	   Double_t     fTsumwy;          //Total Sum of weight*Y
41   	   Double_t     fTsumwy2;         //Total Sum of weight*Y*Y
42   	   Double_t     fTsumwxy;         //Total Sum of weight*X*Y
43   	
44   	   TH2();
45   	   TH2(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
46   	                                         ,Int_t nbinsy,Double_t ylow,Double_t yup);
47   	   TH2(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
48   	                                         ,Int_t nbinsy,Double_t ylow,Double_t yup);
49   	   TH2(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
50   	                                         ,Int_t nbinsy,const Double_t *ybins);
51   	   TH2(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
52   	                                         ,Int_t nbinsy,const Double_t *ybins);
53   	   TH2(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins
54   	                                         ,Int_t nbinsy,const Float_t  *ybins);
55   	
56   	   virtual Int_t     BufferFill(Double_t x, Double_t y, Double_t w);
57   	   virtual TH1D     *DoProjection(bool onX, const char *name, Int_t firstbin, Int_t lastbin, Option_t *option) const;
58   	   virtual TProfile *DoProfile(bool onX, const char *name, Int_t firstbin, Int_t lastbin, Option_t *option) const;
59   	   virtual void      DoFitSlices(bool onX, TF1 *f1, Int_t firstbin, Int_t lastbin, Int_t cut, Option_t *option, TObjArray* arr);
60   	
61   	   Int_t    BufferFill(Double_t, Double_t) {return -2;} //may not use
62   	   Int_t    Fill(Double_t); //MayNotUse
63   	   Int_t    Fill(const char*, Double_t) { return Fill(0);}  //MayNotUse
64   	
65   	public:
66   	   TH2(const TH2&);
67   	   virtual ~TH2();
68   	   virtual Int_t    BufferEmpty(Int_t action=0);
69   	   virtual void     Copy(TObject &hnew) const;
70   	   virtual Int_t    Fill(Double_t x, Double_t y);
71   	   virtual Int_t    Fill(Double_t x, Double_t y, Double_t w);
72   	   virtual Int_t    Fill(Double_t x, const char *namey, Double_t w);
73   	   virtual Int_t    Fill(const char *namex, Double_t y, Double_t w);
74   	   virtual Int_t    Fill(const char *namex, const char *namey, Double_t w);
75   	   virtual void     FillN(Int_t, const Double_t *, const Double_t *, Int_t) {;} //MayNotUse
76   	   virtual void     FillN(Int_t ntimes, const Double_t *x, const Double_t *y, const Double_t *w, Int_t stride=1);
77   	   virtual void     FillRandom(const char *fname, Int_t ntimes=5000);
78   	   virtual void     FillRandom(TH1 *h, Int_t ntimes=5000);
79   	   virtual Int_t    FindFirstBinAbove(Double_t threshold=0, Int_t axis=1) const;
80   	   virtual Int_t    FindLastBinAbove (Double_t threshold=0, Int_t axis=1) const;
81   	   virtual void     FitSlicesX(TF1 *f1=0,Int_t firstybin=0, Int_t lastybin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray* arr = 0); // *MENU*
82   	   virtual void     FitSlicesY(TF1 *f1=0,Int_t firstxbin=0, Int_t lastxbin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray* arr = 0); // *MENU*
83   	   virtual Double_t GetBinWithContent2(Double_t c, Int_t &binx, Int_t &biny, Int_t firstxbin=1, Int_t lastxbin=-1,Int_t firstybin=1, Int_t lastybin=-1, Double_t maxdiff=0) const;
84   	   using TH1::GetBinErrorLow;
85   	   using TH1::GetBinErrorUp;
86   	   virtual Double_t GetBinErrorLow(Int_t binx, Int_t biny) { return TH1::GetBinErrorLow( GetBin(binx, biny) ); }
87   	   virtual Double_t GetBinErrorUp(Int_t binx, Int_t biny) { return TH1::GetBinErrorUp( GetBin(binx, biny) ); }
88   	   virtual Double_t GetCorrelationFactor(Int_t axis1=1,Int_t axis2=2) const;
89   	   virtual Double_t GetCovariance(Int_t axis1=1,Int_t axis2=2) const;
90   	   virtual void     GetRandom2(Double_t &x, Double_t &y);
91   	   virtual void     GetStats(Double_t *stats) const;
92   	   virtual Double_t Integral(Option_t *option="") const;
93   	   //virtual Double_t Integral(Int_t, Int_t, Option_t * ="") const {return 0;}
94   	   using TH1::Integral;
95   	   virtual Double_t Integral(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Option_t *option="") const;
96   	   virtual Double_t Integral(Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, Option_t * ="") const {return 0;}
97   	   using TH1::IntegralAndError;
98   	   virtual Double_t IntegralAndError(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Double_t & err, Option_t *option="") const;
99   	   virtual Double_t Interpolate(Double_t x);
100  	   virtual Double_t Interpolate(Double_t x, Double_t y);
101  	   virtual Double_t Interpolate(Double_t x, Double_t y, Double_t z);
102  	   virtual Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const;
103  	   virtual Long64_t Merge(TCollection *list);
104  	   virtual TH2     *RebinX(Int_t ngroup=2, const char *newname="");
105  	   virtual TH2     *RebinY(Int_t ngroup=2, const char *newname="");  
106  	   virtual TH2     *Rebin2D(Int_t nxgroup=2, Int_t nygroup=2, const char *newname="");     
107  	      TProfile     *ProfileX(const char *name="_pfx", Int_t firstybin=1, Int_t lastybin=-1, Option_t *option="") const;   // *MENU*
108  	      TProfile     *ProfileY(const char *name="_pfy", Int_t firstxbin=1, Int_t lastxbin=-1, Option_t *option="") const;   // *MENU*
109  	         TH1D      *ProjectionX(const char *name="_px", Int_t firstybin=0, Int_t lastybin=-1, Option_t *option="") const; // *MENU*
110  	         TH1D      *ProjectionY(const char *name="_py", Int_t firstxbin=0, Int_t lastxbin=-1, Option_t *option="") const; // *MENU*
111  	   virtual void     PutStats(Double_t *stats);
112  	   virtual void     Reset(Option_t *option="");
113  	   virtual void     SetShowProjectionX(Int_t nbins=1);  // *MENU*
114  	   virtual void     SetShowProjectionY(Int_t nbins=1);  // *MENU*
115  	   virtual TH1     *ShowBackground(Int_t niter=20, Option_t *option="same");
116  	   virtual Int_t    ShowPeaks(Double_t sigma=2, Option_t *option="", Double_t threshold=0.05); // *MENU*
117  	   virtual void     Smooth(Int_t ntimes=1, Option_t *option=""); // *MENU*
118  	           
119  	   ClassDef(TH2,4)  //2-Dim histogram base class
120  	};
121  	
122  	
123  	//______________________________________________________________________________
124  	
125  	class TH2C : public TH2, public TArrayC {
126  	
127  	public:
128  	   TH2C();
129  	   TH2C(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
130  	                                ,Int_t nbinsy,Double_t ylow,Double_t yup);
131  	   TH2C(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
132  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
133  	   TH2C(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
134  	                                          ,Int_t nbinsy,const Double_t *ybins);
135  	   TH2C(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
136  	                                          ,Int_t nbinsy,const Double_t *ybins);
137  	   TH2C(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins
138  	                                          ,Int_t nbinsy,const Float_t  *ybins);
139  	   TH2C(const TH2C &h2c);
140  	   virtual ~TH2C();
141  	   virtual void     AddBinContent(Int_t bin);
142  	   virtual void     AddBinContent(Int_t bin, Double_t w);
143  	   virtual void     Copy(TObject &hnew) const;
144  	   virtual TH1     *DrawCopy(Option_t *option="") const;
145  	   virtual Double_t GetBinContent(Int_t bin) const;
146  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny) const {return GetBinContent(GetBin(binx,biny));}
147  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny, Int_t) const {return GetBinContent(GetBin(binx,biny));}
148  	   virtual void     Reset(Option_t *option="");
149  	   virtual void     SetBinContent(Int_t bin, Double_t content);
150  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
151  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Int_t, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
152  	   virtual void     SetBinsLength(Int_t n=-1);
153  	           TH2C&    operator=(const TH2C &h1);
154  	   friend  TH2C     operator*(Float_t c1, TH2C &h1);
155  	   friend  TH2C     operator*(TH2C &h1, Float_t c1) {return operator*(c1,h1);}
156  	   friend  TH2C     operator+(TH2C &h1, TH2C &h2);
157  	   friend  TH2C     operator-(TH2C &h1, TH2C &h2);
158  	   friend  TH2C     operator*(TH2C &h1, TH2C &h2);
159  	   friend  TH2C     operator/(TH2C &h1, TH2C &h2);
160  	
161  	   ClassDef(TH2C,3)  //2-Dim histograms (one char per channel)
162  	};
163  	
164  	
165  	//______________________________________________________________________________
166  	
167  	class TH2S : public TH2, public TArrayS {
168  	
169  	public:
170  	   TH2S();
171  	   TH2S(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
172  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
173  	   TH2S(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
174  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
175  	   TH2S(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
176  	                                          ,Int_t nbinsy,const Double_t *ybins);
177  	   TH2S(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
178  	                                          ,Int_t nbinsy,const Double_t *ybins);
179  	   TH2S(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins
180  	                                          ,Int_t nbinsy,const Float_t  *ybins);
181  	   TH2S(const TH2S &h2s);
182  	   virtual ~TH2S();
183  	   virtual void     AddBinContent(Int_t bin);
184  	   virtual void     AddBinContent(Int_t bin, Double_t w);
185  	   virtual void     Copy(TObject &hnew) const;
186  	   virtual TH1     *DrawCopy(Option_t *option="") const;
187  	   virtual Double_t GetBinContent(Int_t bin) const;
188  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny) const {return GetBinContent(GetBin(binx,biny));}
189  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny, Int_t) const {return GetBinContent(GetBin(binx,biny));}
190  	   virtual void     Reset(Option_t *option="");
191  	   virtual void     SetBinContent(Int_t bin, Double_t content);
192  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
193  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Int_t, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
194  	   virtual void     SetBinsLength(Int_t n=-1);
195  	           TH2S&    operator=(const TH2S &h1);
196  	   friend  TH2S     operator*(Float_t c1, TH2S &h1);
197  	   friend  TH2S     operator*(TH2S &h1, Float_t c1) {return operator*(c1,h1);}
198  	   friend  TH2S     operator+(TH2S &h1, TH2S &h2);
199  	   friend  TH2S     operator-(TH2S &h1, TH2S &h2);
200  	   friend  TH2S     operator*(TH2S &h1, TH2S &h2);
201  	   friend  TH2S     operator/(TH2S &h1, TH2S &h2);
202  	
203  	   ClassDef(TH2S,3)  //2-Dim histograms (one short per channel)
204  	};
205  	
206  	
207  	//______________________________________________________________________________
208  	
209  	class TH2I : public TH2, public TArrayI {
210  	
211  	public:
212  	   TH2I();
213  	   TH2I(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
214  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
215  	   TH2I(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
216  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
217  	   TH2I(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
218  	                                          ,Int_t nbinsy,const Double_t *ybins);
219  	   TH2I(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
220  	                                          ,Int_t nbinsy,const Double_t *ybins);
221  	   TH2I(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins
222  	                                          ,Int_t nbinsy,const Float_t  *ybins);
223  	   TH2I(const TH2I &h2i);
224  	   virtual ~TH2I();
225  	   virtual void     AddBinContent(Int_t bin);
226  	   virtual void     AddBinContent(Int_t bin, Double_t w);
227  	   virtual void     Copy(TObject &hnew) const;
228  	   virtual TH1     *DrawCopy(Option_t *option="") const;
229  	   virtual Double_t GetBinContent(Int_t bin) const;
230  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny) const {return GetBinContent(GetBin(binx,biny));}
231  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny, Int_t) const {return GetBinContent(GetBin(binx,biny));}
232  	   virtual void     Reset(Option_t *option="");
233  	   virtual void     SetBinContent(Int_t bin, Double_t content);
234  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
235  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Int_t, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
236  	   virtual void     SetBinsLength(Int_t n=-1);
237  	           TH2I&    operator=(const TH2I &h1);
238  	   friend  TH2I     operator*(Float_t c1, TH2I &h1);
239  	   friend  TH2I     operator*(TH2I &h1, Float_t c1) {return operator*(c1,h1);}
240  	   friend  TH2I     operator+(TH2I &h1, TH2I &h2);
241  	   friend  TH2I     operator-(TH2I &h1, TH2I &h2);
242  	   friend  TH2I     operator*(TH2I &h1, TH2I &h2);
243  	   friend  TH2I     operator/(TH2I &h1, TH2I &h2);
244  	
245  	   ClassDef(TH2I,3)  //2-Dim histograms (one 32 bits integer per channel)
246  	};
247  	
248  	
249  	//______________________________________________________________________________
250  	
251  	class TH2F : public TH2, public TArrayF {
252  	
253  	public:
254  	   TH2F();
255  	   TH2F(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
256  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
257  	   TH2F(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
258  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
259  	   TH2F(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
260  	                                          ,Int_t nbinsy,const Double_t *ybins);
261  	   TH2F(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
262  	                                          ,Int_t nbinsy,const Double_t *ybins);
263  	   TH2F(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins
264  	                                          ,Int_t nbinsy,const Float_t  *ybins);
265  	   TH2F(const TMatrixFBase &m);
266  	   TH2F(const TH2F &h2f);
267  	   virtual ~TH2F();
268  	   virtual void     AddBinContent(Int_t bin) {++fArray[bin];}
269  	   virtual void     AddBinContent(Int_t bin, Double_t w)
270  	                                 {fArray[bin] += Float_t (w);}
271  	   virtual void     Copy(TObject &hnew) const;
272  	   virtual TH1     *DrawCopy(Option_t *option="") const;
273  	   virtual Double_t GetBinContent(Int_t bin) const;
274  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny) const {return GetBinContent(GetBin(binx,biny));}
275  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny, Int_t) const {return GetBinContent(GetBin(binx,biny));}
276  	   virtual void     Reset(Option_t *option="");
277  	   virtual void     SetBinContent(Int_t bin, Double_t content);
278  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
279  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Int_t, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
280  	   virtual void     SetBinsLength(Int_t n=-1);
281  	           TH2F&    operator=(const TH2F &h1);
282  	   friend  TH2F     operator*(Float_t c1, TH2F &h1);
283  	   friend  TH2F     operator*(TH2F &h1, Float_t c1);
284  	   friend  TH2F     operator+(TH2F &h1, TH2F &h2);
285  	   friend  TH2F     operator-(TH2F &h1, TH2F &h2);
286  	   friend  TH2F     operator*(TH2F &h1, TH2F &h2);
287  	   friend  TH2F     operator/(TH2F &h1, TH2F &h2);
288  	
289  	   ClassDef(TH2F,3)  //2-Dim histograms (one float per channel)
290  	};
291  	
292  	
293  	//______________________________________________________________________________
294  	
295  	class TH2D : public TH2, public TArrayD {
296  	
297  	public:
298  	   TH2D();
299  	   TH2D(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
300  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
301  	   TH2D(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
302  	                                          ,Int_t nbinsy,Double_t ylow,Double_t yup);
303  	   TH2D(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
304  	                                          ,Int_t nbinsy,const Double_t *ybins);
305  	   TH2D(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
306  	                                          ,Int_t nbinsy,const Double_t *ybins);
307  	   TH2D(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins
308  	                                          ,Int_t nbinsy,const Float_t  *ybins);
309  	   TH2D(const TMatrixDBase &m);
310  	   TH2D(const TH2D &h2d);
311  	   virtual ~TH2D();
312  	   virtual void     AddBinContent(Int_t bin) {++fArray[bin];}
313  	   virtual void     AddBinContent(Int_t bin, Double_t w)
314  	                                 {fArray[bin] += Double_t (w);}
315  	   virtual void     Copy(TObject &hnew) const;
316  	   virtual TH1     *DrawCopy(Option_t *option="") const;
317  	   virtual Double_t GetBinContent(Int_t bin) const;
318  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny) const {return GetBinContent(GetBin(binx,biny));}
319  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny, Int_t) const {return GetBinContent(GetBin(binx,biny));}
320  	   virtual void     Reset(Option_t *option="");
321  	   virtual void     SetBinContent(Int_t bin, Double_t content);
322  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
323  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Int_t, Double_t content) {SetBinContent(GetBin(binx,biny),content);}
324  	   virtual void     SetBinsLength(Int_t n=-1);
325  	           TH2D&    operator=(const TH2D &h1);
326  	   friend  TH2D     operator*(Float_t c1, TH2D &h1);
327  	   friend  TH2D     operator*(TH2D &h1, Float_t c1) {return operator*(c1,h1);}
328  	   friend  TH2D     operator+(TH2D &h1, TH2D &h2);
329  	   friend  TH2D     operator-(TH2D &h1, TH2D &h2);
330  	   friend  TH2D     operator*(TH2D &h1, TH2D &h2);
331  	   friend  TH2D     operator/(TH2D &h1, TH2D &h2);
332  	
333  	   ClassDef(TH2D,3)  //2-Dim histograms (one double per channel)
334  	};
335  	
336  	#endif
337  	
338