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_TH1
13   	#define ROOT_TH1
14   	
15   	
16   	//////////////////////////////////////////////////////////////////////////
17   	//                                                                      //
18   	// TH1                                                                  //
19   	//                                                                      //
20   	// 1-Dim histogram base class.                                          //
21   	//                                                                      //
22   	//////////////////////////////////////////////////////////////////////////
23   	
24   	#ifndef ROOT_TAxis
25   	#include "TAxis.h"
26   	#endif
27   	
28   	#ifndef ROOT_TAttLine
29   	#include "TAttLine.h"
30   	#endif
31   	
32   	#ifndef ROOT_TAttFill
33   	#include "TAttFill.h"
34   	#endif
35   	
36   	#ifndef ROOT_TAttMarker
37   	#include "TAttMarker.h"
38   	#endif
39   	
40   	#ifndef ROOT_TArrayC
41   	#include "TArrayC.h"
42   	#endif
43   	#ifndef ROOT_TArrayS
44   	#include "TArrayS.h"
45   	#endif
46   	#ifndef ROOT_TArrayI
47   	#include "TArrayI.h"
48   	#endif
49   	#ifndef ROOT_TArrayF
50   	#include "TArrayF.h"
51   	#endif
52   	#ifndef ROOT_TArrayD
53   	#include "TArrayD.h"
54   	#endif
55   	#include "Foption.h"
56   	
57   	#ifndef ROOT_TVectorFfwd
58   	#include "TVectorFfwd.h"
59   	#endif
60   	#ifndef ROOT_TVectorDfwd
61   	#include "TVectorDfwd.h"
62   	#endif
63   	
64   	#include <float.h>
65   	
66   	class TF1;
67   	class TH1D;
68   	class TBrowser;
69   	class TDirectory;
70   	class TList;
71   	class TCollection;
72   	class TVirtualFFT;
73   	class TVirtualHistPainter;
74   	
75   	#include "TFitResultPtr.h"
76   	
77   	class TH1 : public TNamed, public TAttLine, public TAttFill, public TAttMarker {
78   	
79   	public: 
80   	
81   	   // enumeration specifying type of statistics for bin errors
82   	   enum  EBinErrorOpt { 
83   	         kNormal = 0,    // errors with Normal (Wald) approximation: errorUp=errorLow= sqrt(N)
84   	         kPoisson = 1 ,  // errors from Poisson interval at 68.3% (1 sigma)
85   	         kPoisson2 = 2   // errors from Poisson interval at 95% CL (~ 2 sigma)            
86   	   };
87   	
88   	protected:
89   	    Int_t         fNcells;          //number of bins(1D), cells (2D) +U/Overflows
90   	    TAxis         fXaxis;           //X axis descriptor
91   	    TAxis         fYaxis;           //Y axis descriptor
92   	    TAxis         fZaxis;           //Z axis descriptor
93   	    Short_t       fBarOffset;       //(1000*offset) for bar charts or legos
94   	    Short_t       fBarWidth;        //(1000*width) for bar charts or legos
95   	    Double_t      fEntries;         //Number of entries
96   	    Double_t      fTsumw;           //Total Sum of weights
97   	    Double_t      fTsumw2;          //Total Sum of squares of weights
98   	    Double_t      fTsumwx;          //Total Sum of weight*X
99   	    Double_t      fTsumwx2;         //Total Sum of weight*X*X
100  	    Double_t      fMaximum;         //Maximum value for plotting
101  	    Double_t      fMinimum;         //Minimum value for plotting
102  	    Double_t      fNormFactor;      //Normalization factor
103  	    TArrayD       fContour;         //Array to display contour levels
104  	    TArrayD       fSumw2;           //Array of sum of squares of weights
105  	    TString       fOption;          //histogram options
106  	    TList        *fFunctions;       //->Pointer to list of functions (fits and user)
107  	    Int_t         fBufferSize;      //fBuffer size
108  	    Double_t     *fBuffer;          //[fBufferSize] entry buffer
109  	    TDirectory   *fDirectory;       //!Pointer to directory holding this histogram
110  	    Int_t         fDimension;       //!Histogram dimension (1, 2 or 3 dim)
111  	    Double_t     *fIntegral;        //!Integral of bins used by GetRandom
112  	    TVirtualHistPainter *fPainter;  //!pointer to histogram painter
113  	    EBinErrorOpt  fBinStatErrOpt;   //option for bin statistical errors 
114  	    static Int_t  fgBufferSize;     //!default buffer size for automatic histograms
115  	    static Bool_t fgAddDirectory;   //!flag to add histograms to the directory
116  	    static Bool_t fgStatOverflows;  //!flag to use under/overflows in statistics
117  	    static Bool_t fgDefaultSumw2;   //!flag to call TH1::Sumw2 automatically at histogram creation time
118  	
119  	public:
120  	   static Int_t FitOptionsMake(Option_t *option, Foption_t &Foption);
121  	
122  	private:
123  	   Int_t   AxisChoice(Option_t *axis) const;
124  	   void    Build();
125  	
126  	   TH1& operator=(const TH1&); // Not implemented
127  	
128  	
129  	protected:
130  	   TH1();
131  	   TH1(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup);
132  	   TH1(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins);
133  	   TH1(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins);
134  	   virtual Int_t    BufferFill(Double_t x, Double_t w);
135  	   virtual Bool_t   FindNewAxisLimits(const TAxis* axis, const Double_t point, Double_t& newMin, Double_t &newMax);
136  	   virtual void     SavePrimitiveHelp(ostream &out, const char *hname, Option_t *option = "");
137  	   static Bool_t    RecomputeAxisLimits(TAxis& destAxis, const TAxis& anAxis);
138  	   static Bool_t    SameLimitsAndNBins(const TAxis& axis1, const TAxis& axis2);
139  	
140  	   virtual Double_t DoIntegral(Int_t ix1, Int_t ix2, Int_t iy1, Int_t iy2, Int_t iz1, Int_t iz2, Double_t & err, 
141  	                               Option_t * opt, Bool_t doerr = kFALSE) const;
142  	
143  	   virtual void     DoFillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride=1);
144  	
145  	   static bool CheckAxisLimits(const TAxis* a1, const TAxis* a2);
146  	   static bool CheckBinLimits(const TAxis* a1, const TAxis* a2);
147  	   static bool CheckBinLabels(const TAxis* a1, const TAxis* a2);
148  	   static bool CheckEqualAxes(const TAxis* a1, const TAxis* a2);
149  	   static bool CheckConsistentSubAxes(const TAxis *a1, Int_t firstBin1, Int_t lastBin1, const TAxis *a2, Int_t firstBin2=0, Int_t lastBin2=0);
150  	   static bool CheckConsistency(const TH1* h1, const TH1* h2);
151  	
152  	public:
153  	   // TH1 status bits
154  	   enum {
155  	      kNoStats     = BIT(9),  // don't draw stats box
156  	      kUserContour = BIT(10), // user specified contour levels
157  	      kCanRebin    = BIT(11), // can rebin axis
158  	      kLogX        = BIT(15), // X-axis in log scale
159  	      kIsZoomed    = BIT(16), // bit set when zooming on Y axis
160  	      kNoTitle     = BIT(17), // don't draw the histogram title
161  	      kIsAverage   = BIT(18)  // Bin contents are average (used by Add)
162  	   };
163  	   // size of statistics data (size of  array used in GetStats()/ PutStats ) 
164  	   // s[0]  = sumw       s[1]  = sumw2
165  	   // s[2]  = sumwx      s[3]  = sumwx2                     
166  	   // s[4]  = sumwy      s[5]  = sumwy2   s[6]  = sumwxy
167  	   // s[7]  = sumwz      s[8]  = sumwz2   s[9]  = sumwxz   s[10]  = sumwyz  
168  	   // s[11] = sumwt      s[12] = sumwt2                 (11 and 12 used only by TProfile3D)
169  	   enum { 
170  	      kNstat       = 13  // size of statistics data (up to TProfile3D)
171  	   };
172  	
173  	
174  	
175  	   TH1(const TH1&);
176  	   virtual ~TH1();
177  	
178  	   virtual Bool_t   Add(TF1 *h1, Double_t c1=1, Option_t *option="");
179  	   virtual Bool_t   Add(const TH1 *h1, Double_t c1=1);
180  	   virtual Bool_t   Add(const TH1 *h, const TH1 *h2, Double_t c1=1, Double_t c2=1); // *MENU*
181  	   virtual void     AddBinContent(Int_t bin);
182  	   virtual void     AddBinContent(Int_t bin, Double_t w);
183  	   static  void     AddDirectory(Bool_t add=kTRUE);
184  	   static  Bool_t   AddDirectoryStatus();
185  	   virtual void     Browse(TBrowser *b);
186  	   virtual Double_t Chi2Test(const TH1* h2, Option_t *option = "UU", Double_t *res = 0) const;
187  	   virtual Double_t Chi2TestX(const TH1* h2, Double_t &chi2, Int_t &ndf, Int_t &igood,Option_t *option = "UU",  Double_t *res = 0) const;
188  	   
189  	   virtual Double_t Chisquare(TF1 * f1, Option_t *option = "") const;
190  	   virtual Double_t ComputeIntegral(Bool_t onlyPositive = false);
191  	   virtual void     Copy(TObject &hnew) const;
192  	   virtual void     DirectoryAutoAdd(TDirectory *);
193  	   virtual Int_t    DistancetoPrimitive(Int_t px, Int_t py);
194  	   virtual Bool_t   Divide(TF1 *f1, Double_t c1=1);
195  	   virtual Bool_t   Divide(const TH1 *h1);
196  	   virtual Bool_t   Divide(const TH1 *h1, const TH1 *h2, Double_t c1=1, Double_t c2=1, Option_t *option=""); // *MENU*
197  	   virtual void     Draw(Option_t *option="");
198  	   virtual TH1     *DrawCopy(Option_t *option="") const;
199  	   virtual TH1     *DrawNormalized(Option_t *option="", Double_t norm=1) const;
200  	   virtual void     DrawPanel(); // *MENU*
201  	   virtual Int_t    BufferEmpty(Int_t action=0);
202  	   virtual void     Eval(TF1 *f1, Option_t *option="");
203  	   virtual void     ExecuteEvent(Int_t event, Int_t px, Int_t py);
204  	   virtual TH1     *FFT(TH1* h_output, Option_t *option);
205  	   virtual Int_t    Fill(Double_t x);
206  	   virtual Int_t    Fill(Double_t x, Double_t w);
207  	   virtual Int_t    Fill(const char *name, Double_t w);
208  	   virtual void     FillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride=1);
209  	   virtual void     FillN(Int_t, const Double_t *, const Double_t *, const Double_t *, Int_t) {;}
210  	   virtual void     FillRandom(const char *fname, Int_t ntimes=5000);
211  	   virtual void     FillRandom(TH1 *h, Int_t ntimes=5000);
212  	   virtual Int_t    FindBin(Double_t x, Double_t y=0, Double_t z=0);
213  	   virtual Int_t    FindFixBin(Double_t x, Double_t y=0, Double_t z=0) const;
214  	   virtual Int_t    FindFirstBinAbove(Double_t threshold=0, Int_t axis=1) const;
215  	   virtual Int_t    FindLastBinAbove (Double_t threshold=0, Int_t axis=1) const;
216  	   virtual TObject *FindObject(const char *name) const;
217  	   virtual TObject *FindObject(const TObject *obj) const;
218  	   virtual TFitResultPtr    Fit(const char *formula ,Option_t *option="" ,Option_t *goption="", Double_t xmin=0, Double_t xmax=0); // *MENU*
219  	   virtual TFitResultPtr    Fit(TF1 *f1 ,Option_t *option="" ,Option_t *goption="", Double_t xmin=0, Double_t xmax=0);
220  	   virtual void     FitPanel(); // *MENU*
221  	   TH1             *GetAsymmetry(TH1* h2, Double_t c2=1, Double_t dc2=0);
222  	   Int_t            GetBufferLength() const {return fBuffer ? (Int_t)fBuffer[0] : 0;}
223  	   Int_t            GetBufferSize  () const {return fBufferSize;}
224  	   const   Double_t *GetBuffer() const {return fBuffer;}
225  	   static  Int_t    GetDefaultBufferSize();
226  	   virtual Double_t *GetIntegral();
227  	   TH1             *GetCumulative(Bool_t forward = kTRUE, const char* suffix = "_cumulative") const;
228  	
229  	   TList           *GetListOfFunctions() const { return fFunctions; }
230  	
231  	   virtual Int_t    GetNdivisions(Option_t *axis="X") const;
232  	   virtual Color_t  GetAxisColor(Option_t *axis="X") const;
233  	   virtual Color_t  GetLabelColor(Option_t *axis="X") const;
234  	   virtual Style_t  GetLabelFont(Option_t *axis="X") const;
235  	   virtual Float_t  GetLabelOffset(Option_t *axis="X") const;
236  	   virtual Float_t  GetLabelSize(Option_t *axis="X") const;
237  	   virtual Style_t  GetTitleFont(Option_t *axis="X") const;
238  	   virtual Float_t  GetTitleOffset(Option_t *axis="X") const;
239  	   virtual Float_t  GetTitleSize(Option_t *axis="X") const;
240  	   virtual Float_t  GetTickLength(Option_t *axis="X") const;
241  	   virtual Float_t  GetBarOffset() const {return Float_t(0.001*Float_t(fBarOffset));}
242  	   virtual Float_t  GetBarWidth() const  {return Float_t(0.001*Float_t(fBarWidth));}
243  	   virtual Int_t    GetContour(Double_t *levels=0);
244  	   virtual Double_t GetContourLevel(Int_t level) const;
245  	   virtual Double_t GetContourLevelPad(Int_t level) const;
246  	
247  	   virtual Int_t    GetBin(Int_t binx, Int_t biny=0, Int_t binz=0) const;
248  	   virtual void     GetBinXYZ(Int_t binglobal, Int_t &binx, Int_t &biny, Int_t &binz) const;
249  	   virtual Double_t GetBinCenter(Int_t bin) const;
250  	   virtual Double_t GetBinContent(Int_t bin) const;
251  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny) const;
252  	   virtual Double_t GetBinContent(Int_t binx, Int_t biny, Int_t binz) const;
253  	   virtual Double_t GetBinError(Int_t bin) const;
254  	   virtual Double_t GetBinError(Int_t binx, Int_t biny) const;
255  	   virtual Double_t GetBinError(Int_t binx, Int_t biny, Int_t binz) const;
256  	   virtual Double_t GetBinErrorLow(Int_t bin) const;
257  	   virtual Double_t GetBinErrorUp(Int_t bin) const;
258  	   virtual EBinErrorOpt  GetBinErrorOption() const { return fBinStatErrOpt; }
259  	   virtual Double_t GetBinLowEdge(Int_t bin) const;
260  	   virtual Double_t GetBinWidth(Int_t bin) const;
261  	   virtual Double_t GetBinWithContent(Double_t c, Int_t &binx, Int_t firstx=0, Int_t lastx=0,Double_t maxdiff=0) const;
262  	   virtual Double_t GetCellContent(Int_t binx, Int_t biny) const;
263  	   virtual Double_t GetCellError(Int_t binx, Int_t biny) const;
264  	   virtual void     GetCenter(Double_t *center) const;
265  	   static  Bool_t   GetDefaultSumw2();
266  	   TDirectory      *GetDirectory() const {return fDirectory;}
267  	   virtual Double_t GetEntries() const;
268  	   virtual Double_t GetEffectiveEntries() const;
269  	   virtual TF1     *GetFunction(const char *name) const;
270  	   virtual Int_t    GetDimension() const { return fDimension; }
271  	   virtual Double_t GetKurtosis(Int_t axis=1) const;
272  	   virtual void     GetLowEdge(Double_t *edge) const;
273  	   virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const;
274  	   virtual Int_t    GetMaximumBin() const;
275  	   virtual Int_t    GetMaximumBin(Int_t &locmax, Int_t &locmay, Int_t &locmaz) const;
276  	   virtual Double_t GetMaximumStored() const {return fMaximum;}
277  	   virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const;
278  	   virtual Int_t    GetMinimumBin() const;
279  	   virtual Int_t    GetMinimumBin(Int_t &locmix, Int_t &locmiy, Int_t &locmiz) const;
280  	   virtual Double_t GetMinimumStored() const {return fMinimum;}
281  	   virtual Double_t GetMean(Int_t axis=1) const;
282  	   virtual Double_t GetMeanError(Int_t axis=1) const;
283  	   virtual Int_t    GetNbinsX() const {return fXaxis.GetNbins();}
284  	   virtual Int_t    GetNbinsY() const {return fYaxis.GetNbins();}
285  	   virtual Int_t    GetNbinsZ() const {return fZaxis.GetNbins();}
286  	   virtual Double_t GetNormFactor() const {return fNormFactor;}
287  	   virtual char    *GetObjectInfo(Int_t px, Int_t py) const;
288  	   Option_t        *GetOption() const {return fOption.Data();}
289  	
290  	   TVirtualHistPainter *GetPainter(Option_t *option="");
291  	
292  	   virtual Int_t    GetQuantiles(Int_t nprobSum, Double_t *q, const Double_t *probSum=0);
293  	   virtual Double_t GetRandom() const;
294  	   virtual void     GetStats(Double_t *stats) const;
295  	           Double_t GetStdDev(Int_t axis=1) const { return GetRMS(axis); }                  
296  	           Double_t GetStdDevError(Int_t axis=1) const { return GetRMSError(axis); }
297  	   virtual Double_t GetSumOfWeights() const;
298  	   virtual TArrayD *GetSumw2() {return &fSumw2;}
299  	   virtual const TArrayD *GetSumw2() const {return &fSumw2;}
300  	   virtual Int_t    GetSumw2N() const {return fSumw2.fN;}
301  	   virtual Double_t GetRMS(Int_t axis=1) const;
302  	   virtual Double_t GetRMSError(Int_t axis=1) const;
303  	   virtual Double_t GetSkewness(Int_t axis=1) const;
304  	           TAxis   *GetXaxis() const;
305  	           TAxis   *GetYaxis() const;
306  	           TAxis   *GetZaxis() const;
307  	   virtual Double_t Integral(Option_t *option="") const;
308  	   virtual Double_t Integral(Int_t binx1, Int_t binx2, Option_t *option="") const;
309  	   virtual Double_t IntegralAndError(Int_t binx1, Int_t binx2, Double_t & err, Option_t *option="") const;
310  	   virtual Double_t Interpolate(Double_t x);
311  	   virtual Double_t Interpolate(Double_t x, Double_t y);
312  	   virtual Double_t Interpolate(Double_t x, Double_t y, Double_t z);
313  	           Bool_t   IsBinOverflow(Int_t bin) const;
314  	           Bool_t   IsBinUnderflow(Int_t bin) const;
315  	   virtual Double_t AndersonDarlingTest(const TH1 *h2, Option_t *option="") const;
316  	   virtual Double_t AndersonDarlingTest(const TH1 *h2, Double_t &advalue) const;
317  	   virtual Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const;
318  	   virtual void     LabelsDeflate(Option_t *axis="X");
319  	   virtual void     LabelsInflate(Option_t *axis="X");
320  	   virtual void     LabelsOption(Option_t *option="h", Option_t *axis="X");
321  	   virtual Long64_t Merge(TCollection *list);
322  	   virtual Bool_t   Multiply(TF1 *h1, Double_t c1=1);
323  	   virtual Bool_t   Multiply(const TH1 *h1);
324  	   virtual Bool_t   Multiply(const TH1 *h1, const TH1 *h2, Double_t c1=1, Double_t c2=1, Option_t *option=""); // *MENU*
325  	   virtual void     Paint(Option_t *option="");
326  	   virtual void     Print(Option_t *option="") const;
327  	   virtual void     PutStats(Double_t *stats);
328  	   virtual TH1     *Rebin(Int_t ngroup=2, const char*newname="", const Double_t *xbins=0);  // *MENU*
329  	   virtual TH1     *RebinX(Int_t ngroup=2, const char*newname="") { return Rebin(ngroup,newname, (Double_t*) 0); }
330  	   virtual void     RebinAxis(Double_t x, TAxis *axis);
331  	   virtual void     Rebuild(Option_t *option="");
332  	   virtual void     RecursiveRemove(TObject *obj);
333  	   virtual void     Reset(Option_t *option="");
334  	   virtual void     ResetStats();
335  	   virtual void     SavePrimitive(ostream &out, Option_t *option = "");
336  	   virtual void     Scale(Double_t c1=1, Option_t *option="");
337  	   virtual void     SetAxisColor(Color_t color=1, Option_t *axis="X");
338  	   virtual void     SetAxisRange(Double_t xmin, Double_t xmax, Option_t *axis="X");
339  	   virtual void     SetBarOffset(Float_t offset=0.25) {fBarOffset = Short_t(1000*offset);}
340  	   virtual void     SetBarWidth(Float_t width=0.5) {fBarWidth = Short_t(1000*width);}
341  	   virtual void     SetBinContent(Int_t bin, Double_t content);
342  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Double_t content);
343  	   virtual void     SetBinContent(Int_t binx, Int_t biny, Int_t binz, Double_t content);
344  	   virtual void     SetBinError(Int_t bin, Double_t error);
345  	   virtual void     SetBinError(Int_t binx, Int_t biny, Double_t error);
346  	   virtual void     SetBinError(Int_t binx, Int_t biny, Int_t binz, Double_t error);
347  	   virtual void     SetBins(Int_t nx, Double_t xmin, Double_t xmax);
348  	   virtual void     SetBins(Int_t nx, const Double_t *xBins);
349  	   virtual void     SetBins(Int_t nx, Double_t xmin, Double_t xmax, Int_t ny, Double_t ymin, Double_t ymax);
350  	   virtual void     SetBins(Int_t nx, const Double_t *xBins, Int_t ny, const Double_t *yBins);
351  	   virtual void     SetBins(Int_t nx, Double_t xmin, Double_t xmax, Int_t ny, Double_t ymin, Double_t ymax,
352  	                            Int_t nz, Double_t zmin, Double_t zmax);
353  	   virtual void     SetBins(Int_t nx, const Double_t *xBins, Int_t ny, const Double_t * yBins, Int_t nz,
354  	                            const Double_t *zBins);
355  	   virtual void     SetBinsLength(Int_t = -1) { } //redefined in derived classes
356  	   virtual void     SetBinErrorOption(EBinErrorOpt type) { fBinStatErrOpt = type; }
357  	   virtual void     SetBuffer(Int_t buffersize, Option_t *option="");
358  	   virtual void     SetCellContent(Int_t binx, Int_t biny, Double_t content);
359  	   virtual void     SetCellError(Int_t binx, Int_t biny, Double_t content);
360  	   virtual void     SetContent(const Double_t *content);
361  	   virtual void     SetContour(Int_t nlevels, const Double_t *levels=0);
362  	   virtual void     SetContourLevel(Int_t level, Double_t value);
363  	   static  void     SetDefaultBufferSize(Int_t buffersize=1000);
364  	   static  void     SetDefaultSumw2(Bool_t sumw2=kTRUE);
365  	   virtual void     SetDirectory(TDirectory *dir);
366  	   virtual void     SetEntries(Double_t n) {fEntries = n;};
367  	   virtual void     SetError(const Double_t *error);
368  	   virtual void     SetLabelColor(Color_t color=1, Option_t *axis="X");
369  	   virtual void     SetLabelFont(Style_t font=62, Option_t *axis="X");
370  	   virtual void     SetLabelOffset(Float_t offset=0.005, Option_t *axis="X");
371  	   virtual void     SetLabelSize(Float_t size=0.02, Option_t *axis="X");
372  	
373  	   virtual void     SetMaximum(Double_t maximum=-1111); // *MENU*
374  	   virtual void     SetMinimum(Double_t minimum=-1111); // *MENU*
375  	   virtual void     SetName(const char *name); // *MENU*
376  	   virtual void     SetNameTitle(const char *name, const char *title);
377  	   virtual void     SetNdivisions(Int_t n=510, Option_t *axis="X");
378  	   virtual void     SetNormFactor(Double_t factor=1) {fNormFactor = factor;}
379  	   virtual void     SetStats(Bool_t stats=kTRUE); // *MENU*
380  	   virtual void     SetOption(Option_t *option=" ") {fOption = option;}
381  	   virtual void     SetTickLength(Float_t length=0.02, Option_t *axis="X");
382  	   virtual void     SetTitleFont(Style_t font=62, Option_t *axis="X");
383  	   virtual void     SetTitleOffset(Float_t offset=1, Option_t *axis="X");
384  	   virtual void     SetTitleSize(Float_t size=0.02, Option_t *axis="X");
385  	   virtual void     SetTitle(const char *title);  // *MENU*
386  	   virtual void     SetXTitle(const char *title) {fXaxis.SetTitle(title);}
387  	   virtual void     SetYTitle(const char *title) {fYaxis.SetTitle(title);}
388  	   virtual void     SetZTitle(const char *title) {fZaxis.SetTitle(title);}
389  	   virtual TH1     *ShowBackground(Int_t niter=20, Option_t *option="same"); // *MENU*
390  	   virtual Int_t    ShowPeaks(Double_t sigma=2, Option_t *option="", Double_t threshold=0.05); // *MENU*
391  	   virtual void     Smooth(Int_t ntimes=1, Option_t *option=""); // *MENU*
392  	   static  void     SmoothArray(Int_t NN, Double_t *XX, Int_t ntimes=1);
393  	   static  void     StatOverflows(Bool_t flag=kTRUE);
394  	   virtual void     Sumw2(Bool_t flag = kTRUE);
395  	   void             UseCurrentStyle();
396  	   static  TH1     *TransformHisto(TVirtualFFT *fft, TH1* h_output,  Option_t *option);
397  	
398  	   ClassDef(TH1,7)  //1-Dim histogram base class
399  	};
400  	
401  	//________________________________________________________________________
402  	
403  	class TH1C : public TH1, public TArrayC {
404  	
405  	public:
406  	   TH1C();
407  	   TH1C(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup);
408  	   TH1C(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins);
409  	   TH1C(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins);
410  	   TH1C(const TH1C &h1c);
411  	   virtual ~TH1C();
412  	
413  	   virtual void     AddBinContent(Int_t bin);
414  	   virtual void     AddBinContent(Int_t bin, Double_t w);
415  	   virtual void     Copy(TObject &hnew) const;
416  	   virtual TH1     *DrawCopy(Option_t *option="") const;
417  	   virtual Double_t GetBinContent(Int_t bin) const;
418  	   virtual Double_t GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
419  	   virtual Double_t GetBinContent(Int_t bin, Int_t, Int_t) const {return GetBinContent(bin);}
420  	   virtual void     Reset(Option_t *option="");
421  	   virtual void     SetBinContent(Int_t bin, Double_t content);
422  	   virtual void     SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
423  	   virtual void     SetBinContent(Int_t bin, Int_t, Int_t, Double_t content) {SetBinContent(bin,content);}
424  	   virtual void     SetBinsLength(Int_t n=-1);
425  	           TH1C&    operator=(const TH1C &h1);
426  	   friend  TH1C     operator*(Double_t c1, const TH1C &h1);
427  	   friend  TH1C     operator*(const TH1C &h1, Double_t c1);
428  	   friend  TH1C     operator+(const TH1C &h1, const TH1C &h2);
429  	   friend  TH1C     operator-(const TH1C &h1, const TH1C &h2);
430  	   friend  TH1C     operator*(const TH1C &h1, const TH1C &h2);
431  	   friend  TH1C     operator/(const TH1C &h1, const TH1C &h2);
432  	
433  	   ClassDef(TH1C,1)  //1-Dim histograms (one char per channel)
434  	};
435  	
436  	TH1C operator*(Double_t c1, const TH1C &h1);
437  	inline
438  	TH1C operator*(const TH1C &h1, Double_t c1) {return operator*(c1,h1);}
439  	TH1C operator+(const TH1C &h1, const TH1C &h2);
440  	TH1C operator-(const TH1C &h1, const TH1C &h2);
441  	TH1C operator*(const TH1C &h1, const TH1C &h2);
442  	TH1C operator/(const TH1C &h1, const TH1C &h2);
443  	
444  	//________________________________________________________________________
445  	
446  	class TH1S : public TH1, public TArrayS {
447  	
448  	public:
449  	   TH1S();
450  	   TH1S(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup);
451  	   TH1S(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins);
452  	   TH1S(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins);
453  	   TH1S(const TH1S &h1s);
454  	   virtual ~TH1S();
455  	
456  	   virtual void     AddBinContent(Int_t bin);
457  	   virtual void     AddBinContent(Int_t bin, Double_t w);
458  	   virtual void     Copy(TObject &hnew) const;
459  	   virtual TH1     *DrawCopy(Option_t *option="") const;
460  	   virtual Double_t GetBinContent(Int_t bin) const;
461  	   virtual Double_t GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
462  	   virtual Double_t GetBinContent(Int_t bin, Int_t, Int_t) const {return GetBinContent(bin);}
463  	   virtual void     Reset(Option_t *option="");
464  	   virtual void     SetBinContent(Int_t bin, Double_t content);
465  	   virtual void     SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
466  	   virtual void     SetBinContent(Int_t bin, Int_t, Int_t, Double_t content) {SetBinContent(bin,content);}
467  	   virtual void     SetBinsLength(Int_t n=-1);
468  	           TH1S&    operator=(const TH1S &h1);
469  	   friend  TH1S     operator*(Double_t c1, const TH1S &h1);
470  	   friend  TH1S     operator*(const TH1S &h1, Double_t c1);
471  	   friend  TH1S     operator+(const TH1S &h1, const TH1S &h2);
472  	   friend  TH1S     operator-(const TH1S &h1, const TH1S &h2);
473  	   friend  TH1S     operator*(const TH1S &h1, const TH1S &h2);
474  	   friend  TH1S     operator/(const TH1S &h1, const TH1S &h2);
475  	
476  	   ClassDef(TH1S,1)  //1-Dim histograms (one short per channel)
477  	};
478  	
479  	TH1S operator*(Double_t c1, const TH1S &h1);
480  	inline
481  	TH1S operator*(const TH1S &h1, Double_t c1) {return operator*(c1,h1);}
482  	TH1S operator+(const TH1S &h1, const TH1S &h2);
483  	TH1S operator-(const TH1S &h1, const TH1S &h2);
484  	TH1S operator*(const TH1S &h1, const TH1S &h2);
485  	TH1S operator/(const TH1S &h1, const TH1S &h2);
486  	
487  	//________________________________________________________________________
488  	
489  	class TH1I: public TH1, public TArrayI {
490  	
491  	public:
492  	   TH1I();
493  	   TH1I(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup);
494  	   TH1I(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins);
495  	   TH1I(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins);
496  	   TH1I(const TH1I &h1i);
497  	   virtual ~TH1I();
498  	
499  	   virtual void     AddBinContent(Int_t bin);
500  	   virtual void     AddBinContent(Int_t bin, Double_t w);
501  	   virtual void     Copy(TObject &hnew) const;
502  	   virtual TH1     *DrawCopy(Option_t *option="") const;
503  	   virtual Double_t GetBinContent(Int_t bin) const;
504  	   virtual Double_t GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
505  	   virtual Double_t GetBinContent(Int_t bin, Int_t, Int_t) const {return GetBinContent(bin);}
506  	   virtual void     Reset(Option_t *option="");
507  	   virtual void     SetBinContent(Int_t bin, Double_t content);
508  	   virtual void     SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
509  	   virtual void     SetBinContent(Int_t bin, Int_t, Int_t, Double_t content) {SetBinContent(bin,content);}
510  	   virtual void     SetBinsLength(Int_t n=-1);
511  	           TH1I&    operator=(const TH1I &h1);
512  	   friend  TH1I     operator*(Double_t c1, const TH1I &h1);
513  	   friend  TH1I     operator*(const TH1I &h1, Double_t c1);
514  	   friend  TH1I     operator+(const TH1I &h1, const TH1I &h2);
515  	   friend  TH1I     operator-(const TH1I &h1, const TH1I &h2);
516  	   friend  TH1I     operator*(const TH1I &h1, const TH1I &h2);
517  	   friend  TH1I     operator/(const TH1I &h1, const TH1I &h2);
518  	
519  	   ClassDef(TH1I,1)  //1-Dim histograms (one 32 bits integer per channel)
520  	};
521  	
522  	TH1I operator*(Double_t c1, const TH1I &h1);
523  	inline
524  	TH1I operator*(const TH1I &h1, Double_t c1) {return operator*(c1,h1);}
525  	TH1I operator+(const TH1I &h1, const TH1I &h2);
526  	TH1I operator-(const TH1I &h1, const TH1I &h2);
527  	TH1I operator*(const TH1I &h1, const TH1I &h2);
528  	TH1I operator/(const TH1I &h1, const TH1I &h2);
529  	
530  	//________________________________________________________________________
531  	
532  	class TH1F : public TH1, public TArrayF {
533  	
534  	public:
535  	   TH1F();
536  	   TH1F(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup);
537  	   TH1F(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins);
538  	   TH1F(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins);
539  	   TH1F(const TVectorF &v);
540  	   TH1F(const TH1F &h1f);
541  	   virtual ~TH1F();
542  	
543  	   virtual void     AddBinContent(Int_t bin) {++fArray[bin];}
544  	   virtual void     AddBinContent(Int_t bin, Double_t w)
545  	                                 {fArray[bin] += Float_t (w);}
546  	   virtual void     Copy(TObject &hnew) const;
547  	   virtual TH1     *DrawCopy(Option_t *option="") const;
548  	   virtual Double_t GetBinContent(Int_t bin) const;
549  	   virtual Double_t GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
550  	   virtual Double_t GetBinContent(Int_t bin, Int_t, Int_t) const {return GetBinContent(bin);}
551  	   virtual void     Reset(Option_t *option="");
552  	   virtual void     SetBinContent(Int_t bin, Double_t content);
553  	   virtual void     SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
554  	   virtual void     SetBinContent(Int_t bin, Int_t, Int_t, Double_t content) {SetBinContent(bin,content);}
555  	   virtual void     SetBinsLength(Int_t n=-1);
556  	           TH1F&    operator=(const TH1F &h1);
557  	   friend  TH1F     operator*(Double_t c1, const TH1F &h1);
558  	   friend  TH1F     operator*(const TH1F &h1, Double_t c1);
559  	   friend  TH1F     operator+(const TH1F &h1, const TH1F &h2);
560  	   friend  TH1F     operator-(const TH1F &h1, const TH1F &h2);
561  	   friend  TH1F     operator*(const TH1F &h1, const TH1F &h2);
562  	   friend  TH1F     operator/(const TH1F &h1, const TH1F &h2);
563  	
564  	   ClassDef(TH1F,1)  //1-Dim histograms (one float per channel)
565  	};
566  	
567  	TH1F operator*(Double_t c1, const TH1F &h1);
568  	inline
569  	TH1F operator*(const TH1F &h1, Double_t c1) {return operator*(c1,h1);}
570  	TH1F operator+(const TH1F &h1, const TH1F &h2);
571  	TH1F operator-(const TH1F &h1, const TH1F &h2);
572  	TH1F operator*(const TH1F &h1, const TH1F &h2);
573  	TH1F operator/(const TH1F &h1, const TH1F &h2);
574  	
575  	//________________________________________________________________________
576  	
577  	class TH1D : public TH1, public TArrayD {
578  	
579  	public:
580  	   TH1D();
581  	   TH1D(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup);
582  	   TH1D(const char *name,const char *title,Int_t nbinsx,const Float_t  *xbins);
583  	   TH1D(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins);
584  	   TH1D(const TVectorD &v);
585  	   TH1D(const TH1D &h1d);
586  	   virtual ~TH1D();
587  	
588  	   virtual void     AddBinContent(Int_t bin) {++fArray[bin];}
589  	   virtual void     AddBinContent(Int_t bin, Double_t w)
590  	                                 {fArray[bin] += Double_t (w);}
591  	   virtual void     Copy(TObject &hnew) const;
592  	   virtual TH1     *DrawCopy(Option_t *option="") const;
593  	   virtual Double_t GetBinContent(Int_t bin) const;
594  	   virtual Double_t GetBinContent(Int_t bin, Int_t) const {return GetBinContent(bin);}
595  	   virtual Double_t GetBinContent(Int_t bin, Int_t, Int_t) const {return GetBinContent(bin);}
596  	   virtual void     Reset(Option_t *option="");
597  	   virtual void     SetBinContent(Int_t bin, Double_t content);
598  	   virtual void     SetBinContent(Int_t bin, Int_t, Double_t content) {SetBinContent(bin,content);}
599  	   virtual void     SetBinContent(Int_t bin, Int_t, Int_t, Double_t content) {SetBinContent(bin,content);}
600  	   virtual void     SetBinsLength(Int_t n=-1);
601  	           TH1D&    operator=(const TH1D &h1);
602  	   friend  TH1D     operator*(Double_t c1, const TH1D &h1);
603  	   friend  TH1D     operator*(const TH1D &h1, Double_t c1);
604  	   friend  TH1D     operator+(const TH1D &h1, const TH1D &h2);
605  	   friend  TH1D     operator-(const TH1D &h1, const TH1D &h2);
606  	   friend  TH1D     operator*(const TH1D &h1, const TH1D &h2);
607  	   friend  TH1D     operator/(const TH1D &h1, const TH1D &h2);
608  	
609  	   ClassDef(TH1D,1)  //1-Dim histograms (one double per channel)
610  	};
611  	
612  	TH1D operator*(Double_t c1, const TH1D &h1);
613  	inline
614  	TH1D operator*(const TH1D &h1, Double_t c1) {return operator*(c1,h1);}
615  	TH1D operator+(const TH1D &h1, const TH1D &h2);
616  	TH1D operator-(const TH1D &h1, const TH1D &h2);
617  	TH1D operator*(const TH1D &h1, const TH1D &h2);
618  	TH1D operator/(const TH1D &h1, const TH1D &h2);
619  	
620  	   extern TH1 *R__H(Int_t hid);
621  	   extern TH1 *R__H(const char *hname);
622  	
623  	#endif
624