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