star-travex
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Profile3D.cxx
Go to the documentation of this file.
1 #include "StiRootIO/Profile3D.h"
2 
3 #include <iostream>
4 #include <exception>
5 #include "TH1.h"
6 #include "TH3.h"
7 #include "TMath.h"
8 #include "TROOT.h"
9 
10 
11 class DifferentNumberOfBins: public std::exception {};
12 class DifferentAxisLimits: public std::exception {};
13 class DifferentBinLimits: public std::exception {};
14 class DifferentLabels: public std::exception {};
15 
16 
18 
19 
20 Profile3D::Profile3D() : TProfile3D()
21 {
22 }
23 
24 
25 Profile3D::Profile3D(std::string name, std::string title, Int_t nbinsx, Double_t xlow, Double_t xup,
26  Int_t nbinsy, Double_t ylow, Double_t yup, Int_t nbinsz, Double_t zlow, Double_t zup,
27  std::string options) :
28  TProfile3D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup, nbinsz, zlow, zup, options.c_str()),
29  fBinCumulMode(fNcells)
30 {
31  fBinCumulMode.Reset(1);
32  SetOption(options.c_str());
33 }
34 
35 
37 {
38  fBinCumulMode.Reset(1);
39  fEntries++;
40 }
41 
42 
43 Int_t Profile3D::FillAsCumulative(Double_t x, Double_t y, Double_t z, Double_t t)
44 {
45  if (fBuffer) return BufferFill(x,y,z,t,1);
46 
47  Int_t bin,binx,biny,binz;
48 
49  if (fTmin != fTmax) {
50  if (t <fTmin || t> fTmax || TMath::IsNaN(t) ) return -1;
51  }
52 
53  binx =fXaxis.FindBin(x);
54  biny =fYaxis.FindBin(y);
55  binz =fZaxis.FindBin(z);
56  if (binx <0 || biny <0 || binz<0) return -1;
57  bin = GetBin(binx,biny,binz);
58  AddBinContent(bin, t);
59  fSumw2.fArray[bin] += (Double_t)t*t;
60 
61  // Increase the number of bin entries only if the CumulMode flag is set for this bin
62  // One has to ResetBinCumulMode to continue counting bin entries
63  if (fBinCumulMode.fArray[bin]) {
64  fBinEntries.fArray[bin] += 1;
65  fBinCumulMode.fArray[bin] = 0;
66  }
67 
68  if (fBinSumw2.fN) fBinSumw2.fArray[bin] += 1;
69  if (binx == 0 || binx > fXaxis.GetNbins()) {
70  if (!fgStatOverflows) return -1;
71  }
72  if (biny == 0 || biny > fYaxis.GetNbins()) {
73  if (!fgStatOverflows) return -1;
74  }
75  if (binz == 0 || binz > fZaxis.GetNbins()) {
76  if (!fgStatOverflows) return -1;
77  }
78 //printf("x=%g, y=%g, z=%g, t=%g, binx=%d, biny=%d, binz=%d, bin=%d\n",x,y,z,t,binx,biny,binz,bin);
79  ++fTsumw;
80  ++fTsumw2;
81  fTsumwx += x;
82  fTsumwx2 += x*x;
83  fTsumwy += y;
84  fTsumwy2 += y*y;
85  fTsumwxy += x*y;
86  fTsumwz += z;
87  fTsumwz2 += z*z;
88  fTsumwxz += x*z;
89  fTsumwyz += y*z;
90  fTsumwt += t;
91  fTsumwt2 += t*t;
92  return bin;
93 }
94 
95 
96 Profile2D *Profile3D::DoProjectProfile2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
97  bool originalRange, bool useUF, bool useOF) const
98 {
99  // internal method to project to a 2D Profile
100  // called from TH3::Project3DProfile but re-implemented in case of the TPRofile3D since what is done is different
101 
102  // Get the ranges where we will work.
103  Int_t ixmin = projX->GetFirst();
104  Int_t ixmax = projX->GetLast();
105  Int_t iymin = projY->GetFirst();
106  Int_t iymax = projY->GetLast();
107  if (ixmin == 0 && ixmax == 0) { ixmin = 1; ixmax = projX->GetNbins(); }
108  if (iymin == 0 && iymax == 0) { iymin = 1; iymax = projY->GetNbins(); }
109  Int_t nx = ixmax-ixmin+1;
110  Int_t ny = iymax-iymin+1;
111 
112  // Create the projected profiles
113  Profile2D *p2 = 0;
114  // Create always a new TProfile2D (not as in the case of TH3 projection)
115 
116  const TArrayD *xbins = projX->GetXbins();
117  const TArrayD *ybins = projY->GetXbins();
118  // assume all axis have variable bins or have fixed bins
119  if ( originalRange ) {
120  if (xbins->fN == 0 && ybins->fN == 0) {
121  p2 = new Profile2D(name,title,projY->GetNbins(),projY->GetXmin(),projY->GetXmax()
122  ,projX->GetNbins(),projX->GetXmin(),projX->GetXmax());
123  } else {
124  p2 = new Profile2D(name,title,projY->GetNbins(),&ybins->fArray[iymin-1],projX->GetNbins(),&xbins->fArray[ixmin-1]);
125  }
126  } else {
127  if (xbins->fN == 0 && ybins->fN == 0) {
128  p2 = new Profile2D(name,title,ny,projY->GetBinLowEdge(iymin),projY->GetBinUpEdge(iymax)
129  ,nx,projX->GetBinLowEdge(ixmin),projX->GetBinUpEdge(ixmax));
130  } else {
131  p2 = new Profile2D(name,title,ny,&ybins->fArray[iymin-1],nx,&xbins->fArray[ixmin-1]);
132  }
133  }
134 
135  // weights
136  bool useWeights = (fBinSumw2.fN != 0);
137  if (useWeights) p2->Sumw2();
138 
139  // make projection in a 3D first
140  H3D * h3dW = static_cast<H3D*>(ProjectionXYZ("h3temp-W","W"));
141  H3D * h3dN = static_cast<H3D*>(ProjectionXYZ("h3temp-N","B"));
142 
143  h3dW->SetDirectory(0); h3dN->SetDirectory(0);
144 
145  // note that h3dW is always a weighted histogram - so we need to compute error in the projection
146  TAxis * projX_hW = h3dW->GetXaxis();
147  TAxis * projX_hN = h3dN->GetXaxis();
148  if (projX == GetYaxis() ) { projX_hW = h3dW->GetYaxis(); projX_hN = h3dN->GetYaxis(); }
149  if (projX == GetZaxis() ) { projX_hW = h3dW->GetZaxis(); projX_hN = h3dN->GetZaxis(); }
150  TAxis * projY_hW = h3dW->GetYaxis();
151  TAxis * projY_hN = h3dN->GetYaxis();
152  if (projY == GetXaxis() ) { projY_hW = h3dW->GetXaxis(); projY_hN = h3dN->GetXaxis(); }
153  if (projY == GetZaxis() ) { projY_hW = h3dW->GetZaxis(); projY_hN = h3dN->GetZaxis(); }
154 
155  TH2D * h2W = Profile3D::DoProject2D(*h3dW, "htemp-W","",projX_hW, projY_hW, true, originalRange, useUF, useOF);
156  TH2D * h2N = Profile3D::DoProject2D(*h3dN, "htemp-N","",projX_hN, projY_hN, useWeights, originalRange, useUF, useOF);
157  h2W->SetDirectory(0); h2N->SetDirectory(0);
158 
159 
160  // fill the bin content
161  R__ASSERT( h2W->fN == p2->fN );
162  R__ASSERT( h2N->fN == p2->fN );
163  R__ASSERT( h2W->GetSumw2()->fN != 0); // h2W should always be a weighted histogram since h3dW is weighted
164  for (int i = 0; i < p2->fN ; ++i) {
165  //std::cout << " proj bin " << i << " " << h2W->fArray[i] << " " << h2N->fArray[i] << std::endl;
166  p2->fArray[i] = h2W->fArray[i]; // array of profile is sum of all values
167  p2->GetSumw2()->fArray[i] = h2W->GetSumw2()->fArray[i]; // array of content square of profile is weight square of the W projected histogram
168  p2->SetBinEntries(i, h2N->fArray[i] );
169  if (useWeights) p2->GetBinSumw2()->fArray[i] = h2N->GetSumw2()->fArray[i]; // sum of weight squares are stored to compute errors in h1N histogram
170  }
171  // delete the created histograms
172  delete h3dW;
173  delete h3dN;
174  delete h2W;
175  delete h2N;
176 
177  // Also we need to set the entries since they have not been correctly calculated during the projection
178  // we can only set them to the effective entries
179  p2->SetEntries( p2->GetEffectiveEntries() );
180 
181  return p2;
182 }
183 
184 
185 Profile2D *Profile3D::Project3DProfile(Option_t *option) const
186 {
187  // Project a 3-d histogram into a 2-d profile histograms depending
188  // on the option parameter
189  // option may contain a combination of the characters x,y,z
190  // option = "xy" return the x versus y projection into a TProfile2D histogram
191  // option = "yx" return the y versus x projection into a TProfile2D histogram
192  // option = "xz" return the x versus z projection into a TProfile2D histogram
193  // option = "zx" return the z versus x projection into a TProfile2D histogram
194  // option = "yz" return the y versus z projection into a TProfile2D histogram
195  // option = "zy" return the z versus y projection into a TProfile2D histogram
196  // NB: the notation "a vs b" means "a" vertical and "b" horizontal
197  //
198  // option = "o" original axis range of the target axes will be
199  // kept, but only bins inside the selected range will be filled.
200  //
201  // The projection is made for the selected bins only.
202  // To select a bin range along an axis, use TAxis::SetRange, eg
203  // h3.GetYaxis()->SetRange(23,56);
204  //
205  // NOTE 1: The generated histogram is named th3name + "_p" + option
206  // eg if the TH3* h histogram is named "myhist", then
207  // h->Project3D("xy"); produces a TProfile2D histogram named "myhist_pxy".
208  // The following sequence
209  // h->Project3DProfile("xy");
210  // h->Project3DProfile("xy2");
211  // will generate two TProfile2D histograms named "myhist_pxy" and "myhist_pxy2"
212  // So, passing additional characters in the option string one can customize the name.
213  //
214  // NOTE 2: If a profile of the same type already exists with compatible axes,
215  // the profile is reset and filled again with the projected contents of the TH3.
216  // In the case of axes incompatibility, an error is reported and a NULL pointer is returned.
217  //
218  // NOTE 3: The number of entries in the projected profile is estimated from the number of
219  // effective entries for all the cells included in the projection.
220  //
221  // NOTE 4: underflow/overflow are by default excluded from the projection
222  // (Note that this is a different default behavior compared to the projection to an histogram)
223  // To include the underflow and/or overflow use option "UF" and/or "OF"
224 
225  TString opt = option; opt.ToLower();
226  Int_t pcase = 0;
227  TString ptype;
228  if (opt.Contains("xy")) { pcase = 4; ptype = "xy"; }
229  if (opt.Contains("yx")) { pcase = 5; ptype = "yx"; }
230  if (opt.Contains("xz")) { pcase = 6; ptype = "xz"; }
231  if (opt.Contains("zx")) { pcase = 7; ptype = "zx"; }
232  if (opt.Contains("yz")) { pcase = 8; ptype = "yz"; }
233  if (opt.Contains("zy")) { pcase = 9; ptype = "zy"; }
234 
235  if (pcase == 0) {
236  Error("Project3D","No projection axis specified - return a NULL pointer");
237  return 0;
238  }
239  // do not remove ptype from opt to use later in the projected histo name
240 
241  Bool_t useUF = kFALSE;
242  if (opt.Contains("uf") ) {
243  useUF = kTRUE;
244  opt.Remove(opt.Index("uf"),2);
245  }
246  Bool_t useOF = kFALSE;
247  if (opt.Contains("of") ) {
248  useOF = kTRUE;
249  opt.Remove(opt.Index("of"),2);
250  }
251 
252  Bool_t originalRange = kFALSE;
253  if (opt.Contains('o') ) {
254  originalRange = kTRUE;
255  opt.Remove(opt.First("o"),1);
256  }
257 
258  // Create the projected profile
259  Profile2D *p2 = 0;
260  TString name = GetName();
261  TString title = GetTitle();
262  name += "_p"; name += opt; // opt may include a user defined name
263  title += " profile "; title += ptype; title += " projection";
264 
265  // Call the method with the specific projected axes.
266  switch (pcase) {
267  case 4:
268  // "xy"
269  p2 = DoProjectProfile2D(name, title, GetXaxis(), GetYaxis(), originalRange, useUF, useOF);
270  p2->GetYaxis()->SetTitle(GetXaxis()->GetTitle());
271  p2->GetXaxis()->SetTitle(GetYaxis()->GetTitle());
272  break;
273 
274  case 5:
275  // "yx"
276  p2 = DoProjectProfile2D(name, title, GetYaxis(), GetXaxis(), originalRange, useUF, useOF);
277  p2->GetYaxis()->SetTitle(GetYaxis()->GetTitle());
278  p2->GetXaxis()->SetTitle(GetXaxis()->GetTitle());
279  break;
280 
281  case 6:
282  // "xz"
283  p2 = DoProjectProfile2D(name, title, GetXaxis(), GetZaxis(), originalRange, useUF, useOF);
284  p2->GetYaxis()->SetTitle(GetXaxis()->GetTitle());
285  p2->GetXaxis()->SetTitle(GetZaxis()->GetTitle());
286  break;
287 
288  case 7:
289  // "zx"
290  p2 = DoProjectProfile2D(name, title, GetZaxis(), GetXaxis(), originalRange, useUF, useOF);
291  p2->GetYaxis()->SetTitle(GetZaxis()->GetTitle());
292  p2->GetXaxis()->SetTitle(GetXaxis()->GetTitle());
293  break;
294 
295  case 8:
296  // "yz"
297  p2 = DoProjectProfile2D(name, title, GetYaxis(), GetZaxis(), originalRange, useUF, useOF);
298  p2->GetYaxis()->SetTitle(GetYaxis()->GetTitle());
299  p2->GetXaxis()->SetTitle(GetZaxis()->GetTitle());
300  break;
301 
302  case 9:
303  // "zy"
304  p2 = DoProjectProfile2D(name, title, GetZaxis(), GetYaxis(), originalRange, useUF, useOF);
305  p2->GetYaxis()->SetTitle(GetZaxis()->GetTitle());
306  p2->GetXaxis()->SetTitle(GetYaxis()->GetTitle());
307  break;
308 
309  }
310 
311  return p2;
312 }
313 
314 
315 void Profile3D::Print(Option_t *option) const
316 {
317  // Print some global quantities for this histogram.
318  //
319  // If option "base" is given, number of bins and ranges are also printed
320  // If option "range" is given, bin contents and errors are also printed
321  // for all bins in the current range (default 1-->nbins)
322  // If option "all" is given, bin contents and errors are also printed
323  // for all bins including under and overflows.
324 
325  printf( "TH1.Print Name = %s, Entries= %d, Total sum= %g\n",GetName(),Int_t(fEntries),GetSumOfWeights());
326  TString opt = option;
327  opt.ToLower();
328  Int_t all;
329  if (opt.Contains("all")) all = 0;
330  else if (opt.Contains("range")) all = 1;
331  else if (opt.Contains("base")) all = 2;
332  else return;
333 
334  Int_t bin, binx, biny, binz;
335  Int_t firstx=0,lastx=0,firsty=0,lasty=0,firstz=0,lastz=0;
336  if (all == 0) {
337  lastx = fXaxis.GetNbins()+1;
338  if (fDimension > 1) lasty = fYaxis.GetNbins()+1;
339  if (fDimension > 2) lastz = fZaxis.GetNbins()+1;
340  } else {
341  firstx = fXaxis.GetFirst(); lastx = fXaxis.GetLast();
342  if (fDimension > 1) {firsty = fYaxis.GetFirst(); lasty = fYaxis.GetLast();}
343  if (fDimension > 2) {firstz = fZaxis.GetFirst(); lastz = fZaxis.GetLast();}
344  }
345 
346  if (all== 2) {
347  printf(" Title = %s\n", GetTitle());
348  printf(" NbinsX= %d, xmin= %g, xmax=%g", fXaxis.GetNbins(), fXaxis.GetXmin(), fXaxis.GetXmax());
349  if( fDimension > 1) printf(", NbinsY= %d, ymin= %g, ymax=%g", fYaxis.GetNbins(), fYaxis.GetXmin(), fYaxis.GetXmax());
350  if( fDimension > 2) printf(", NbinsZ= %d, zmin= %g, zmax=%g", fZaxis.GetNbins(), fZaxis.GetXmin(), fZaxis.GetXmax());
351  printf("\n");
352  return;
353  }
354 
355  Double_t w,e;
356  Double_t x,y,z;
357  if (fDimension == 1) {
358  for (binx=firstx;binx<=lastx;binx++) {
359  x = fXaxis.GetBinCenter(binx);
360  w = RetrieveBinContent(binx);
361  e = GetBinError(binx);
362  if(fSumw2.fN) printf(" fSumw[%d]=%g, x=%g, error=%g\n",binx,w,x,e);
363  else printf(" fSumw[%d]=%g, x=%g\n",binx,w,x);
364  }
365  }
366  if (fDimension == 2) {
367  for (biny=firsty;biny<=lasty;biny++) {
368  y = fYaxis.GetBinCenter(biny);
369  for (binx=firstx;binx<=lastx;binx++) {
370  bin = GetBin(binx,biny,0);
371  x = fXaxis.GetBinCenter(binx);
372  w = RetrieveBinContent(bin);
373  e = GetBinError(bin);
374  if(fSumw2.fN) printf(" fSumw[%d][%d]=%g, x=%g, y=%g, error=%g\n",binx,biny,w,x,y,e);
375  else printf(" fSumw[%d][%d]=%g, x=%g, y=%g\n",binx,biny,w,x,y);
376  }
377  }
378  }
379  if (fDimension == 3) {
380  for (binz=firstz;binz<=lastz;binz++) {
381  z = fZaxis.GetBinCenter(binz);
382  for (biny=firsty;biny<=lasty;biny++) {
383  y = fYaxis.GetBinCenter(biny);
384  for (binx=firstx;binx<=lastx;binx++) {
385  bin = GetBin(binx,biny,binz);
386  x = fXaxis.GetBinCenter(binx);
387  w = RetrieveBinContent(bin);
388  e = GetBinError(bin);
389  int n = GetBinEntries(bin);
390  if (!w && !e) continue;
391  if(fSumw2.fN) printf(" fSumw[%d][%d][%d]=%g, x=%g, y=%g, z=%g, error=%g, n=%d\n",binx,biny,binz,w,x,y,z,e, n);
392  else printf(" fSumw[%d][%d][%d]=%g, x=%g, y=%g, z=%g\n",binx,biny,binz,w,x,y,z);
393  }
394  }
395  }
396  }
397 }
398 
399 
400 TH3D *Profile3D::ProjectionXYZ(const char *name, Option_t *option) const
401 {
402 //*-*-*-*-*Project this profile3D into a 3-D histogram along X,Y,Z*-*-*-*-*-*-*
403 //*-* =====================================================
404 //
405 // The projection is always of the type TH3D.
406 //
407 // if option "E" is specified, the errors are computed. (default)
408 // if option "B" is specified, the content of bin of the returned histogram
409 // will be equal to the GetBinEntries(bin) of the profile,
410 // if option "C=E" the bin contents of the projection are set to the
411 // bin errors of the profile
412 // if option "E" is specified the errors of the projected histogram are computed and set
413 // to be equal to the errors of the profile.
414 // Option "E" is defined as the default one in the header file.
415 // if option "" is specified the histogram errors are simply the sqrt of its content
416 // if option "B" is specified, the content of bin of the returned histogram
417 // will be equal to the GetBinEntries(bin) of the profile,
418 // if option "C=E" the bin contents of the projection are set to the
419 // bin errors of the profile
420 // if option "W" is specified the bin content of the projected histogram is set to the
421 // product of the bin content of the profile and the entries.
422 // With this option the returned histogram will be equivalent to the one obtained by
423 // filling directly a TH2D using the 3-rd value as a weight.
424 // This option makes sense only for profile filled with all weights =1.
425 // When the profile is weighted (filled with weights different than 1) the
426 // bin error of the projected histogram (obtained using this option "W") cannot be
427 // correctly computed from the information stored in the profile. In that case the
428 // obtained histogram contains as bin error square the weighted sum of the square of the
429 // profiled observable (TProfile2D::fSumw2[bin] )
430 
431 
432  TString opt = option;
433  opt.ToLower();
434  Int_t nx = fXaxis.GetNbins();
435  Int_t ny = fYaxis.GetNbins();
436  Int_t nz = fZaxis.GetNbins();
437  const TArrayD *xbins = fXaxis.GetXbins();
438  const TArrayD *ybins = fYaxis.GetXbins();
439  const TArrayD *zbins = fZaxis.GetXbins();
440 
441  // Create the projection histogram
442  TString pname = name;
443  if (pname == "_px") {
444  pname = GetName(); pname.Append("_pxyz");
445  }
446  TH3D *h1 = 0 ;
447  if (xbins->fN == 0 && ybins->fN == 0 && zbins->fN == 0)
448  h1 = new TH3D(pname,GetTitle(),nx,fXaxis.GetXmin(),fXaxis.GetXmax(),ny,fYaxis.GetXmin(),fYaxis.GetXmax(),nz,fZaxis.GetXmin(),fZaxis.GetXmax());
449  else if ( xbins->fN != 0 && ybins->fN != 0 && zbins->fN != 0)
450  h1 = new TH3D(pname,GetTitle(),nx,xbins->GetArray(),ny,ybins->GetArray(), nz,zbins->GetArray() );
451  else {
452  Error("ProjectionXYZ","Histogram has an axis with variable bins and an axis with fixed bins. This case is not cupported - return a null pointer");
453  return 0;
454  }
455 
456 
457  Bool_t computeErrors = kFALSE;
458  Bool_t cequalErrors = kFALSE;
459  Bool_t binEntries = kFALSE;
460  Bool_t binWeight = kFALSE;
461 
462  if (opt.Contains("b")) binEntries = kTRUE;
463  if (opt.Contains("e")) computeErrors = kTRUE;
464  if (opt.Contains("w")) binWeight = kTRUE;
465  if (opt.Contains("c=e")) {cequalErrors = kTRUE; computeErrors=kFALSE;}
466  if (computeErrors || binWeight || (binEntries && fBinSumw2.fN) ) h1->Sumw2();
467 
468  // Fill the projected histogram
469  Int_t bin,binx,biny,binz;
470  Double_t cont;
471  for (binx =0;binx<=nx+1;binx++) {
472  for (biny =0;biny<=ny+1;biny++) {
473  for (binz =0;binz<=nz+1;binz++) {
474  bin = GetBin(binx,biny,binz);
475 
476  if (binEntries) cont = GetBinEntries(bin);
477  else if (cequalErrors) cont = GetBinError(bin);
478  else if (binWeight) cont = GetBinContent(bin) * GetBinEntries(bin);
479  else cont = GetBinContent(bin); // default case
480 
481  h1->SetBinContent(bin ,cont);
482 
483  // if option E projected histogram errors are same as profile
484  if (computeErrors ) h1->SetBinError(bin , GetBinError(bin) );
485  // in case of option W bin error is deduced from bin sum of z**2 values of profile
486  // this is correct only if the profile is unweighted
487  if (binWeight) h1->GetSumw2()->fArray[bin] = fSumw2.fArray[bin];
488  // in case of bin entries and profile is weighted, we need to set also the bin error
489  if (binEntries && fBinSumw2.fN ) {
490  R__ASSERT( h1->GetSumw2() );
491  h1->GetSumw2()->fArray[bin] = fBinSumw2.fArray[bin];
492  }
493  }
494  }
495  }
496  h1->SetEntries(fEntries);
497  return h1;
498 }
Int_t FillAsCumulative(Double_t x, Double_t y, Double_t z, Double_t t)
Definition: Profile3D.cxx:43
Int_t ixmax
Definition: H3D.cxx:22
Definition: H3D.h:7
Profile2D * Project3DProfile(Option_t *option) const
Definition: Profile3D.cxx:185
static TH2D * DoProject2D(const H3D &h, const char *name, const char *title, TAxis *projX, TAxis *projY, bool computeErrors, bool originalRange, bool useUF, bool useOF)
Definition: Profile3D.h:30
TArrayC fBinCumulMode
Definition: Profile3D.h:38
R__ASSERT(refX!=0 &&refY!=0 &&refZ!=0)
ClassImp(Profile3D) Profile3D
Definition: Profile3D.cxx:17
Int_t nx
Definition: H3D.cxx:27
TH3D * ProjectionXYZ(const char *name, Option_t *option) const
Definition: Profile3D.cxx:400
virtual void Print(Option_t *option) const
Definition: Profile3D.cxx:315
void ResetBinCumulMode()
Definition: Profile3D.cxx:36
ClassImp(H3D) TH2D *H3D Int_t ixmin
Definition: H3D.cxx:21
Int_t ny
Definition: H3D.cxx:28
virtual Double_t RetrieveBinContent(Int_t bin) const
Definition: Profile3D.h:26
Int_t iymin
Definition: H3D.cxx:23
Int_t iymax
Definition: H3D.cxx:24
virtual Profile2D * DoProjectProfile2D(const char *name, const char *title, const TAxis *projX, const TAxis *projY, bool originalRange, bool useUF, bool useOF) const
Definition: Profile3D.cxx:96