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)
32 SetOption(options.c_str());
45 if (fBuffer)
return BufferFill(x,y,z,t,1);
47 Int_t bin,binx,biny,binz;
50 if (t <fTmin || t> fTmax || TMath::IsNaN(t) )
return -1;
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;
64 fBinEntries.fArray[bin] += 1;
68 if (fBinSumw2.fN) fBinSumw2.fArray[bin] += 1;
69 if (binx == 0 || binx > fXaxis.GetNbins()) {
70 if (!fgStatOverflows)
return -1;
72 if (biny == 0 || biny > fYaxis.GetNbins()) {
73 if (!fgStatOverflows)
return -1;
75 if (binz == 0 || binz > fZaxis.GetNbins()) {
76 if (!fgStatOverflows)
return -1;
97 bool originalRange,
bool useUF,
bool useOF)
const
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;
116 const TArrayD *xbins = projX->GetXbins();
117 const TArrayD *ybins = projY->GetXbins();
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());
124 p2 =
new Profile2D(name,title,projY->GetNbins(),&ybins->fArray[iymin-1],projX->GetNbins(),&xbins->fArray[ixmin-1]);
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));
131 p2 =
new Profile2D(name,title,ny,&ybins->fArray[iymin-1],nx,&xbins->fArray[ixmin-1]);
136 bool useWeights = (fBinSumw2.fN != 0);
137 if (useWeights) p2->Sumw2();
143 h3dW->SetDirectory(0); h3dN->SetDirectory(0);
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(); }
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);
164 for (
int i = 0; i < p2->fN ; ++i) {
166 p2->fArray[i] = h2W->fArray[i];
167 p2->GetSumw2()->fArray[i] = h2W->GetSumw2()->fArray[i];
168 p2->SetBinEntries(i, h2N->fArray[i] );
169 if (useWeights) p2->GetBinSumw2()->fArray[i] = h2N->GetSumw2()->fArray[i];
179 p2->SetEntries( p2->GetEffectiveEntries() );
225 TString opt = option; opt.ToLower();
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"; }
236 Error(
"Project3D",
"No projection axis specified - return a NULL pointer");
241 Bool_t useUF = kFALSE;
242 if (opt.Contains(
"uf") ) {
244 opt.Remove(opt.Index(
"uf"),2);
246 Bool_t useOF = kFALSE;
247 if (opt.Contains(
"of") ) {
249 opt.Remove(opt.Index(
"of"),2);
252 Bool_t originalRange = kFALSE;
253 if (opt.Contains(
'o') ) {
254 originalRange = kTRUE;
255 opt.Remove(opt.First(
"o"),1);
260 TString name = GetName();
261 TString title = GetTitle();
262 name +=
"_p"; name += opt;
263 title +=
" profile "; title += ptype; title +=
" projection";
269 p2 =
DoProjectProfile2D(name, title, GetXaxis(), GetYaxis(), originalRange, useUF, useOF);
270 p2->GetYaxis()->SetTitle(GetXaxis()->GetTitle());
271 p2->GetXaxis()->SetTitle(GetYaxis()->GetTitle());
276 p2 =
DoProjectProfile2D(name, title, GetYaxis(), GetXaxis(), originalRange, useUF, useOF);
277 p2->GetYaxis()->SetTitle(GetYaxis()->GetTitle());
278 p2->GetXaxis()->SetTitle(GetXaxis()->GetTitle());
283 p2 =
DoProjectProfile2D(name, title, GetXaxis(), GetZaxis(), originalRange, useUF, useOF);
284 p2->GetYaxis()->SetTitle(GetXaxis()->GetTitle());
285 p2->GetXaxis()->SetTitle(GetZaxis()->GetTitle());
290 p2 =
DoProjectProfile2D(name, title, GetZaxis(), GetXaxis(), originalRange, useUF, useOF);
291 p2->GetYaxis()->SetTitle(GetZaxis()->GetTitle());
292 p2->GetXaxis()->SetTitle(GetXaxis()->GetTitle());
297 p2 =
DoProjectProfile2D(name, title, GetYaxis(), GetZaxis(), originalRange, useUF, useOF);
298 p2->GetYaxis()->SetTitle(GetYaxis()->GetTitle());
299 p2->GetXaxis()->SetTitle(GetZaxis()->GetTitle());
304 p2 =
DoProjectProfile2D(name, title, GetZaxis(), GetYaxis(), originalRange, useUF, useOF);
305 p2->GetYaxis()->SetTitle(GetZaxis()->GetTitle());
306 p2->GetXaxis()->SetTitle(GetYaxis()->GetTitle());
325 printf(
"TH1.Print Name = %s, Entries= %d, Total sum= %g\n",GetName(),Int_t(fEntries),GetSumOfWeights());
326 TString opt = option;
329 if (opt.Contains(
"all")) all = 0;
330 else if (opt.Contains(
"range")) all = 1;
331 else if (opt.Contains(
"base")) all = 2;
334 Int_t bin, binx, biny, binz;
335 Int_t firstx=0,lastx=0,firsty=0,lasty=0,firstz=0,lastz=0;
337 lastx = fXaxis.GetNbins()+1;
338 if (fDimension > 1) lasty = fYaxis.GetNbins()+1;
339 if (fDimension > 2) lastz = fZaxis.GetNbins()+1;
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();}
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());
357 if (fDimension == 1) {
358 for (binx=firstx;binx<=lastx;binx++) {
359 x = fXaxis.GetBinCenter(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);
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);
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);
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);
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);
432 TString opt = option;
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();
442 TString pname = name;
443 if (pname ==
"_px") {
444 pname = GetName(); pname.Append(
"_pxyz");
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() );
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");
457 Bool_t computeErrors = kFALSE;
458 Bool_t cequalErrors = kFALSE;
459 Bool_t binEntries = kFALSE;
460 Bool_t binWeight = kFALSE;
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();
469 Int_t bin,binx,biny,binz;
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);
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);
481 h1->SetBinContent(bin ,cont);
484 if (computeErrors ) h1->SetBinError(bin , GetBinError(bin) );
487 if (binWeight) h1->GetSumw2()->fArray[bin] = fSumw2.fArray[bin];
489 if (binEntries && fBinSumw2.fN ) {
491 h1->GetSumw2()->fArray[bin] = fBinSumw2.fArray[bin];
496 h1->SetEntries(fEntries);
Int_t FillAsCumulative(Double_t x, Double_t y, Double_t z, Double_t t)
Profile2D * Project3DProfile(Option_t *option) const
static TH2D * DoProject2D(const H3D &h, const char *name, const char *title, TAxis *projX, TAxis *projY, bool computeErrors, bool originalRange, bool useUF, bool useOF)
R__ASSERT(refX!=0 &&refY!=0 &&refZ!=0)
ClassImp(Profile3D) Profile3D
TH3D * ProjectionXYZ(const char *name, Option_t *option) const
virtual void Print(Option_t *option) const
ClassImp(H3D) TH2D *H3D Int_t ixmin
virtual Double_t RetrieveBinContent(Int_t bin) const
virtual Profile2D * DoProjectProfile2D(const char *name, const char *title, const TAxis *projX, const TAxis *projY, bool originalRange, bool useUF, bool useOF) const