Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TH2Poly.h
Go to the documentation of this file.
1 // @(#)root/hist:$Id$
2 // Author: Olivier Couet, Deniz Gunceler
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_TH2Poly
13 #define ROOT_TH2Poly
14 
15 //////////////////////////////////////////////////////////////////////////
16 // //
17 // TH2Poly //
18 // //
19 // 2-Dim histogram with polygon bins //
20 // //
21 //////////////////////////////////////////////////////////////////////////
22 
23 #include "TH2.h"
24 
25 class TH2PolyBin: public TObject{
26 
27 public:
28  TH2PolyBin();
29  TH2PolyBin(TObject *poly, Int_t bin_number);
30  virtual ~TH2PolyBin();
31 
32  void ClearContent(){fContent = 0;}
33  void Fill(Double_t w) {fContent = fContent+w; SetChanged(true);}
34  Double_t GetArea();
35  Double_t GetContent() const{return fContent;}
36  Bool_t GetChanged() const{return fChanged;}
37  Int_t GetBinNumber() const {return fNumber;}
38  TObject *GetPolygon() const {return fPoly;}
39  Double_t GetXMax();
40  Double_t GetXMin();
41  Double_t GetYMax();
42  Double_t GetYMin();
43  Bool_t IsInside(Double_t x, Double_t y) const;
44  void SetChanged(Bool_t flag){fChanged = flag;}
45  void SetContent(Double_t content){fContent = content; SetChanged(true);}
46 
47 protected:
48  Bool_t fChanged; ///< For the 3D Painter
49  Int_t fNumber; ///< Bin number of the bin in TH2Poly
50  TObject *fPoly; ///< Object holding the polygon definition
51  Double_t fArea; ///< Bin area
52  Double_t fContent; ///< Bin content
53  Double_t fXmin; ///< X minimum value
54  Double_t fYmin; ///< Y minimum value
55  Double_t fXmax; ///< X maximum value
56  Double_t fYmax; ///< Y maximum value
57 
58  ClassDef(TH2PolyBin,1) //2-Dim polygon bins
59 };
60 
61 class TList;
62 class TGraph;
63 class TMultiGraph;
64 class TPad;
65 
66 class TH2Poly : public TH2 {
67 
68 public:
69  TH2Poly();
70  TH2Poly(const char *name,const char *title, Double_t xlow, Double_t xup, Double_t ylow, Double_t yup);
71  TH2Poly(const char *name,const char *title, Int_t nX, Double_t xlow, Double_t xup, Int_t nY, Double_t ylow, Double_t yup);
72  virtual ~TH2Poly();
73 
74  virtual TH2PolyBin *CreateBin(TObject *poly);
75  virtual Int_t AddBin(TObject *poly);
76  Int_t AddBin(Int_t n, const Double_t *x, const Double_t *y);
77  Int_t AddBin(Double_t x1, Double_t y1, Double_t x2, Double_t y2);
78  virtual Bool_t Add(const TH1 *h1, Double_t c1);
79  virtual Bool_t Add(const TH1 *h1, const TH1 *h2, Double_t c1=1, Double_t c2=1);
80  virtual Bool_t Add(TF1 *h1, Double_t c1=1, Option_t *option="");
81  void ClearBinContents(); // Clears the content of all bins
82  TObject *Clone(const char* newname = "") const;
83  void ChangePartition(Int_t n, Int_t m); // Sets the number of partition cells to another value
84  using TH2::Multiply;
85  using TH2::Divide;
86  using TH2::Interpolate;
87  virtual Bool_t Divide(TF1 *, Double_t);
88  virtual Bool_t Multiply(TF1 *, Double_t);
89  virtual Double_t ComputeIntegral(Bool_t);
90  virtual TH1 * FFT(TH1*, Option_t * );
91  virtual TH1 * GetAsymmetry(TH1* , Double_t, Double_t);
92  virtual Double_t Interpolate(Double_t, Double_t);
93  virtual Int_t Fill(Double_t x,Double_t y);
94  virtual Int_t Fill(Double_t x,Double_t y, Double_t w);
95  virtual Int_t Fill(const char* name, Double_t w);
96  void FillN(Int_t ntimes, const Double_t* x, const Double_t* y, const Double_t* w, Int_t stride = 1);
97  Int_t FindBin(Double_t x, Double_t y, Double_t z = 0);
98  TList *GetBins(){return fBins;} ///< Returns the TList of all bins in the histogram
99  virtual Double_t GetBinContent(Int_t bin) const;
100  Bool_t GetBinContentChanged() const{return fBinContentChanged;}
101  virtual Double_t GetBinError(Int_t bin) const;
102  const char *GetBinName(Int_t bin) const;
103  const char *GetBinTitle(Int_t bin) const;
104  Bool_t GetFloat(){return fFloat;}
105  Double_t GetMaximum() const;
106  Double_t GetMaximum(Double_t maxval) const;
107  Double_t GetMinimum() const;
108  Double_t GetMinimum(Double_t minval) const;
109  Bool_t GetNewBinAdded() const{return fNewBinAdded;}
110  Int_t GetNumberOfBins() const{return fNcells-kNOverflow;}
111  void Honeycomb(Double_t xstart, Double_t ystart, Double_t a, Int_t k, Int_t s);
112  Double_t Integral(Option_t* option = "") const;
113  Long64_t Merge(TCollection *);
114  virtual void Reset(Option_t *option);
115  virtual void Scale(Double_t c1 = 1, Option_t* option = "");
116  void SavePrimitive(std::ostream& out, Option_t* option = "");
117  virtual void SetBinContent(Int_t bin, Double_t content);
118  virtual void SetBinError(Int_t bin, Double_t error);
119  void SetBinContentChanged(Bool_t flag){fBinContentChanged = flag;}
120  void SetFloat(Bool_t flag = true);
121  void SetNewBinAdded(Bool_t flag){fNewBinAdded = flag;}
122  Bool_t IsInsideBin(Int_t binnr, Double_t x, Double_t y);
123  virtual void GetStats(Double_t *stats) const;
124 
125 
126 protected:
127 
128  //functions not to be used for TH2Poly
129 
130  Int_t Fill(Double_t){return -1;} //MayNotUse
131  Int_t Fill(Double_t , const char *, Double_t){return -1;} //MayNotUse
132  Int_t Fill(const char *, Double_t , Double_t ){return -1;} //MayNotUse
133  Int_t Fill(const char *, const char *, Double_t ){return -1;} //MayNotUse
134  void FillN(Int_t, const Double_t*, const Double_t*, Int_t){return;} //MayNotUse
135 
136  Double_t Integral(Int_t, Int_t, const Option_t*) const{return 0;} //MayNotUse
137  Double_t Integral(Int_t, Int_t, Int_t, Int_t, const Option_t*) const{return 0;} //MayNotUse
138  Double_t Integral(Int_t, Int_t, Int_t, Int_t, Int_t, Int_t, const Option_t*) const{return 0;} //MayNotUse
139 
140  virtual Double_t GetBinContent(Int_t, Int_t) const {return 0;} //MayNotUse
141  virtual Double_t GetBinContent(Int_t, Int_t, Int_t) const {return 0;} //MayNotUse
142 
143  virtual Double_t GetBinError(Int_t , Int_t) const {return 0;} //MayNotUse
144  virtual Double_t GetBinError(Int_t , Int_t , Int_t) const {return 0;} //MayNotUse
145 
146  virtual void SetBinContent(Int_t, Int_t, Double_t){} //MayNotUse
147  virtual void SetBinContent(Int_t, Int_t, Int_t, Double_t){} //MayNotUse
148  virtual void SetBinError(Int_t, Int_t, Double_t) {}
149  virtual void SetBinError(Int_t, Int_t, Int_t, Double_t) {}
150 
151 
152 protected:
153  enum {
154  kNOverflow = 9 /// Number of overflows bins
155  };
156  Double_t fOverflow[kNOverflow]; ///< Overflow bins
157  Int_t fCellX; ///< Number of partition cells in the x-direction of the histogram
158  Int_t fCellY; ///< Number of partition cells in the y-direction of the histogram
159  Int_t fNCells; ///< Number of partition cells: fCellX*fCellY
160  TList *fCells; ///<[fNCells] The array of TLists that store the bins that intersect with each cell. List do not own the contained objects
161  Double_t fStepX, fStepY; ///< Dimensions of a partition cell
162  Bool_t *fIsEmpty; ///<[fNCells] The array that returns true if the cell at the given coordinate is empty
163  Bool_t *fCompletelyInside; ///<[fNCells] The array that returns true if the cell at the given coordinate is completely inside a bin
164  Bool_t fFloat; ///< When set to kTRUE, allows the histogram to expand if a bin outside the limits is added.
165  Bool_t fNewBinAdded; ///<!For the 3D Painter
166  Bool_t fBinContentChanged; ///<!For the 3D Painter
167  TList *fBins; ///< List of bins. The list owns the contained objects
168 
169  void AddBinToPartition(TH2PolyBin *bin); // Adds the input bin into the partition matrix
170  void Initialize(Double_t xlow, Double_t xup, Double_t ylow, Double_t yup, Int_t n, Int_t m);
171  Bool_t IsIntersecting(TH2PolyBin *bin, Double_t xclipl, Double_t xclipr, Double_t yclipb, Double_t yclipt);
172  Bool_t IsIntersectingPolygon(Int_t bn, Double_t *x, Double_t *y, Double_t xclipl, Double_t xclipr, Double_t yclipb, Double_t yclipt);
173  // needed by TH1 - no need to have a separate implementation , but internal ibin=0 is first bin.
174  virtual Double_t RetrieveBinContent(Int_t bin) const {
175  return (bin>=kNOverflow) ? GetBinContent(bin-kNOverflow+1) : GetBinContent(-bin-1);
176  }
177  virtual void UpdateBinContent(Int_t bin, Double_t content) {
178  return (bin>=kNOverflow) ? SetBinContent(bin-kNOverflow+1,content) : SetBinContent(-bin-1,content);
179  }
180 
181  ClassDef(TH2Poly,3) //2-Dim histogram with polygon bins
182  };
183 
184 #endif