Logo ROOT   6.16/01
Reference Guide
TH2.cxx
Go to the documentation of this file.
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#include "TROOT.h"
13#include "TClass.h"
14#include "THashList.h"
15#include "TH2.h"
16#include "TVirtualPad.h"
17#include "TF2.h"
18#include "TProfile.h"
19#include "TRandom.h"
20#include "TMatrixFBase.h"
21#include "TMatrixDBase.h"
22#include "THLimitsFinder.h"
23#include "TError.h"
24#include "TMath.h"
25#include "TObjString.h"
26#include "TVirtualHistPainter.h"
27
28
30
31/** \addtogroup Hist
32@{
33\class TH2C
34\brief 2-D histogram with a byte per channel (see TH1 documentation)
35\class TH2S
36\brief 2-D histogram with a short per channel (see TH1 documentation)
37\class TH2I
38\brief 2-D histogram with an int per channel (see TH1 documentation)}
39\class TH2F
40\brief 2-D histogram with a float per channel (see TH1 documentation)}
41\class TH2D
42\brief 2-D histogram with a double per channel (see TH1 documentation)}
43@}
44*/
45
46/** \class TH2
47 Service class for 2-Dim histogram classes
48
49- TH2C a 2-D histogram with one byte per cell (char)
50- TH2S a 2-D histogram with two bytes per cell (short integer)
51- TH2I a 2-D histogram with four bytes per cell (32 bits integer)
52- TH2F a 2-D histogram with four bytes per cell (float)
53- TH2D a 2-D histogram with eight bytes per cell (double)
54*/
55
56
57////////////////////////////////////////////////////////////////////////////////
58/// Constructor.
59
61{
62 fDimension = 2;
63 fScalefactor = 1;
65}
66
67
68////////////////////////////////////////////////////////////////////////////////
69/// See comments in the TH1 base class constructors.
71TH2::TH2(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
72 ,Int_t nbinsy,Double_t ylow,Double_t yup)
73 :TH1(name,title,nbinsx,xlow,xup)
74{
75 fDimension = 2;
76 fScalefactor = 1;
77 fTsumwy = fTsumwy2 = fTsumwxy = 0;
78 if (nbinsy <= 0) {Warning("TH2","nbinsy is <=0 - set to nbinsy = 1"); nbinsy = 1; }
79 fYaxis.Set(nbinsy,ylow,yup);
80 fNcells = fNcells*(nbinsy+2); // fNCells is set in the TH1 constructor
81}
82
83
84////////////////////////////////////////////////////////////////////////////////
85/// See comments in the TH1 base class constructors.
86
87TH2::TH2(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
88 ,Int_t nbinsy,Double_t ylow,Double_t yup)
89 :TH1(name,title,nbinsx,xbins)
90{
91 fDimension = 2;
92 fScalefactor = 1;
94 if (nbinsy <= 0) {Warning("TH2","nbinsy is <=0 - set to nbinsy = 1"); nbinsy = 1; }
95 fYaxis.Set(nbinsy,ylow,yup);
96 fNcells = fNcells*(nbinsy+2); // fNCells is set in the TH1 constructor
97}
98
99
100////////////////////////////////////////////////////////////////////////////////
101/// See comments in the TH1 base class constructors.
102
103TH2::TH2(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
104 ,Int_t nbinsy,const Double_t *ybins)
105 :TH1(name,title,nbinsx,xlow,xup)
106{
107 fDimension = 2;
108 fScalefactor = 1;
109 fTsumwy = fTsumwy2 = fTsumwxy = 0;
110 if (nbinsy <= 0) {Warning("TH2","nbinsy is <=0 - set to nbinsy = 1"); nbinsy = 1; }
111 if (ybins) fYaxis.Set(nbinsy,ybins);
112 else fYaxis.Set(nbinsy,0,1);
113 fNcells = fNcells*(nbinsy+2); // fNCells is set in the TH1 constructor
114}
115
116
117////////////////////////////////////////////////////////////////////////////////
118/// See comments in the TH1 base class constructors.
119
120TH2::TH2(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
121 ,Int_t nbinsy,const Double_t *ybins)
122 :TH1(name,title,nbinsx,xbins)
123{
124 fDimension = 2;
125 fScalefactor = 1;
126 fTsumwy = fTsumwy2 = fTsumwxy = 0;
127 if (nbinsy <= 0) {Warning("TH2","nbinsy is <=0 - set to nbinsy = 1"); nbinsy = 1; }
128 if (ybins) fYaxis.Set(nbinsy,ybins);
129 else fYaxis.Set(nbinsy,0,1);
130 fNcells = fNcells*(nbinsy+2); // fNCells is set in the TH1 constructor
131}
132
133
134////////////////////////////////////////////////////////////////////////////////
135/// See comments in the TH1 base class constructors.
136
137TH2::TH2(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
138 ,Int_t nbinsy,const Float_t *ybins)
139 :TH1(name,title,nbinsx,xbins)
140{
141 fDimension = 2;
142 fScalefactor = 1;
143 fTsumwy = fTsumwy2 = fTsumwxy = 0;
144 if (nbinsy <= 0) {Warning("TH2","nbinsy is <=0 - set to nbinsy = 1"); nbinsy = 1; }
145 if (ybins) fYaxis.Set(nbinsy,ybins);
146 else fYaxis.Set(nbinsy,0,1);
147 fNcells = fNcells*(nbinsy+2); // fNCells is set in the TH1 constructor.
148}
149
150
151////////////////////////////////////////////////////////////////////////////////
152/// Copy constructor.
153/// The list of functions is not copied. (Use Clone if needed)
154
155TH2::TH2(const TH2 &h) : TH1()
156{
157 ((TH2&)h).Copy(*this);
158}
159
160
161////////////////////////////////////////////////////////////////////////////////
162/// Destructor.
163
165{
166}
167
168
169////////////////////////////////////////////////////////////////////////////////
170/// Fill histogram with all entries in the buffer.
171/// - action = -1 histogram is reset and refilled from the buffer (called by THistPainter::Paint)
172/// - action = 0 histogram is filled from the buffer
173/// - action = 1 histogram is filled and buffer is deleted
174/// The buffer is automatically deleted when the number of entries
175/// in the buffer is greater than the number of entries in the histogram
176
178{
179 // do we need to compute the bin size?
180 if (!fBuffer) return 0;
181 Int_t nbentries = (Int_t)fBuffer[0];
182
183 // nbentries correspond to the number of entries of histogram
184
185 if (nbentries == 0) return 0;
186 if (nbentries < 0 && action == 0) return 0; // case histogram has been already filled from the buffer
187
188 Double_t *buffer = fBuffer;
189 if (nbentries < 0) {
190 nbentries = -nbentries;
191 // a reset might call BufferEmpty() giving an infinite loop
192 // Protect it by setting fBuffer = 0
193 fBuffer=0;
194 //do not reset the list of functions
195 Reset("ICES");
196 fBuffer = buffer;
197 }
198
200 //find min, max of entries in buffer
201 Double_t xmin = fBuffer[2];
203 Double_t ymin = fBuffer[3];
205 for (Int_t i=1;i<nbentries;i++) {
206 Double_t x = fBuffer[3*i+2];
207 if (x < xmin) xmin = x;
208 if (x > xmax) xmax = x;
209 Double_t y = fBuffer[3*i+3];
210 if (y < ymin) ymin = y;
211 if (y > ymax) ymax = y;
212 }
213 if (fXaxis.GetXmax() <= fXaxis.GetXmin() || fYaxis.GetXmax() <= fYaxis.GetXmin()) {
215 } else {
216 fBuffer = 0;
217 Int_t keep = fBufferSize; fBufferSize = 0;
222 fBuffer = buffer;
223 fBufferSize = keep;
224 }
225 }
226
227 fBuffer = 0;
228 for (Int_t i=0;i<nbentries;i++) {
229 Fill(buffer[3*i+2],buffer[3*i+3],buffer[3*i+1]);
230 }
231 fBuffer = buffer;
232
233 if (action > 0) { delete [] fBuffer; fBuffer = 0; fBufferSize = 0;}
234 else {
235 if (nbentries == (Int_t)fEntries) fBuffer[0] = -nbentries;
236 else fBuffer[0] = 0;
237 }
238 return nbentries;
239}
240
241
242////////////////////////////////////////////////////////////////////////////////
243/// accumulate arguments in buffer. When buffer is full, empty the buffer
244/// ~~~ {.cpp}
245/// fBuffer[0] = number of entries in buffer
246/// fBuffer[1] = w of first entry
247/// fBuffer[2] = x of first entry
248/// fBuffer[3] = y of first entry
249/// ~~~
250
252{
253 if (!fBuffer) return -3;
254 Int_t nbentries = (Int_t)fBuffer[0];
255 if (nbentries < 0) {
256 nbentries = -nbentries;
257 fBuffer[0] = nbentries;
258 if (fEntries > 0) {
259 Double_t *buffer = fBuffer; fBuffer=0;
260 Reset("ICES");
261 fBuffer = buffer;
262 }
263 }
264 if (3*nbentries+3 >= fBufferSize) {
265 BufferEmpty(1);
266 return Fill(x,y,w);
267 }
268 fBuffer[3*nbentries+1] = w;
269 fBuffer[3*nbentries+2] = x;
270 fBuffer[3*nbentries+3] = y;
271 fBuffer[0] += 1;
272 return -3;
273}
274
275
276////////////////////////////////////////////////////////////////////////////////
277/// Copy.
278
279void TH2::Copy(TObject &obj) const
280{
281 TH1::Copy(obj);
282 ((TH2&)obj).fScalefactor = fScalefactor;
283 ((TH2&)obj).fTsumwy = fTsumwy;
284 ((TH2&)obj).fTsumwy2 = fTsumwy2;
285 ((TH2&)obj).fTsumwxy = fTsumwxy;
286}
287
288
289////////////////////////////////////////////////////////////////////////////////
290/// Invalid Fill method.
291
293{
294 Error("Fill", "Invalid signature - do nothing");
295 return -1;
296}
297
298
299////////////////////////////////////////////////////////////////////////////////
300/// Increment cell defined by x,y by 1.
301///
302/// - if x or/and y is less than the low-edge of the corresponding axis first bin,
303/// the Underflow cell is incremented.
304/// - if x or/and y is equal to or greater than the upper edge of corresponding axis last bin,
305/// the Overflow cell is incremented.
306///
307/// - If the storage of the sum of squares of weights has been triggered,
308/// via the function Sumw2, then the sum of the squares of weights is incremented
309/// by 1 in the cell corresponding to x,y.
310///
311/// The function returns the corresponding global bin number which has its content
312/// incremented by 1
313
315{
316 if (fBuffer) return BufferFill(x,y,1);
317
318 Int_t binx, biny, bin;
319 fEntries++;
320 binx = fXaxis.FindBin(x);
321 biny = fYaxis.FindBin(y);
322 if (binx <0 || biny <0) return -1;
323 bin = biny*(fXaxis.GetNbins()+2) + binx;
324 AddBinContent(bin);
325 if (fSumw2.fN) ++fSumw2.fArray[bin];
326 if (binx == 0 || binx > fXaxis.GetNbins()) {
327 if (!GetStatOverflowsBehaviour()) return -1;
328 }
329 if (biny == 0 || biny > fYaxis.GetNbins()) {
330 if (!GetStatOverflowsBehaviour()) return -1;
331 }
332 ++fTsumw;
333 ++fTsumw2;
334 fTsumwx += x;
335 fTsumwx2 += x*x;
336 fTsumwy += y;
337 fTsumwy2 += y*y;
338 fTsumwxy += x*y;
339 return bin;
340}
341
342
343////////////////////////////////////////////////////////////////////////////////
344/// Increment cell defined by x,y by a weight w.
345///
346/// - if x or/and y is less than the low-edge of the corresponding axis first bin,
347/// the Underflow cell is incremented.
348/// - if x or/and y is equal to or greater than the upper edge of corresponding axis last bin,
349/// the Overflow cell is incremented.
350///
351/// - If the weight is not equal to 1, the storage of the sum of squares of
352/// weights is automatically triggered and the sum of the squares of weights is incremented
353/// by w^2 in the bin corresponding to x,y
354///
355/// The function returns the corresponding global bin number which has its content
356/// incremented by w
357
359{
360 if (fBuffer) return BufferFill(x,y,w);
361
362 Int_t binx, biny, bin;
363 fEntries++;
364 binx = fXaxis.FindBin(x);
365 biny = fYaxis.FindBin(y);
366 if (binx <0 || biny <0) return -1;
367 bin = biny*(fXaxis.GetNbins()+2) + binx;
368 if (!fSumw2.fN && w != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2(); // must be called before AddBinContent
369 if (fSumw2.fN) fSumw2.fArray[bin] += w*w;
370 AddBinContent(bin,w);
371 if (binx == 0 || binx > fXaxis.GetNbins()) {
372 if (!GetStatOverflowsBehaviour()) return -1;
373 }
374 if (biny == 0 || biny > fYaxis.GetNbins()) {
375 if (!GetStatOverflowsBehaviour()) return -1;
376 }
377 Double_t z= w;
378 fTsumw += z;
379 fTsumw2 += z*z;
380 fTsumwx += z*x;
381 fTsumwx2 += z*x*x;
382 fTsumwy += z*y;
383 fTsumwy2 += z*y*y;
384 fTsumwxy += z*x*y;
385 return bin;
386}
387
388
389////////////////////////////////////////////////////////////////////////////////
390/// Increment cell defined by namex,namey by a weight w
391///
392/// - if x or/and y is less than the low-edge of the corresponding axis first bin,
393/// the Underflow cell is incremented.
394/// - if x or/and y is equal to or greater than the upper edge of corresponding axis last bin,
395/// the Overflow cell is incremented.
396///
397/// - If the weight is not equal to 1, the storage of the sum of squares of
398/// weights is automatically triggered and the sum of the squares of weights is incremented
399/// by w^2 in the bin corresponding to namex,namey
400///
401/// The function returns the corresponding global bin number which has its content
402/// incremented by w
403
404Int_t TH2::Fill(const char *namex, const char *namey, Double_t w)
405{
406 Int_t binx, biny, bin;
407 fEntries++;
408 binx = fXaxis.FindBin(namex);
409 biny = fYaxis.FindBin(namey);
410 if (binx <0 || biny <0) return -1;
411 bin = biny*(fXaxis.GetNbins()+2) + binx;
412 if (!fSumw2.fN && w != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2(); // must be called before AddBinContent
413 if (fSumw2.fN) fSumw2.fArray[bin] += w*w;
414 AddBinContent(bin,w);
415 if (binx == 0 || binx > fXaxis.GetNbins()) return -1;
416 if (biny == 0 || biny > fYaxis.GetNbins()) return -1;
419 Double_t z= w;
420 fTsumw += z;
421 fTsumw2 += z*z;
422 fTsumwx += z*x;
423 fTsumwx2 += z*x*x;
424 fTsumwy += z*y;
425 fTsumwy2 += z*y*y;
426 fTsumwxy += z*x*y;
427 return bin;
428}
429
430
431////////////////////////////////////////////////////////////////////////////////
432/// Increment cell defined by namex,y by a weight w
433///
434/// - if x or/and y is less than the low-edge of the corresponding axis first bin,
435/// the Underflow cell is incremented.
436/// - if x or/and y is equal to or greater than the upper edge of corresponding axis last bin,
437/// the Overflow cell is incremented.
438///
439/// - If the weight is not equal to 1, the storage of the sum of squares of
440/// weights is automatically triggered and the sum of the squares of weights is incremented
441/// by w^2 in the bin corresponding to namex,y
442///
443/// The function returns the corresponding global bin number which has its content
444/// incremented by w
445
446Int_t TH2::Fill(const char *namex, Double_t y, Double_t w)
447{
448 Int_t binx, biny, bin;
449 fEntries++;
450 binx = fXaxis.FindBin(namex);
451 biny = fYaxis.FindBin(y);
452 if (binx <0 || biny <0) return -1;
453 bin = biny*(fXaxis.GetNbins()+2) + binx;
454 if (!fSumw2.fN && w != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2(); // must be called before AddBinContent
455 if (fSumw2.fN) fSumw2.fArray[bin] += w*w;
456 AddBinContent(bin,w);
457 if (binx == 0 || binx > fXaxis.GetNbins()) return -1;
458 if (biny == 0 || biny > fYaxis.GetNbins()) {
459 if (!GetStatOverflowsBehaviour()) return -1;
460 }
462 Double_t z= w; //(w > 0 ? w : -w);
463 fTsumw += z;
464 fTsumw2 += z*z;
465 fTsumwx += z*x;
466 fTsumwx2 += z*x*x;
467 fTsumwy += z*y;
468 fTsumwy2 += z*y*y;
469 fTsumwxy += z*x*y;
470 return bin;
471}
472
473
474////////////////////////////////////////////////////////////////////////////////
475/// Increment cell defined by x,namey by a weight w
476///
477/// - if x or/and y is less than the low-edge of the corresponding axis first bin,
478/// the Underflow cell is incremented.
479/// - if x or/and y is equal to or greater than the upper edge of corresponding axis last bin,
480/// the Overflow cell is incremented.
481///
482/// - If the weight is not equal to 1, the storage of the sum of squares of
483/// weights is automatically triggered and the sum of the squares of weights is incremented
484/// by w^2 in the bin corresponding to x,y.
485///
486/// The function returns the corresponding global bin number which has its content
487/// incremented by w
488
489Int_t TH2::Fill(Double_t x, const char *namey, Double_t w)
490{
491 Int_t binx, biny, bin;
492 fEntries++;
493 binx = fXaxis.FindBin(x);
494 biny = fYaxis.FindBin(namey);
495 if (binx <0 || biny <0) return -1;
496 bin = biny*(fXaxis.GetNbins()+2) + binx;
497 if (!fSumw2.fN && w != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2(); // must be called before AddBinContent
498 if (fSumw2.fN) fSumw2.fArray[bin] += w*w;
499 AddBinContent(bin,w);
500 if (binx == 0 || binx > fXaxis.GetNbins()) {
501 if (!GetStatOverflowsBehaviour()) return -1;
502 }
503 if (biny == 0 || biny > fYaxis.GetNbins()) return -1;
505 Double_t z= w; //(w > 0 ? w : -w);
506 fTsumw += z;
507 fTsumw2 += z*z;
508 fTsumwx += z*x;
509 fTsumwx2 += z*x*x;
510 fTsumwy += z*y;
511 fTsumwy2 += z*y*y;
512 fTsumwxy += z*x*y;
513 return bin;
514}
515
516
517////////////////////////////////////////////////////////////////////////////////
518/// Fill a 2-D histogram with an array of values and weights.
519///
520/// - ntimes: number of entries in arrays x and w (array size must be ntimes*stride)
521/// - x: array of x values to be histogrammed
522/// - y: array of y values to be histogrammed
523/// - w: array of weights
524/// - stride: step size through arrays x, y and w
525///
526/// - If the weight is not equal to 1, the storage of the sum of squares of
527/// weights is automatically triggered and the sum of the squares of weights is incremented
528/// by w[i]^2 in the bin corresponding to x[i],y[i].
529/// - If w is NULL each entry is assumed a weight=1
530///
531/// NB: function only valid for a TH2x object
532
533void TH2::FillN(Int_t ntimes, const Double_t *x, const Double_t *y, const Double_t *w, Int_t stride)
534{
535 Int_t binx, biny, bin, i;
536 ntimes *= stride;
537 Int_t ifirst = 0;
538
539 //If a buffer is activated, fill buffer
540 // (note that this function must not be called from TH2::BufferEmpty)
541 if (fBuffer) {
542 for (i=0;i<ntimes;i+=stride) {
543 if (!fBuffer) break; // buffer can be deleted in BufferFill when is empty
544 if (w) BufferFill(x[i],y[i],w[i]);
545 else BufferFill(x[i], y[i], 1.);
546 }
547 // fill the remaining entries if the buffer has been deleted
548 if (i < ntimes && fBuffer==0)
549 ifirst = i;
550 else
551 return;
552 }
553
554 Double_t ww = 1;
555 for (i=ifirst;i<ntimes;i+=stride) {
556 fEntries++;
557 binx = fXaxis.FindBin(x[i]);
558 biny = fYaxis.FindBin(y[i]);
559 if (binx <0 || biny <0) continue;
560 bin = biny*(fXaxis.GetNbins()+2) + binx;
561 if (w) ww = w[i];
562 if (!fSumw2.fN && ww != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2();
563 if (fSumw2.fN) fSumw2.fArray[bin] += ww*ww;
564 AddBinContent(bin,ww);
565 if (binx == 0 || binx > fXaxis.GetNbins()) {
566 if (!GetStatOverflowsBehaviour()) continue;
567 }
568 if (biny == 0 || biny > fYaxis.GetNbins()) {
569 if (!GetStatOverflowsBehaviour()) continue;
570 }
571 Double_t z= ww; //(ww > 0 ? ww : -ww);
572 fTsumw += z;
573 fTsumw2 += z*z;
574 fTsumwx += z*x[i];
575 fTsumwx2 += z*x[i]*x[i];
576 fTsumwy += z*y[i];
577 fTsumwy2 += z*y[i]*y[i];
578 fTsumwxy += z*x[i]*y[i];
579 }
580}
581
582
583////////////////////////////////////////////////////////////////////////////////
584/// Fill histogram following distribution in function fname.
585///
586/// The distribution contained in the function fname (TF2) is integrated
587/// over the channel contents.
588/// It is normalized to 1.
589/// Getting one random number implies:
590/// - Generating a random number between 0 and 1 (say r1)
591/// - Look in which bin in the normalized integral r1 corresponds to
592/// - Fill histogram channel
593/// ntimes random numbers are generated
594///
595/// One can also call TF2::GetRandom2 to get a random variate from a function.
596
597void TH2::FillRandom(const char *fname, Int_t ntimes)
598{
599 Int_t bin, binx, biny, ibin, loop;
600 Double_t r1, x, y;
601 //*-*- Search for fname in the list of ROOT defined functions
602 TObject *fobj = gROOT->GetFunction(fname);
603 if (!fobj) { Error("FillRandom", "Unknown function: %s",fname); return; }
604 TF2 * f1 = dynamic_cast<TF2*>(fobj);
605 if (!f1) { Error("FillRandom", "Function: %s is not a TF2, is a %s",fname,fobj->IsA()->GetName()); return; }
606
607
608 TAxis & xAxis = fXaxis;
609 TAxis & yAxis = fYaxis;
610
611 // in case axes of histogram are not defined use the function axis
612 if (fXaxis.GetXmax() <= fXaxis.GetXmin() || fYaxis.GetXmax() <= fYaxis.GetXmin()) {
615 Info("FillRandom","Using function axis and range ([%g,%g],[%g,%g])",xmin, xmax,ymin,ymax);
616 xAxis = *(f1->GetHistogram()->GetXaxis());
617 yAxis = *(f1->GetHistogram()->GetYaxis());
618 }
619
620
621 // Allocate temporary space to store the integral and compute integral
622 Int_t nbinsx = xAxis.GetNbins();
623 Int_t nbinsy = yAxis.GetNbins();
624 Int_t nbins = nbinsx*nbinsy;
625
626
627 Double_t *integral = new Double_t[nbins+1];
628 ibin = 0;
629 integral[ibin] = 0;
630 for (biny=1;biny<=nbinsy;biny++) {
631 for (binx=1;binx<=nbinsx;binx++) {
632 ibin++;
633 Double_t fint = f1->Integral(xAxis.GetBinLowEdge(binx), xAxis.GetBinUpEdge(binx), yAxis.GetBinLowEdge(biny), yAxis.GetBinUpEdge(biny));
634 integral[ibin] = integral[ibin-1] + fint;
635 }
636 }
637
638 // Normalize integral to 1
639 if (integral[nbins] == 0 ) {
640 delete [] integral;
641 Error("FillRandom", "Integral = zero"); return;
642 }
643 for (bin=1;bin<=nbins;bin++) integral[bin] /= integral[nbins];
644
645 // Start main loop ntimes
646 for (loop=0;loop<ntimes;loop++) {
647 r1 = gRandom->Rndm();
648 ibin = TMath::BinarySearch(nbins,&integral[0],r1);
649 biny = ibin/nbinsx;
650 binx = 1 + ibin - nbinsx*biny;
651 biny++;
652 x = xAxis.GetBinCenter(binx);
653 y = yAxis.GetBinCenter(biny);
654 Fill(x,y);
655 }
656 delete [] integral;
657}
658
659
660////////////////////////////////////////////////////////////////////////////////
661/// Fill histogram following distribution in histogram h.
662///
663/// The distribution contained in the histogram h (TH2) is integrated
664/// over the channel contents.
665/// It is normalized to 1.
666/// Getting one random number implies:
667/// - Generating a random number between 0 and 1 (say r1)
668/// - Look in which bin in the normalized integral r1 corresponds to
669/// - Fill histogram channel
670/// ntimes random numbers are generated
671
673{
674 if (!h) { Error("FillRandom", "Null histogram"); return; }
675 if (fDimension != h->GetDimension()) {
676 Error("FillRandom", "Histograms with different dimensions"); return;
677 }
678
679 if (h->ComputeIntegral() == 0) return;
680
681 Int_t loop;
682 Double_t x,y;
683 TH2 *h2 = (TH2*)h;
684 for (loop=0;loop<ntimes;loop++) {
685 h2->GetRandom2(x,y);
686 Fill(x,y);
687 }
688}
689
690
691////////////////////////////////////////////////////////////////////////////////
692/// Find first bin with content > threshold for axis (1=x, 2=y, 3=z)
693/// if no bins with content > threshold is found the function returns -1.
694
696{
697 if (axis < 1 || axis > 2) {
698 Warning("FindFirstBinAbove","Invalid axis number : %d, axis x assumed\n",axis);
699 axis = 1;
700 }
701 Int_t nbinsx = fXaxis.GetNbins();
702 Int_t nbinsy = fYaxis.GetNbins();
703 Int_t binx, biny;
704 if (axis == 1) {
705 for (binx=1;binx<=nbinsx;binx++) {
706 for (biny=1;biny<=nbinsy;biny++) {
707 if (GetBinContent(binx,biny) > threshold) return binx;
708 }
709 }
710 } else {
711 for (biny=1;biny<=nbinsy;biny++) {
712 for (binx=1;binx<=nbinsx;binx++) {
713 if (GetBinContent(binx,biny) > threshold) return biny;
714 }
715 }
716 }
717 return -1;
718}
719
720
721////////////////////////////////////////////////////////////////////////////////
722/// Find last bin with content > threshold for axis (1=x, 2=y, 3=z)
723/// if no bins with content > threshold is found the function returns -1.
724
726{
727 if (axis < 1 || axis > 2) {
728 Warning("FindLastBinAbove","Invalid axis number : %d, axis x assumed\n",axis);
729 axis = 1;
730 }
731 Int_t nbinsx = fXaxis.GetNbins();
732 Int_t nbinsy = fYaxis.GetNbins();
733 Int_t binx, biny;
734 if (axis == 1) {
735 for (binx=nbinsx;binx>=1;binx--) {
736 for (biny=1;biny<=nbinsy;biny++) {
737 if (GetBinContent(binx,biny) > threshold) return binx;
738 }
739 }
740 } else {
741 for (biny=nbinsy;biny>=1;biny--) {
742 for (binx=1;binx<=nbinsx;binx++) {
743 if (GetBinContent(binx,biny) > threshold) return biny;
744 }
745 }
746 }
747 return -1;
748}
749
750
751////////////////////////////////////////////////////////////////////////////////
752
753void TH2::DoFitSlices(bool onX,
754 TF1 *f1, Int_t firstbin, Int_t lastbin, Int_t cut, Option_t *option, TObjArray* arr)
755{
756 TAxis& outerAxis = (onX ? fYaxis : fXaxis);
757 TAxis& innerAxis = (onX ? fXaxis : fYaxis);
758
759 Int_t nbins = outerAxis.GetNbins();
760 if (firstbin < 0) firstbin = 0;
761 if (lastbin < 0 || lastbin > nbins + 1) lastbin = nbins + 1;
762 if (lastbin < firstbin) {firstbin = 0; lastbin = nbins + 1;}
763 TString opt = option;
764 opt.ToLower();
765 Int_t ngroup = 1;
766 if (opt.Contains("g2")) {ngroup = 2; opt.ReplaceAll("g2","");}
767 if (opt.Contains("g3")) {ngroup = 3; opt.ReplaceAll("g3","");}
768 if (opt.Contains("g4")) {ngroup = 4; opt.ReplaceAll("g4","");}
769 if (opt.Contains("g5")) {ngroup = 5; opt.ReplaceAll("g5","");}
770
771 // implement option S sliding merge for each bin using in conjunction with a given Gn
772 Int_t nstep = ngroup;
773 if (opt.Contains("s")) nstep = 1;
774
775 //default is to fit with a gaussian
776 if (f1 == 0) {
777 f1 = (TF1*)gROOT->GetFunction("gaus");
778 if (f1 == 0) f1 = new TF1("gaus","gaus",innerAxis.GetXmin(),innerAxis.GetXmax());
779 else f1->SetRange(innerAxis.GetXmin(),innerAxis.GetXmax());
780 }
781 Int_t npar = f1->GetNpar();
782 if (npar <= 0) return;
783 Double_t *parsave = new Double_t[npar];
784 f1->GetParameters(parsave);
785
786 if (arr) {
787 arr->SetOwner();
788 arr->Expand(npar + 1);
789 }
790
791 //Create one histogram for each function parameter
792 Int_t ipar;
793 TH1D **hlist = new TH1D*[npar];
794 char *name = new char[2000];
795 char *title = new char[2000];
796 const TArrayD *bins = outerAxis.GetXbins();
797 for (ipar=0;ipar<npar;ipar++) {
798 snprintf(name,2000,"%s_%d",GetName(),ipar);
799 snprintf(title,2000,"Fitted value of par[%d]=%s",ipar,f1->GetParName(ipar));
800 delete gDirectory->FindObject(name);
801 if (bins->fN == 0) {
802 hlist[ipar] = new TH1D(name,title, nbins, outerAxis.GetXmin(), outerAxis.GetXmax());
803 } else {
804 hlist[ipar] = new TH1D(name,title, nbins,bins->fArray);
805 }
806 hlist[ipar]->GetXaxis()->SetTitle(outerAxis.GetTitle());
807 if (arr)
808 (*arr)[ipar] = hlist[ipar];
809 }
810 snprintf(name,2000,"%s_chi2",GetName());
811 delete gDirectory->FindObject(name);
812 TH1D *hchi2 = 0;
813 if (bins->fN == 0) {
814 hchi2 = new TH1D(name,"chisquare", nbins, outerAxis.GetXmin(), outerAxis.GetXmax());
815 } else {
816 hchi2 = new TH1D(name,"chisquare", nbins, bins->fArray);
817 }
818 hchi2->GetXaxis()->SetTitle(outerAxis.GetTitle());
819 if (arr)
820 (*arr)[npar] = hchi2;
821
822 //Loop on all bins in Y, generate a projection along X
823 Int_t bin;
825 // in case of sliding merge nstep=1, i.e. do slices starting for every bin
826 // now do not slices case with overflow (makes more sense)
827 for (bin=firstbin;bin+ngroup-1<=lastbin;bin += nstep) {
828 TH1D *hp;
829 if (onX)
830 hp= ProjectionX("_temp",bin,bin+ngroup-1,"e");
831 else
832 hp= ProjectionY("_temp",bin,bin+ngroup-1,"e");
833 if (hp == 0) continue;
835 if (nentries == 0 || nentries < cut) {delete hp; continue;}
836 f1->SetParameters(parsave);
837 hp->Fit(f1,opt.Data());
838 Int_t npfits = f1->GetNumberFitPoints();
839 if (npfits > npar && npfits >= cut) {
840 Int_t binOn = bin + ngroup/2;
841 for (ipar=0;ipar<npar;ipar++) {
842 hlist[ipar]->Fill(outerAxis.GetBinCenter(binOn),f1->GetParameter(ipar));
843 hlist[ipar]->SetBinError(binOn,f1->GetParError(ipar));
844 }
845 hchi2->SetBinContent(binOn,f1->GetChisquare()/(npfits-npar));
846 }
847 delete hp;
848 }
849 delete [] parsave;
850 delete [] name;
851 delete [] title;
852 delete [] hlist;
853}
854
855
856////////////////////////////////////////////////////////////////////////////////
857/// Project slices along X in case of a 2-D histogram, then fit each slice
858/// with function f1 and make a histogram for each fit parameter
859/// Only bins along Y between firstybin and lastybin are considered.
860/// By default (firstybin == 0, lastybin == -1), all bins in y including
861/// over- and underflows are taken into account.
862/// If f1=0, a gaussian is assumed
863/// Before invoking this function, one can set a subrange to be fitted along X
864/// via f1->SetRange(xmin,xmax)
865/// The argument option (default="QNR") can be used to change the fit options.
866/// - "Q" means Quiet mode
867/// - "N" means do not show the result of the fit
868/// - "R" means fit the function in the specified function range
869/// - "G2" merge 2 consecutive bins along X
870/// - "G3" merge 3 consecutive bins along X
871/// - "G4" merge 4 consecutive bins along X
872/// - "G5" merge 5 consecutive bins along X
873/// - "S" sliding merge: merge n consecutive bins along X accordingly to what Gn is given.
874/// It makes sense when used together with a Gn option
875///
876/// The generated histograms are returned by adding them to arr, if arr is not NULL.
877/// arr's SetOwner() is called, to signal that it is the user's responsibility to
878/// delete the histograms, possibly by deleting the array.
879/// ~~~ {.cpp}
880/// TObjArray aSlices;
881/// h2->FitSlicesX(func, 0, -1, 0, "QNR", &aSlices);
882/// ~~~
883/// will already delete the histograms once aSlice goes out of scope. aSlices will
884/// contain the histogram for the i-th parameter of the fit function at aSlices[i];
885/// aSlices[n] (n being the number of parameters) contains the chi2 distribution of
886/// the fits.
887///
888/// If arr is NULL, the generated histograms are added to the list of objects
889/// in the current directory. It is the user's responsibility to delete
890/// these histograms.
891///
892/// Example: Assume a 2-d histogram h2
893/// ~~~ {.cpp}
894/// Root > h2->FitSlicesX(); produces 4 TH1D histograms
895/// with h2_0 containing parameter 0(Constant) for a Gaus fit
896/// of each bin in Y projected along X
897/// with h2_1 containing parameter 1(Mean) for a gaus fit
898/// with h2_2 containing parameter 2(StdDev) for a gaus fit
899/// with h2_chi2 containing the chisquare/number of degrees of freedom for a gaus fit
900///
901/// Root > h2->FitSlicesX(0,15,22,10);
902/// same as above, but only for bins 15 to 22 along Y
903/// and only for bins in Y for which the corresponding projection
904/// along X has more than cut bins filled.
905/// ~~~
906/// NOTE: To access the generated histograms in the current directory, do eg:
907/// ~~~ {.cpp}
908/// TH1D *h2_1 = (TH1D*)gDirectory->Get("h2_1");
909/// ~~~
910
911void TH2::FitSlicesX(TF1 *f1, Int_t firstybin, Int_t lastybin, Int_t cut, Option_t *option, TObjArray* arr)
912{
913 DoFitSlices(true, f1, firstybin, lastybin, cut, option, arr);
914
915}
916
917
918////////////////////////////////////////////////////////////////////////////////
919/// Project slices along Y in case of a 2-D histogram, then fit each slice
920/// with function f1 and make a histogram for each fit parameter
921/// Only bins along X between firstxbin and lastxbin are considered.
922/// By default (firstxbin == 0, lastxbin == -1), all bins in x including
923/// over- and underflows are taken into account.
924/// If f1=0, a gaussian is assumed
925/// Before invoking this function, one can set a subrange to be fitted along Y
926/// via f1->SetRange(ymin,ymax)
927/// The argument option (default="QNR") can be used to change the fit options.
928/// - "Q" means Quiet mode
929/// - "N" means do not show the result of the fit
930/// - "R" means fit the function in the specified function range
931/// - "G2" merge 2 consecutive bins along Y
932/// - "G3" merge 3 consecutive bins along Y
933/// - "G4" merge 4 consecutive bins along Y
934/// - "G5" merge 5 consecutive bins along Y
935/// - "S" sliding merge: merge n consecutive bins along Y accordingly to what Gn is given.
936/// It makes sense when used together with a Gn option
937///
938/// The generated histograms are returned by adding them to arr, if arr is not NULL.
939/// arr's SetOwner() is called, to signal that it is the user's responsibility to
940/// delete the histograms, possibly by deleting the array.
941/// ~~~ {.cpp}
942/// TObjArray aSlices;
943/// h2->FitSlicesY(func, 0, -1, 0, "QNR", &aSlices);
944/// ~~~
945/// will already delete the histograms once aSlice goes out of scope. aSlices will
946/// contain the histogram for the i-th parameter of the fit function at aSlices[i];
947/// aSlices[n] (n being the number of parameters) contains the chi2 distribution of
948/// the fits.
949///
950/// If arr is NULL, the generated histograms are added to the list of objects
951/// in the current directory. It is the user's responsibility to delete
952/// these histograms.
953///
954/// Example: Assume a 2-d histogram h2
955/// ~~~ {.cpp}
956/// Root > h2->FitSlicesY(); produces 4 TH1D histograms
957/// with h2_0 containing parameter 0(Constant) for a Gaus fit
958/// of each bin in X projected along Y
959/// with h2_1 containing parameter 1(Mean) for a gaus fit
960/// with h2_2 containing parameter 2(StdDev) for a gaus fit
961/// with h2_chi2 containing the chisquare/number of degrees of freedom for a gaus fit
962///
963/// Root > h2->FitSlicesY(0,15,22,10);
964/// same as above, but only for bins 15 to 22 along X
965/// and only for bins in X for which the corresponding projection
966/// along Y has more than cut bins filled.
967/// ~~~
968///
969/// NOTE: To access the generated histograms in the current directory, do eg:
970/// ~~~ {.cpp}
971/// TH1D *h2_1 = (TH1D*)gDirectory->Get("h2_1");
972/// ~~~
973///
974/// A complete example of this function is given in tutorial:fitslicesy.C.
975
976void TH2::FitSlicesY(TF1 *f1, Int_t firstxbin, Int_t lastxbin, Int_t cut, Option_t *option, TObjArray* arr)
977{
978 DoFitSlices(false, f1, firstxbin, lastxbin, cut, option, arr);
979}
980
982{
983 // See comments in TH1::GetBin
984 Int_t ofy = fYaxis.GetNbins() + 1; // overflow bin
985 if (biny < 0) biny = 0;
986 if (biny > ofy) biny = ofy;
987
988 return TH1::GetBin(binx) + (fXaxis.GetNbins() + 2) * biny;
989}
990
991
992////////////////////////////////////////////////////////////////////////////////
993/// compute first cell (binx,biny) in the range [firstxbin,lastxbin][firstybin,lastybin] for which
994/// diff = abs(cell_content-c) <= maxdiff
995/// In case several cells in the specified range with diff=0 are found
996/// the first cell found is returned in binx,biny.
997/// In case several cells in the specified range satisfy diff <=maxdiff
998/// the cell with the smallest difference is returned in binx,biny.
999/// In all cases the function returns the smallest difference.
1000///
1001/// NOTE1: if firstxbin < 0, firstxbin is set to 1
1002/// if (lastxbin < firstxbin then lastxbin is set to the number of bins in X
1003/// ie if firstxbin=1 and lastxbin=0 (default) the search is on all bins in X except
1004/// for X's under- and overflow bins.
1005/// if firstybin < 0, firstybin is set to 1
1006/// if (lastybin < firstybin then lastybin is set to the number of bins in Y
1007/// ie if firstybin=1 and lastybin=0 (default) the search is on all bins in Y except
1008/// for Y's under- and overflow bins.
1009///
1010/// NOTE2: if maxdiff=0 (default), the first cell with content=c is returned.
1011
1013 Int_t firstybin, Int_t lastybin, Double_t maxdiff) const
1014{
1015 if (fDimension != 2) {
1016 binx = -1;
1017 biny = -1;
1018 Error("GetBinWithContent2","function is only valid for 2-D histograms");
1019 return 0;
1020 }
1021 if (firstxbin < 0) firstxbin = 1;
1022 if (lastxbin < firstxbin) lastxbin = fXaxis.GetNbins();
1023 if (firstybin < 0) firstybin = 1;
1024 if (lastybin < firstybin) lastybin = fYaxis.GetNbins();
1025 Double_t diff, curmax = 1.e240;
1026 for (Int_t j = firstybin; j <= lastybin; j++) {
1027 for (Int_t i = firstxbin; i <= lastxbin; i++) {
1028 diff = TMath::Abs(GetBinContent(i,j)-c);
1029 if (diff <= 0) {binx = i; biny=j; return diff;}
1030 if (diff < curmax && diff <= maxdiff) {curmax = diff, binx=i; biny=j;}
1031 }
1032 }
1033 return curmax;
1034}
1035
1036
1037////////////////////////////////////////////////////////////////////////////////
1038/// Return correlation factor between axis1 and axis2.
1039
1041{
1042 if (axis1 < 1 || axis2 < 1 || axis1 > 2 || axis2 > 2) {
1043 Error("GetCorrelationFactor","Wrong parameters");
1044 return 0;
1045 }
1046 if (axis1 == axis2) return 1;
1047 Double_t stddev1 = GetStdDev(axis1);
1048 if (stddev1 == 0) return 0;
1049 Double_t stddev2 = GetStdDev(axis2);
1050 if (stddev2 == 0) return 0;
1051 return GetCovariance(axis1,axis2)/stddev1/stddev2;
1052}
1053
1054
1055////////////////////////////////////////////////////////////////////////////////
1056/// Return covariance between axis1 and axis2.
1057
1059{
1060 if (axis1 < 1 || axis2 < 1 || axis1 > 2 || axis2 > 2) {
1061 Error("GetCovariance","Wrong parameters");
1062 return 0;
1063 }
1064 Double_t stats[kNstat];
1065 GetStats(stats);
1066 Double_t sumw = stats[0];
1067 //Double_t sumw2 = stats[1];
1068 Double_t sumwx = stats[2];
1069 Double_t sumwx2 = stats[3];
1070 Double_t sumwy = stats[4];
1071 Double_t sumwy2 = stats[5];
1072 Double_t sumwxy = stats[6];
1073
1074 if (sumw == 0) return 0;
1075 if (axis1 == 1 && axis2 == 1) {
1076 return TMath::Abs(sumwx2/sumw - sumwx/sumw*sumwx/sumw);
1077 }
1078 if (axis1 == 2 && axis2 == 2) {
1079 return TMath::Abs(sumwy2/sumw - sumwy/sumw*sumwy/sumw);
1080 }
1081 return sumwxy/sumw - sumwx/sumw*sumwy/sumw;
1082}
1083
1084
1085////////////////////////////////////////////////////////////////////////////////
1086/// Return 2 random numbers along axis x and y distributed according
1087/// the cell-contents of a 2-dim histogram
1088/// return a NaN if the histogram has a bin with negative content
1089
1091{
1092 Int_t nbinsx = GetNbinsX();
1093 Int_t nbinsy = GetNbinsY();
1094 Int_t nbins = nbinsx*nbinsy;
1095 Double_t integral;
1096 // compute integral checking that all bins have positive content (see ROOT-5894)
1097 if (fIntegral) {
1098 if (fIntegral[nbins+1] != fEntries) integral = ComputeIntegral(true);
1099 else integral = fIntegral[nbins];
1100 } else {
1101 integral = ComputeIntegral(true);
1102 }
1103 if (integral == 0 ) { x = 0; y = 0; return;}
1104 // case histogram has negative bins
1105 if (integral == TMath::QuietNaN() ) { x = TMath::QuietNaN(); y = TMath::QuietNaN(); return;}
1106
1107 Double_t r1 = gRandom->Rndm();
1108 Int_t ibin = TMath::BinarySearch(nbins,fIntegral,(Double_t) r1);
1109 Int_t biny = ibin/nbinsx;
1110 Int_t binx = ibin - nbinsx*biny;
1111 x = fXaxis.GetBinLowEdge(binx+1);
1112 if (r1 > fIntegral[ibin]) x +=
1113 fXaxis.GetBinWidth(binx+1)*(r1-fIntegral[ibin])/(fIntegral[ibin+1] - fIntegral[ibin]);
1114 y = fYaxis.GetBinLowEdge(biny+1) + fYaxis.GetBinWidth(biny+1)*gRandom->Rndm();
1115}
1116
1117
1118////////////////////////////////////////////////////////////////////////////////
1119/// Fill the array stats from the contents of this histogram
1120/// The array stats must be correctly dimensioned in the calling program.
1121/// ~~~ {.cpp}
1122/// stats[0] = sumw
1123/// stats[1] = sumw2
1124/// stats[2] = sumwx
1125/// stats[3] = sumwx2
1126/// stats[4] = sumwy
1127/// stats[5] = sumwy2
1128/// stats[6] = sumwxy
1129/// ~~~
1130///
1131/// If no axis-subranges are specified (via TAxis::SetRange), the array stats
1132/// is simply a copy of the statistics quantities computed at filling time.
1133/// If sub-ranges are specified, the function recomputes these quantities
1134/// from the bin contents in the current axis ranges.
1135///
1136/// Note that the mean value/StdDev is computed using the bins in the currently
1137/// defined ranges (see TAxis::SetRange). By default the ranges include
1138/// all bins from 1 to nbins included, excluding underflows and overflows.
1139/// To force the underflows and overflows in the computation, one must
1140/// call the static function TH1::StatOverflows(kTRUE) before filling
1141/// the histogram.
1142
1143void TH2::GetStats(Double_t *stats) const
1144{
1145 if (fBuffer) ((TH2*)this)->BufferEmpty();
1146
1148 std::fill(stats, stats + 7, 0);
1149
1150 Int_t firstBinX = fXaxis.GetFirst();
1151 Int_t lastBinX = fXaxis.GetLast();
1152 Int_t firstBinY = fYaxis.GetFirst();
1153 Int_t lastBinY = fYaxis.GetLast();
1154 // include underflow/overflow if TH1::StatOverflows(kTRUE) in case no range is set on the axis
1157 if (firstBinX == 1) firstBinX = 0;
1158 if (lastBinX == fXaxis.GetNbins() ) lastBinX += 1;
1159 }
1161 if (firstBinY == 1) firstBinY = 0;
1162 if (lastBinY == fYaxis.GetNbins() ) lastBinY += 1;
1163 }
1164 }
1165 for (Int_t biny = firstBinY; biny <= lastBinY; ++biny) {
1166 Double_t y = fYaxis.GetBinCenter(biny);
1167 for (Int_t binx = firstBinX; binx <= lastBinX; ++binx) {
1168 Double_t x = fXaxis.GetBinCenter(binx);
1169 //w = TMath::Abs(GetBinContent(bin));
1170 Int_t bin = GetBin(binx,biny);
1172 Double_t wx = w * x; // avoid some extra multiplications at the expense of some clarity
1173 Double_t wy = w * y;
1174
1175 stats[0] += w;
1176 stats[1] += GetBinErrorSqUnchecked(bin);
1177 stats[2] += wx;
1178 stats[3] += wx * x;
1179 stats[4] += wy;
1180 stats[5] += wy * y;
1181 stats[6] += wx * y;
1182 }
1183 }
1184 } else {
1185 stats[0] = fTsumw;
1186 stats[1] = fTsumw2;
1187 stats[2] = fTsumwx;
1188 stats[3] = fTsumwx2;
1189 stats[4] = fTsumwy;
1190 stats[5] = fTsumwy2;
1191 stats[6] = fTsumwxy;
1192 }
1193}
1194
1195
1196////////////////////////////////////////////////////////////////////////////////
1197/// Return integral of bin contents. Only bins in the bins range are considered.
1198/// By default the integral is computed as the sum of bin contents in the range.
1199/// if option "width" is specified, the integral is the sum of
1200/// the bin contents multiplied by the bin width in x and in y.
1201
1203{
1205 fYaxis.GetFirst(),fYaxis.GetLast(),option);
1206}
1207
1208
1209////////////////////////////////////////////////////////////////////////////////
1210/// Return integral of bin contents in range [firstxbin,lastxbin],[firstybin,lastybin]
1211/// for a 2-D histogram
1212/// By default the integral is computed as the sum of bin contents in the range.
1213/// if option "width" is specified, the integral is the sum of
1214/// the bin contents multiplied by the bin width in x and in y.
1215
1216Double_t TH2::Integral(Int_t firstxbin, Int_t lastxbin, Int_t firstybin, Int_t lastybin, Option_t *option) const
1217{
1218 double err = 0;
1219 return DoIntegral(firstxbin,lastxbin,firstybin,lastybin,-1,0,err,option);
1220}
1221
1222
1223////////////////////////////////////////////////////////////////////////////////
1224/// Return integral of bin contents in range [firstxbin,lastxbin],[firstybin,lastybin]
1225/// for a 2-D histogram. Calculates also the integral error using error propagation
1226/// from the bin errors assuming that all the bins are uncorrelated.
1227/// By default the integral is computed as the sum of bin contents in the range.
1228/// if option "width" is specified, the integral is the sum of
1229/// the bin contents multiplied by the bin width in x and in y.
1230
1231Double_t TH2::IntegralAndError(Int_t firstxbin, Int_t lastxbin, Int_t firstybin, Int_t lastybin, Double_t & error, Option_t *option) const
1232{
1233 return DoIntegral(firstxbin,lastxbin,firstybin,lastybin,-1,0,error,option,kTRUE);
1234}
1235
1236
1237////////////////////////////////////////////////////////////////////////////////
1238///illegal for a TH2
1239
1241{
1242 Error("Interpolate","This function must be called with 2 arguments for a TH2");
1243 return 0;
1244}
1245
1246
1247////////////////////////////////////////////////////////////////////////////////
1248/// Given a point P(x,y), Interpolate approximates the value via bilinear
1249/// interpolation based on the four nearest bin centers
1250/// see Wikipedia, Bilinear Interpolation
1251/// Andy Mastbaum 10/8/2008
1252/// vaguely based on R.Raja 6-Sep-2008
1253
1255{
1256 Double_t f=0;
1257 Double_t x1=0,x2=0,y1=0,y2=0;
1258 Double_t dx,dy;
1259 Int_t bin_x = fXaxis.FindBin(x);
1260 Int_t bin_y = fYaxis.FindBin(y);
1261 if(bin_x<1 || bin_x>GetNbinsX() || bin_y<1 || bin_y>GetNbinsY()) {
1262 Error("Interpolate","Cannot interpolate outside histogram domain.");
1263 return 0;
1264 }
1265 Int_t quadrant = 0; // CCW from UR 1,2,3,4
1266 // which quadrant of the bin (bin_P) are we in?
1267 dx = fXaxis.GetBinUpEdge(bin_x)-x;
1268 dy = fYaxis.GetBinUpEdge(bin_y)-y;
1269 if (dx<=fXaxis.GetBinWidth(bin_x)/2 && dy<=fYaxis.GetBinWidth(bin_y)/2)
1270 quadrant = 1; // upper right
1271 if (dx>fXaxis.GetBinWidth(bin_x)/2 && dy<=fYaxis.GetBinWidth(bin_y)/2)
1272 quadrant = 2; // upper left
1273 if (dx>fXaxis.GetBinWidth(bin_x)/2 && dy>fYaxis.GetBinWidth(bin_y)/2)
1274 quadrant = 3; // lower left
1275 if (dx<=fXaxis.GetBinWidth(bin_x)/2 && dy>fYaxis.GetBinWidth(bin_y)/2)
1276 quadrant = 4; // lower right
1277 switch(quadrant) {
1278 case 1:
1279 x1 = fXaxis.GetBinCenter(bin_x);
1280 y1 = fYaxis.GetBinCenter(bin_y);
1281 x2 = fXaxis.GetBinCenter(bin_x+1);
1282 y2 = fYaxis.GetBinCenter(bin_y+1);
1283 break;
1284 case 2:
1285 x1 = fXaxis.GetBinCenter(bin_x-1);
1286 y1 = fYaxis.GetBinCenter(bin_y);
1287 x2 = fXaxis.GetBinCenter(bin_x);
1288 y2 = fYaxis.GetBinCenter(bin_y+1);
1289 break;
1290 case 3:
1291 x1 = fXaxis.GetBinCenter(bin_x-1);
1292 y1 = fYaxis.GetBinCenter(bin_y-1);
1293 x2 = fXaxis.GetBinCenter(bin_x);
1294 y2 = fYaxis.GetBinCenter(bin_y);
1295 break;
1296 case 4:
1297 x1 = fXaxis.GetBinCenter(bin_x);
1298 y1 = fYaxis.GetBinCenter(bin_y-1);
1299 x2 = fXaxis.GetBinCenter(bin_x+1);
1300 y2 = fYaxis.GetBinCenter(bin_y);
1301 break;
1302 }
1303 Int_t bin_x1 = fXaxis.FindBin(x1);
1304 if(bin_x1<1) bin_x1=1;
1305 Int_t bin_x2 = fXaxis.FindBin(x2);
1306 if(bin_x2>GetNbinsX()) bin_x2=GetNbinsX();
1307 Int_t bin_y1 = fYaxis.FindBin(y1);
1308 if(bin_y1<1) bin_y1=1;
1309 Int_t bin_y2 = fYaxis.FindBin(y2);
1310 if(bin_y2>GetNbinsY()) bin_y2=GetNbinsY();
1311 Int_t bin_q22 = GetBin(bin_x2,bin_y2);
1312 Int_t bin_q12 = GetBin(bin_x1,bin_y2);
1313 Int_t bin_q11 = GetBin(bin_x1,bin_y1);
1314 Int_t bin_q21 = GetBin(bin_x2,bin_y1);
1315 Double_t q11 = RetrieveBinContent(bin_q11);
1316 Double_t q12 = RetrieveBinContent(bin_q12);
1317 Double_t q21 = RetrieveBinContent(bin_q21);
1318 Double_t q22 = RetrieveBinContent(bin_q22);
1319 Double_t d = 1.0*(x2-x1)*(y2-y1);
1320 f = 1.0*q11/d*(x2-x)*(y2-y)+1.0*q21/d*(x-x1)*(y2-y)+1.0*q12/d*(x2-x)*(y-y1)+1.0*q22/d*(x-x1)*(y-y1);
1321 return f;
1322}
1323
1324
1325////////////////////////////////////////////////////////////////////////////////
1326///illegal for a TH2
1327
1329{
1330 Error("Interpolate","This function must be called with 2 arguments for a TH2");
1331 return 0;
1332}
1333
1334
1335////////////////////////////////////////////////////////////////////////////////
1336/// Statistical test of compatibility in shape between
1337/// THIS histogram and h2, using Kolmogorov test.
1338/// Default: Ignore under- and overflow bins in comparison
1339///
1340/// option is a character string to specify options
1341/// - "U" include Underflows in test
1342/// - "O" include Overflows
1343/// - "N" include comparison of normalizations
1344/// - "D" Put out a line of "Debug" printout
1345/// - "M" Return the Maximum Kolmogorov distance instead of prob
1346///
1347/// The returned function value is the probability of test
1348/// (much less than one means NOT compatible)
1349///
1350/// The KS test uses the distance between the pseudo-CDF's obtained
1351/// from the histogram. Since in 2D the order for generating the pseudo-CDF is
1352/// arbitrary, two pairs of pseudo-CDF are used, one starting from the x axis the
1353/// other from the y axis and the maximum distance is the average of the two maximum
1354/// distances obtained.
1355///
1356/// Code adapted by Rene Brun from original HBOOK routine HDIFF
1357
1358Double_t TH2::KolmogorovTest(const TH1 *h2, Option_t *option) const
1359{
1360 TString opt = option;
1361 opt.ToUpper();
1362
1363 Double_t prb = 0;
1364 TH1 *h1 = (TH1*)this;
1365 if (h2 == 0) return 0;
1366 const TAxis *xaxis1 = h1->GetXaxis();
1367 const TAxis *xaxis2 = h2->GetXaxis();
1368 const TAxis *yaxis1 = h1->GetYaxis();
1369 const TAxis *yaxis2 = h2->GetYaxis();
1370 Int_t ncx1 = xaxis1->GetNbins();
1371 Int_t ncx2 = xaxis2->GetNbins();
1372 Int_t ncy1 = yaxis1->GetNbins();
1373 Int_t ncy2 = yaxis2->GetNbins();
1374
1375 // Check consistency of dimensions
1376 if (h1->GetDimension() != 2 || h2->GetDimension() != 2) {
1377 Error("KolmogorovTest","Histograms must be 2-D\n");
1378 return 0;
1379 }
1380
1381 // Check consistency in number of channels
1382 if (ncx1 != ncx2) {
1383 Error("KolmogorovTest","Number of channels in X is different, %d and %d\n",ncx1,ncx2);
1384 return 0;
1385 }
1386 if (ncy1 != ncy2) {
1387 Error("KolmogorovTest","Number of channels in Y is different, %d and %d\n",ncy1,ncy2);
1388 return 0;
1389 }
1390
1391 // Check consistency in channel edges
1392 Bool_t afunc1 = kFALSE;
1393 Bool_t afunc2 = kFALSE;
1394 Double_t difprec = 1e-5;
1395 Double_t diff1 = TMath::Abs(xaxis1->GetXmin() - xaxis2->GetXmin());
1396 Double_t diff2 = TMath::Abs(xaxis1->GetXmax() - xaxis2->GetXmax());
1397 if (diff1 > difprec || diff2 > difprec) {
1398 Error("KolmogorovTest","histograms with different binning along X");
1399 return 0;
1400 }
1401 diff1 = TMath::Abs(yaxis1->GetXmin() - yaxis2->GetXmin());
1402 diff2 = TMath::Abs(yaxis1->GetXmax() - yaxis2->GetXmax());
1403 if (diff1 > difprec || diff2 > difprec) {
1404 Error("KolmogorovTest","histograms with different binning along Y");
1405 return 0;
1406 }
1407
1408 // Should we include Uflows, Oflows?
1409 Int_t ibeg = 1, jbeg = 1;
1410 Int_t iend = ncx1, jend = ncy1;
1411 if (opt.Contains("U")) {ibeg = 0; jbeg = 0;}
1412 if (opt.Contains("O")) {iend = ncx1+1; jend = ncy1+1;}
1413
1414 Int_t i,j;
1415 Double_t sum1 = 0;
1416 Double_t sum2 = 0;
1417 Double_t w1 = 0;
1418 Double_t w2 = 0;
1419 for (i = ibeg; i <= iend; i++) {
1420 for (j = jbeg; j <= jend; j++) {
1421 sum1 += h1->GetBinContent(i,j);
1422 sum2 += h2->GetBinContent(i,j);
1423 Double_t ew1 = h1->GetBinError(i,j);
1424 Double_t ew2 = h2->GetBinError(i,j);
1425 w1 += ew1*ew1;
1426 w2 += ew2*ew2;
1427
1428 }
1429 }
1430
1431 // Check that both scatterplots contain events
1432 if (sum1 == 0) {
1433 Error("KolmogorovTest","Integral is zero for h1=%s\n",h1->GetName());
1434 return 0;
1435 }
1436 if (sum2 == 0) {
1437 Error("KolmogorovTest","Integral is zero for h2=%s\n",h2->GetName());
1438 return 0;
1439 }
1440 // calculate the effective entries.
1441 // the case when errors are zero (w1 == 0 or w2 ==0) are equivalent to
1442 // compare to a function. In that case the rescaling is done only on sqrt(esum2) or sqrt(esum1)
1443 Double_t esum1 = 0, esum2 = 0;
1444 if (w1 > 0)
1445 esum1 = sum1 * sum1 / w1;
1446 else
1447 afunc1 = kTRUE; // use later for calculating z
1448
1449 if (w2 > 0)
1450 esum2 = sum2 * sum2 / w2;
1451 else
1452 afunc2 = kTRUE; // use later for calculating z
1453
1454 if (afunc2 && afunc1) {
1455 Error("KolmogorovTest","Errors are zero for both histograms\n");
1456 return 0;
1457 }
1458
1459 // Find first Kolmogorov distance
1460 Double_t s1 = 1/sum1;
1461 Double_t s2 = 1/sum2;
1462 Double_t dfmax1 = 0;
1463 Double_t rsum1=0, rsum2=0;
1464 for (i=ibeg;i<=iend;i++) {
1465 for (j=jbeg;j<=jend;j++) {
1466 rsum1 += s1*h1->GetBinContent(i,j);
1467 rsum2 += s2*h2->GetBinContent(i,j);
1468 dfmax1 = TMath::Max(dfmax1, TMath::Abs(rsum1-rsum2));
1469 }
1470 }
1471
1472 // Find second Kolmogorov distance
1473 Double_t dfmax2 = 0;
1474 rsum1=0, rsum2=0;
1475 for (j=jbeg;j<=jend;j++) {
1476 for (i=ibeg;i<=iend;i++) {
1477 rsum1 += s1*h1->GetBinContent(i,j);
1478 rsum2 += s2*h2->GetBinContent(i,j);
1479 dfmax2 = TMath::Max(dfmax2, TMath::Abs(rsum1-rsum2));
1480 }
1481 }
1482
1483 // Get Kolmogorov probability: use effective entries, esum1 or esum2, for normalizing it
1484 Double_t factnm;
1485 if (afunc1) factnm = TMath::Sqrt(esum2);
1486 else if (afunc2) factnm = TMath::Sqrt(esum1);
1487 else factnm = TMath::Sqrt(esum1*sum2/(esum1+esum2));
1488
1489 // take average of the two distances
1490 Double_t dfmax = 0.5*(dfmax1+dfmax2);
1491 Double_t z = dfmax*factnm;
1492
1493 prb = TMath::KolmogorovProb(z);
1494
1495 Double_t prb1 = 0, prb2 = 0;
1496 // option N to combine normalization makes sense if both afunc1 and afunc2 are false
1497 if (opt.Contains("N") && !(afunc1 || afunc2 ) ) {
1498 // Combine probabilities for shape and normalization
1499 prb1 = prb;
1500 Double_t d12 = esum1-esum2;
1501 Double_t chi2 = d12*d12/(esum1+esum2);
1502 prb2 = TMath::Prob(chi2,1);
1503 // see Eadie et al., section 11.6.2
1504 if (prb > 0 && prb2 > 0) prb = prb*prb2*(1-TMath::Log(prb*prb2));
1505 else prb = 0;
1506 }
1507
1508 // debug printout
1509 if (opt.Contains("D")) {
1510 printf(" Kolmo Prob h1 = %s, sum1=%g\n",h1->GetName(),sum1);
1511 printf(" Kolmo Prob h2 = %s, sum2=%g\n",h2->GetName(),sum2);
1512 printf(" Kolmo Probabil = %f, Max Dist = %g\n",prb,dfmax);
1513 if (opt.Contains("N"))
1514 printf(" Kolmo Probabil = %f for shape alone, =%f for normalisation alone\n",prb1,prb2);
1515 }
1516 // This numerical error condition should never occur:
1517 if (TMath::Abs(rsum1-1) > 0.002) Warning("KolmogorovTest","Numerical problems with h1=%s\n",h1->GetName());
1518 if (TMath::Abs(rsum2-1) > 0.002) Warning("KolmogorovTest","Numerical problems with h2=%s\n",h2->GetName());
1519
1520 if(opt.Contains("M")) return dfmax; // return average of max distance
1521
1522 return prb;
1523}
1524
1525
1526////////////////////////////////////////////////////////////////////////////////
1527/// Rebin only the X axis
1528/// see Rebin2D
1529
1530TH2 *TH2::RebinX(Int_t ngroup, const char *newname)
1531{
1532 return Rebin2D(ngroup, 1, newname);
1533}
1534
1535
1536////////////////////////////////////////////////////////////////////////////////
1537/// Rebin only the Y axis
1538/// see Rebin2D
1539
1540TH2 *TH2::RebinY(Int_t ngroup, const char *newname)
1541{
1542 return Rebin2D(1, ngroup, newname);
1543}
1544
1545////////////////////////////////////////////////////////////////////////////////
1546/// Override TH1::Rebin as TH2::RebinX
1547/// Rebinning in variable binning as for TH1 is not allowed
1548/// If a non-null pointer is given an error is flagged
1549/// see RebinX and Rebin2D
1550
1551TH2 * TH2::Rebin( Int_t ngroup, const char*newname, const Double_t *xbins)
1552{
1553 if (xbins != nullptr) {
1554 Error("Rebin","Rebinning a 2-d histogram into variable bins is not supported (it is possible only for 1-d histograms). Return a nullptr");
1555 return nullptr;
1556 }
1557 Info("Rebin","Rebinning only the x-axis. Use Rebin2D for rebinning both axes");
1558 return RebinX(ngroup, newname);
1559}
1560////////////////////////////////////////////////////////////////////////////////
1561/// Rebin this histogram grouping nxgroup/nygroup bins along the xaxis/yaxis together.
1562///
1563/// if newname is not blank a new temporary histogram hnew is created.
1564/// else the current histogram is modified (default)
1565/// The parameter nxgroup/nygroup indicate how many bins along the xaxis/yaxis of this
1566/// have to me merged into one bin of hnew
1567/// If the original histogram has errors stored (via Sumw2), the resulting
1568/// histograms has new errors correctly calculated.
1569///
1570/// examples: if hpxpy is an existing TH2 histogram with 40 x 40 bins
1571/// ~~~ {.cpp}
1572/// hpxpy->Rebin2D(); // merges two bins along the xaxis and yaxis in one in hpxpy
1573/// // Carefull: previous contents of hpxpy are lost
1574/// hpxpy->RebinX(5); //merges five bins along the xaxis in one in hpxpy
1575/// TH2 *hnew = hpxpy->RebinY(5,"hnew"); // creates a new histogram hnew
1576/// // merging 5 bins of h1 along the yaxis in one bin
1577/// ~~~
1578///
1579/// NOTE : If nxgroup/nygroup is not an exact divider of the number of bins,
1580/// along the xaxis/yaxis the top limit(s) of the rebinned histogram
1581/// is changed to the upper edge of the xbin=newxbins*nxgroup resp.
1582/// ybin=newybins*nygroup and the corresponding bins are added to
1583/// the overflow bin.
1584/// Statistics will be recomputed from the new bin contents.
1585
1586TH2 *TH2::Rebin2D(Int_t nxgroup, Int_t nygroup, const char *newname)
1587{
1588 Int_t nxbins = fXaxis.GetNbins();
1589 Int_t nybins = fYaxis.GetNbins();
1590 Int_t nx = nxbins + 2; // normal bins + underflow and overflow
1591 Int_t ny = nybins + 2;
1596
1597 if (GetDimension() != 2) {
1598 Error("Rebin2D", "Histogram must be TH2. This histogram has %d dimensions.", GetDimension());
1599 return 0;
1600 }
1601 if ((nxgroup <= 0) || (nxgroup > nxbins)) {
1602 Error("Rebin2D", "Illegal value of nxgroup=%d",nxgroup);
1603 return 0;
1604 }
1605 if ((nygroup <= 0) || (nygroup > nybins)) {
1606 Error("Rebin2D", "Illegal value of nygroup=%d",nygroup);
1607 return 0;
1608 }
1609
1610 Int_t newxbins = nxbins / nxgroup;
1611 Int_t newybins = nybins / nygroup;
1612 Int_t newnx = newxbins + 2; // regular bins + overflow / underflow
1613 Int_t newny = newybins + 2; // regular bins + overflow / underflow
1614
1615 // Save old bin contents into a new array
1616 Double_t *oldBins = new Double_t[fNcells];
1617 for (Int_t i = 0; i < fNcells; ++i) oldBins[i] = RetrieveBinContent(i);
1618
1619 Double_t* oldErrors = NULL;
1620 if (fSumw2.fN) {
1621 oldErrors = new Double_t[fNcells];
1622 for (Int_t i = 0; i < fNcells; ++i) oldErrors[i] = GetBinErrorSqUnchecked(i);
1623 }
1624
1625 // create a clone of the old histogram if newname is specified
1626 TH2* hnew = this;
1627 if (newname && strlen(newname)) {
1628 hnew = (TH2*)Clone();
1629 hnew->SetName(newname);
1630 }
1631
1632 bool resetStat = false;
1633
1634 // change axis specs and rebuild bin contents array
1635 if(newxbins * nxgroup != nxbins) {
1636 xmax = fXaxis.GetBinUpEdge(newxbins * nxgroup);
1637 resetStat = true; // stats must be reset because top bins will be moved to overflow bin
1638 }
1639 if(newybins * nygroup != nybins) {
1640 ymax = fYaxis.GetBinUpEdge(newybins * nygroup);
1641 resetStat = true; // stats must be reset because top bins will be moved to overflow bin
1642 }
1643
1644 // save the TAttAxis members (reset by SetBins) for x axis
1645 Int_t nXdivisions = fXaxis.GetNdivisions();
1646 Color_t xAxisColor = fXaxis.GetAxisColor();
1647 Color_t xLabelColor = fXaxis.GetLabelColor();
1648 Style_t xLabelFont = fXaxis.GetLabelFont();
1649 Float_t xLabelOffset = fXaxis.GetLabelOffset();
1650 Float_t xLabelSize = fXaxis.GetLabelSize();
1651 Float_t xTickLength = fXaxis.GetTickLength();
1652 Float_t xTitleOffset = fXaxis.GetTitleOffset();
1653 Float_t xTitleSize = fXaxis.GetTitleSize();
1654 Color_t xTitleColor = fXaxis.GetTitleColor();
1655 Style_t xTitleFont = fXaxis.GetTitleFont();
1656 // save the TAttAxis members (reset by SetBins) for y axis
1657 Int_t nYdivisions = fYaxis.GetNdivisions();
1658 Color_t yAxisColor = fYaxis.GetAxisColor();
1659 Color_t yLabelColor = fYaxis.GetLabelColor();
1660 Style_t yLabelFont = fYaxis.GetLabelFont();
1661 Float_t yLabelOffset = fYaxis.GetLabelOffset();
1662 Float_t yLabelSize = fYaxis.GetLabelSize();
1663 Float_t yTickLength = fYaxis.GetTickLength();
1664 Float_t yTitleOffset = fYaxis.GetTitleOffset();
1665 Float_t yTitleSize = fYaxis.GetTitleSize();
1666 Color_t yTitleColor = fYaxis.GetTitleColor();
1667 Style_t yTitleFont = fYaxis.GetTitleFont();
1668
1669
1670 // copy merged bin contents (ignore under/overflows)
1671 if (nxgroup != 1 || nygroup != 1) {
1672 if(fXaxis.GetXbins()->GetSize() > 0 || fYaxis.GetXbins()->GetSize() > 0){
1673 // variable bin sizes in x or y, don't treat both cases separately
1674 Double_t *xbins = new Double_t[newxbins + 1];
1675 for(Int_t i = 0; i <= newxbins; ++i) xbins[i] = fXaxis.GetBinLowEdge(1 + i * nxgroup);
1676 Double_t *ybins = new Double_t[newybins + 1];
1677 for(Int_t i = 0; i <= newybins; ++i) ybins[i] = fYaxis.GetBinLowEdge(1 + i * nygroup);
1678 hnew->SetBins(newxbins, xbins, newybins, ybins); // changes also errors array (if any)
1679 delete [] xbins;
1680 delete [] ybins;
1681 } else {
1682 hnew->SetBins(newxbins, xmin, xmax, newybins, ymin, ymax); //changes also errors array
1683 }
1684
1685 // (0, 0): x - underflow; y - underflow
1686 hnew->UpdateBinContent(0, oldBins[0]);
1687 if (oldErrors) hnew->fSumw2[0] = 0;
1688
1689 // (x, 0): x - regular / overflow; y - underflow
1690 for(Int_t binx = 1, oldbinx = 1; binx < newnx; ++binx, oldbinx += nxgroup){
1691 Double_t binContent = 0.0, binErrorSq = 0.0;
1692 for (Int_t i = 0; i < nxgroup && (oldbinx + i) < nx; ++i) {
1693 Int_t bin = oldbinx + i;
1694 binContent += oldBins[bin];
1695 if(oldErrors) binErrorSq += oldErrors[bin];
1696 }
1697 Int_t newbin = binx;
1698 hnew->UpdateBinContent(newbin, binContent);
1699 if (oldErrors) hnew->fSumw2[newbin] = binErrorSq;
1700 }
1701
1702 // (0, y): x - underflow; y - regular / overflow
1703 for(Int_t biny = 1, oldbiny = 1; biny < newny; ++biny, oldbiny += nygroup){
1704 Double_t binContent = 0.0, binErrorSq = 0.0;
1705 for (Int_t j = 0; j < nygroup && (oldbiny + j) < ny; ++j) {
1706 Int_t bin = (oldbiny + j) * nx;
1707 binContent += oldBins[bin];
1708 if(oldErrors) binErrorSq += oldErrors[bin];
1709 }
1710 Int_t newbin = biny * newnx;
1711 hnew->UpdateBinContent(newbin, binContent);
1712 if (oldErrors) hnew->fSumw2[newbin] = binErrorSq;
1713 }
1714
1715 // (x, y): x - regular / overflow; y - regular / overflow
1716 for (Int_t binx = 1, oldbinx = 1; binx < newnx; ++binx, oldbinx += nxgroup) {
1717 for (Int_t biny = 1, oldbiny = 1; biny < newny; ++biny, oldbiny += nygroup) {
1718 Double_t binContent = 0.0, binErrorSq = 0.0;
1719 for (Int_t i = 0; i < nxgroup && (oldbinx + i) < nx; ++i) {
1720 for (Int_t j = 0; j < nygroup && (oldbiny + j) < ny; ++j) {
1721 Int_t bin = oldbinx + i + (oldbiny + j) * nx;
1722 binContent += oldBins[bin];
1723 if (oldErrors) binErrorSq += oldErrors[bin];
1724 }
1725 }
1726 Int_t newbin = binx + biny * newnx;
1727 hnew->UpdateBinContent(newbin, binContent);
1728 if (oldErrors) hnew->fSumw2[newbin] = binErrorSq;
1729 }
1730 }
1731 }
1732
1733 // Restore x axis attributes
1734 fXaxis.SetNdivisions(nXdivisions);
1735 fXaxis.SetAxisColor(xAxisColor);
1736 fXaxis.SetLabelColor(xLabelColor);
1737 fXaxis.SetLabelFont(xLabelFont);
1738 fXaxis.SetLabelOffset(xLabelOffset);
1739 fXaxis.SetLabelSize(xLabelSize);
1740 fXaxis.SetTickLength(xTickLength);
1741 fXaxis.SetTitleOffset(xTitleOffset);
1742 fXaxis.SetTitleSize(xTitleSize);
1743 fXaxis.SetTitleColor(xTitleColor);
1744 fXaxis.SetTitleFont(xTitleFont);
1745 // Restore y axis attributes
1746 fYaxis.SetNdivisions(nYdivisions);
1747 fYaxis.SetAxisColor(yAxisColor);
1748 fYaxis.SetLabelColor(yLabelColor);
1749 fYaxis.SetLabelFont(yLabelFont);
1750 fYaxis.SetLabelOffset(yLabelOffset);
1751 fYaxis.SetLabelSize(yLabelSize);
1752 fYaxis.SetTickLength(yTickLength);
1753 fYaxis.SetTitleOffset(yTitleOffset);
1754 fYaxis.SetTitleSize(yTitleSize);
1755 fYaxis.SetTitleColor(yTitleColor);
1756 fYaxis.SetTitleFont(yTitleFont);
1757
1758 if (resetStat) hnew->ResetStats();
1759
1760 delete [] oldBins;
1761 if (oldErrors) delete [] oldErrors;
1762 return hnew;
1763}
1764
1765
1766////////////////////////////////////////////////////////////////////////////////
1767
1768TProfile *TH2::DoProfile(bool onX, const char *name, Int_t firstbin, Int_t lastbin, Option_t *option) const
1769{
1770 TString opt = option;
1771 // extract cut infor
1772 TString cut;
1773 Int_t i1 = opt.Index("[");
1774 if (i1>=0) {
1775 Int_t i2 = opt.Index("]");
1776 cut = opt(i1,i2-i1+1);
1777 }
1778 opt.ToLower();
1779 bool originalRange = opt.Contains("o");
1780
1781 const TAxis& outAxis = ( onX ? fXaxis : fYaxis );
1782 const TAxis& inAxis = ( onX ? fYaxis : fXaxis );
1783 Int_t inN = inAxis.GetNbins();
1784 const char *expectedName = ( onX ? "_pfx" : "_pfy" );
1785
1786 // outer axis cannot be outside original axis (this fixes ROOT-8781)
1787 // and firstOutBin and lastOutBin cannot be both equal to zero
1788 Int_t firstOutBin = std::max(outAxis.GetFirst(),1);
1789 Int_t lastOutBin = std::min(outAxis.GetLast(),outAxis.GetNbins() ) ;
1790
1791 if ( lastbin < firstbin && inAxis.TestBit(TAxis::kAxisRange) ) {
1792 firstbin = inAxis.GetFirst();
1793 lastbin = inAxis.GetLast();
1794 // For special case of TAxis::SetRange, when first == 1 and last
1795 // = N and the range bit has been set, the TAxis will return 0
1796 // for both.
1797 if (firstbin == 0 && lastbin == 0)
1798 {
1799 firstbin = 1;
1800 lastbin = inAxis.GetNbins();
1801 }
1802 }
1803 if (firstbin < 0) firstbin = 1;
1804 if (lastbin < 0) lastbin = inN;
1805 if (lastbin > inN+1) lastbin = inN;
1806
1807 // Create the profile histogram
1808 char *pname = (char*)name;
1809 if (name && strcmp(name, expectedName) == 0) {
1810 Int_t nch = strlen(GetName()) + 5;
1811 pname = new char[nch];
1812 snprintf(pname,nch,"%s%s",GetName(),name);
1813 }
1814 TProfile *h1=0;
1815 //check if a profile with identical name exist
1816 // if compatible reset and re-use previous histogram
1817 TObject *h1obj = gROOT->FindObject(pname);
1818 if (h1obj && h1obj->InheritsFrom(TH1::Class())) {
1819 if (h1obj->IsA() != TProfile::Class() ) {
1820 Error("DoProfile","Histogram with name %s must be a TProfile and is a %s",name,h1obj->ClassName());
1821 return 0;
1822 }
1823 h1 = (TProfile*)h1obj;
1824 // reset the existing histogram and set always the new binning for the axis
1825 // This avoid problems when the histogram already exists and the histograms is rebinned or its range has changed
1826 // (see https://savannah.cern.ch/bugs/?94101 or https://savannah.cern.ch/bugs/?95808 )
1827 h1->Reset();
1828 const TArrayD *xbins = outAxis.GetXbins();
1829 if (xbins->fN == 0) {
1830 if ( originalRange )
1831 h1->SetBins(outAxis.GetNbins(),outAxis.GetXmin(),outAxis.GetXmax());
1832 else
1833 h1->SetBins(lastOutBin-firstOutBin+1,outAxis.GetBinLowEdge(firstOutBin),outAxis.GetBinUpEdge(lastOutBin));
1834 } else {
1835 // case variable bins
1836 if (originalRange )
1837 h1->SetBins(outAxis.GetNbins(),xbins->fArray);
1838 else
1839 h1->SetBins(lastOutBin-firstOutBin+1,&xbins->fArray[firstOutBin-1]);
1840 }
1841 }
1842
1843 Int_t ncuts = 0;
1844 if (opt.Contains("[")) {
1845 ((TH2 *)this)->GetPainter();
1846 if (fPainter) ncuts = fPainter->MakeCuts((char*)cut.Data());
1847 }
1848
1849 if (!h1) {
1850 const TArrayD *bins = outAxis.GetXbins();
1851 if (bins->fN == 0) {
1852 if ( originalRange )
1853 h1 = new TProfile(pname,GetTitle(),outAxis.GetNbins(),outAxis.GetXmin(),outAxis.GetXmax(),opt);
1854 else
1855 h1 = new TProfile(pname,GetTitle(),lastOutBin-firstOutBin+1,
1856 outAxis.GetBinLowEdge(firstOutBin),
1857 outAxis.GetBinUpEdge(lastOutBin), opt);
1858 } else {
1859 // case variable bins
1860 if (originalRange )
1861 h1 = new TProfile(pname,GetTitle(),outAxis.GetNbins(),bins->fArray,opt);
1862 else
1863 h1 = new TProfile(pname,GetTitle(),lastOutBin-firstOutBin+1,&bins->fArray[firstOutBin-1],opt);
1864 }
1865 }
1866 if (pname != name) delete [] pname;
1867
1868 // Copy attributes
1869 h1->GetXaxis()->ImportAttributes( &outAxis);
1870 h1->SetLineColor(this->GetLineColor());
1871 h1->SetFillColor(this->GetFillColor());
1872 h1->SetMarkerColor(this->GetMarkerColor());
1873 h1->SetMarkerStyle(this->GetMarkerStyle());
1874
1875 // check if histogram is weighted
1876 // in case need to store sum of weight square/bin for the profile
1877 TArrayD & binSumw2 = *(h1->GetBinSumw2());
1878 bool useWeights = (GetSumw2N() > 0);
1879 if (useWeights && (binSumw2.fN != h1->GetNcells()) ) h1->Sumw2();
1880 // we need to set this bit because we fill the profile using a single Fill for many entries
1881 // This is needed for the changes applied to make automatically the histogram weighted in ROOT 6 versions
1882 else h1->SetBit(TH1::kIsNotW);
1883
1884 // Fill the profile histogram
1885 // no entries/bin is available so can fill only using bin content as weight
1886 Double_t totcont = 0;
1887
1888 // implement filling of projected histogram
1889 // outbin is bin number of outAxis (the projected axis). Loop is done on all bin of TH2 histograms
1890 // inbin is the axis being integrated. Loop is done only on the selected bins
1891 for ( Int_t outbin = 0; outbin <= outAxis.GetNbins() + 1; ++outbin) {
1892 if (outAxis.TestBit(TAxis::kAxisRange) && ( outbin < firstOutBin || outbin > lastOutBin )) continue;
1893
1894 // find corresponding bin number in h1 for outbin (binOut)
1895 Double_t xOut = outAxis.GetBinCenter(outbin);
1896 Int_t binOut = h1->GetXaxis()->FindBin( xOut );
1897 if (binOut <0) continue;
1898
1899 for (Int_t inbin = firstbin ; inbin <= lastbin ; ++inbin) {
1900 Int_t binx, biny;
1901 if (onX) { binx = outbin; biny=inbin; }
1902 else { binx = inbin; biny=outbin; }
1903
1904 if (ncuts) {
1905 if (!fPainter->IsInside(binx,biny)) continue;
1906 }
1907 Int_t bin = GetBin(binx, biny);
1908 Double_t cxy = RetrieveBinContent(bin);
1909
1910
1911 if (cxy) {
1912 Double_t tmp = 0;
1913 // the following fill update wrongly the fBinSumw2- need to save it before
1914 if ( useWeights ) tmp = binSumw2.fArray[binOut];
1915 h1->Fill( xOut, inAxis.GetBinCenter(inbin), cxy );
1916 if ( useWeights ) binSumw2.fArray[binOut] = tmp + fSumw2.fArray[bin];
1917 totcont += cxy;
1918 }
1919
1920 }
1921 }
1922
1923 // the statistics must be recalculated since by using the Fill method the total sum of weight^2 is
1924 // not computed correctly
1925 // for a profile does not much sense to re-use statistics of original TH2
1926 h1->ResetStats();
1927 // Also we need to set the entries since they have not been correctly calculated during the projection
1928 // we can only set them to the effective entries
1930
1931
1932 if (opt.Contains("d")) {
1933 TVirtualPad *padsav = gPad;
1934 TVirtualPad *pad = gROOT->GetSelectedPad();
1935 if (pad) pad->cd();
1936 opt.Remove(opt.First("d"),1);
1937 if (!gPad || !gPad->FindObject(h1)) {
1938 h1->Draw(opt);
1939 } else {
1940 h1->Paint(opt);
1941 }
1942 if (padsav) padsav->cd();
1943 }
1944 return h1;
1945}
1946
1947
1948////////////////////////////////////////////////////////////////////////////////
1949/// Project a 2-D histogram into a profile histogram along X.
1950///
1951/// The projection is made from the channels along the Y axis
1952/// ranging from firstybin to lastybin included.
1953/// By default, bins 1 to ny are included
1954/// When all bins are included, the number of entries in the projection
1955/// is set to the number of entries of the 2-D histogram, otherwise
1956/// the number of entries is incremented by 1 for all non empty cells.
1957///
1958/// if option "d" is specified, the profile is drawn in the current pad.
1959///
1960/// if option "o" original axis range of the target axes will be
1961/// kept, but only bins inside the selected range will be filled.
1962///
1963/// The option can also be used to specify the projected profile error type.
1964/// Values which can be used are 's', 'i', or 'g'. See TProfile::BuildOptions for details
1965///
1966/// Using a TCutG object, it is possible to select a sub-range of a 2-D histogram.
1967/// One must create a graphical cut (mouse or C++) and specify the name
1968/// of the cut between [] in the option.
1969/// For example, with a TCutG named "cutg", one can call:
1970/// myhist->ProfileX(" ",firstybin,lastybin,"[cutg]");
1971/// To invert the cut, it is enough to put a "-" in front of its name:
1972/// myhist->ProfileX(" ",firstybin,lastybin,"[-cutg]");
1973/// It is possible to apply several cuts ("," means logical AND):
1974/// myhist->ProfileX(" ",firstybin,lastybin,"[cutg1,cutg2]");
1975///
1976/// NOTE that if a TProfile named "name" exists in the current directory or pad with
1977/// a compatible axis the profile is reset and filled again with the projected contents of the TH2.
1978/// In the case of axis incompatibility an error is reported and a NULL pointer is returned.
1979///
1980/// NOTE that the X axis attributes of the TH2 are copied to the X axis of the profile.
1981///
1982/// NOTE that the default under- / overflow behavior differs from what ProjectionX
1983/// does! Profiles take the bin center into account, so here the under- and overflow
1984/// bins are ignored by default.
1985///
1986/// NOTE that the return profile histogram is computed using the Y bin center values instead of
1987/// the real Y values which are used to fill the 2d histogram. Therefore the obtained profile is just an approximation of the
1988/// correct profile histogram that would be obtained when filling it directly with the original data (see ROOT-7770)
1989
1990
1991TProfile *TH2::ProfileX(const char *name, Int_t firstybin, Int_t lastybin, Option_t *option) const
1992{
1993 return DoProfile(true, name, firstybin, lastybin, option);
1994
1995}
1996
1997
1998////////////////////////////////////////////////////////////////////////////////
1999/// Project a 2-D histogram into a profile histogram along Y.
2000///
2001/// The projection is made from the channels along the X axis
2002/// ranging from firstxbin to lastxbin included.
2003/// By default, bins 1 to nx are included
2004/// When all bins are included, the number of entries in the projection
2005/// is set to the number of entries of the 2-D histogram, otherwise
2006/// the number of entries is incremented by 1 for all non empty cells.
2007///
2008/// if option "d" is specified, the profile is drawn in the current pad.
2009///
2010/// if option "o" , the original axis range of the target axis will be
2011/// kept, but only bins inside the selected range will be filled.
2012///
2013/// The option can also be used to specify the projected profile error type.
2014/// Values which can be used are 's', 'i', or 'g'. See TProfile::BuildOptions for details
2015/// Using a TCutG object, it is possible to select a sub-range of a 2-D histogram.
2016///
2017/// One must create a graphical cut (mouse or C++) and specify the name
2018/// of the cut between [] in the option.
2019/// For example, with a TCutG named "cutg", one can call:
2020/// myhist->ProfileY(" ",firstybin,lastybin,"[cutg]");
2021/// To invert the cut, it is enough to put a "-" in front of its name:
2022/// myhist->ProfileY(" ",firstybin,lastybin,"[-cutg]");
2023/// It is possible to apply several cuts:
2024/// myhist->ProfileY(" ",firstybin,lastybin,"[cutg1,cutg2]");
2025///
2026/// NOTE that if a TProfile named "name" exists in the current directory or pad with
2027/// a compatible axis the profile is reset and filled again with the projected contents of the TH2.
2028/// In the case of axis incompatibility an error is reported and a NULL pointer is returned.
2029///
2030/// NOTE that the Y axis attributes of the TH2 are copied to the X axis of the profile.
2031///
2032/// NOTE that the default under- / overflow behavior differs from what ProjectionX
2033/// does! Profiles take the bin center into account, so here the under- and overflow
2034/// bins are ignored by default.
2035///
2036/// NOTE that the return profile histogram is computed using the X bin center values instead of
2037/// the real X values which are used to fill the 2d histogram. Therefore the obtained profile is just an approximation of the
2038/// correct profile histogram that would be obtained when filling it directly with the original data (see ROOT-7770)
2039
2040
2041TProfile *TH2::ProfileY(const char *name, Int_t firstxbin, Int_t lastxbin, Option_t *option) const
2042{
2043 return DoProfile(false, name, firstxbin, lastxbin, option);
2044}
2045
2046
2047////////////////////////////////////////////////////////////////////////////////
2048/// Internal (protected) method for performing projection on the X or Y axis
2049/// called by ProjectionX or ProjectionY
2050
2051TH1D *TH2::DoProjection(bool onX, const char *name, Int_t firstbin, Int_t lastbin, Option_t *option) const
2052{
2053 const char *expectedName = 0;
2054 Int_t inNbin;
2055 const TAxis* outAxis;
2056 const TAxis* inAxis;
2057
2058 TString opt = option;
2059 TString cut;
2060 Int_t i1 = opt.Index("[");
2061 if (i1>=0) {
2062 Int_t i2 = opt.Index("]");
2063 cut = opt(i1,i2-i1+1);
2064 }
2065 opt.ToLower(); //must be called after having parsed the cut name
2066 bool originalRange = opt.Contains("o");
2067
2068 if ( onX )
2069 {
2070 expectedName = "_px";
2071 inNbin = fYaxis.GetNbins();
2072 outAxis = GetXaxis();
2073 inAxis = GetYaxis();
2074 }
2075 else
2076 {
2077 expectedName = "_py";
2078 inNbin = fXaxis.GetNbins();
2079 outAxis = GetYaxis();
2080 inAxis = GetXaxis();
2081 }
2082
2083 // outer axis cannot be outside original axis (this fixes ROOT-8781)
2084 // and firstOutBin and lastOutBin cannot be both equal to zero
2085 Int_t firstOutBin = std::max(outAxis->GetFirst(),1);
2086 Int_t lastOutBin = std::min(outAxis->GetLast(),outAxis->GetNbins() ) ;
2087
2088 if ( lastbin < firstbin && inAxis->TestBit(TAxis::kAxisRange) ) {
2089 firstbin = inAxis->GetFirst();
2090 lastbin = inAxis->GetLast();
2091 // For special case of TAxis::SetRange, when first == 1 and last
2092 // = N and the range bit has been set, the TAxis will return 0
2093 // for both.
2094 if (firstbin == 0 && lastbin == 0)
2095 {
2096 firstbin = 1;
2097 lastbin = inAxis->GetNbins();
2098 }
2099 }
2100 if (firstbin < 0) firstbin = 0;
2101 if (lastbin < 0) lastbin = inNbin + 1;
2102 if (lastbin > inNbin+1) lastbin = inNbin + 1;
2103
2104 // Create the projection histogram
2105 char *pname = (char*)name;
2106 if (name && strcmp(name,expectedName) == 0) {
2107 Int_t nch = strlen(GetName()) + 4;
2108 pname = new char[nch];
2109 snprintf(pname,nch,"%s%s",GetName(),name);
2110 }
2111 TH1D *h1=0;
2112 //check if histogram with identical name exist
2113 // if compatible reset and re-use previous histogram
2114 // (see https://savannah.cern.ch/bugs/?54340)
2115 TObject *h1obj = gROOT->FindObject(pname);
2116 if (h1obj && h1obj->InheritsFrom(TH1::Class())) {
2117 if (h1obj->IsA() != TH1D::Class() ) {
2118 Error("DoProjection","Histogram with name %s must be a TH1D and is a %s",name,h1obj->ClassName());
2119 return 0;
2120 }
2121 h1 = (TH1D*)h1obj;
2122 // reset the existing histogram and set always the new binning for the axis
2123 // This avoid problems when the histogram already exists and the histograms is rebinned or its range has changed
2124 // (see https://savannah.cern.ch/bugs/?94101 or https://savannah.cern.ch/bugs/?95808 )
2125 h1->Reset();
2126 const TArrayD *xbins = outAxis->GetXbins();
2127 if (xbins->fN == 0) {
2128 if ( originalRange )
2129 h1->SetBins(outAxis->GetNbins(),outAxis->GetXmin(),outAxis->GetXmax());
2130 else
2131 h1->SetBins(lastOutBin-firstOutBin+1,outAxis->GetBinLowEdge(firstOutBin),outAxis->GetBinUpEdge(lastOutBin));
2132 } else {
2133 // case variable bins
2134 if (originalRange )
2135 h1->SetBins(outAxis->GetNbins(),xbins->fArray);
2136 else
2137 h1->SetBins(lastOutBin-firstOutBin+1,&xbins->fArray[firstOutBin-1]);
2138 }
2139 }
2140
2141 Int_t ncuts = 0;
2142 if (opt.Contains("[")) {
2143 ((TH2 *)this)->GetPainter();
2144 if (fPainter) ncuts = fPainter->MakeCuts((char*)cut.Data());
2145 }
2146
2147 if (!h1) {
2148 const TArrayD *bins = outAxis->GetXbins();
2149 if (bins->fN == 0) {
2150 if ( originalRange )
2151 h1 = new TH1D(pname,GetTitle(),outAxis->GetNbins(),outAxis->GetXmin(),outAxis->GetXmax());
2152 else
2153 h1 = new TH1D(pname,GetTitle(),lastOutBin-firstOutBin+1,
2154 outAxis->GetBinLowEdge(firstOutBin),outAxis->GetBinUpEdge(lastOutBin));
2155 } else {
2156 // case variable bins
2157 if (originalRange )
2158 h1 = new TH1D(pname,GetTitle(),outAxis->GetNbins(),bins->fArray);
2159 else
2160 h1 = new TH1D(pname,GetTitle(),lastOutBin-firstOutBin+1,&bins->fArray[firstOutBin-1]);
2161 }
2162 if (opt.Contains("e") || GetSumw2N() ) h1->Sumw2();
2163 }
2164 if (pname != name) delete [] pname;
2165
2166 // Copy the axis attributes and the axis labels if needed.
2167 h1->GetXaxis()->ImportAttributes(outAxis);
2168 THashList* labels=outAxis->GetLabels();
2169 if (labels) {
2170 TIter iL(labels);
2171 TObjString* lb;
2172 Int_t i = 1;
2173 while ((lb=(TObjString*)iL())) {
2174 h1->GetXaxis()->SetBinLabel(i,lb->String().Data());
2175 i++;
2176 }
2177 }
2178
2179 h1->SetLineColor(this->GetLineColor());
2180 h1->SetFillColor(this->GetFillColor());
2181 h1->SetMarkerColor(this->GetMarkerColor());
2182 h1->SetMarkerStyle(this->GetMarkerStyle());
2183
2184 // Fill the projected histogram
2185 Double_t cont,err2;
2186 Double_t totcont = 0;
2187 Bool_t computeErrors = h1->GetSumw2N();
2188
2189 // implement filling of projected histogram
2190 // outbin is bin number of outAxis (the projected axis). Loop is done on all bin of TH2 histograms
2191 // inbin is the axis being integrated. Loop is done only on the selected bins
2192 for ( Int_t outbin = 0; outbin <= outAxis->GetNbins() + 1; ++outbin) {
2193 err2 = 0;
2194 cont = 0;
2195 if (outAxis->TestBit(TAxis::kAxisRange) && ( outbin < firstOutBin || outbin > lastOutBin )) continue;
2196
2197 for (Int_t inbin = firstbin ; inbin <= lastbin ; ++inbin) {
2198 Int_t binx, biny;
2199 if (onX) { binx = outbin; biny=inbin; }
2200 else { binx = inbin; biny=outbin; }
2201
2202 if (ncuts) {
2203 if (!fPainter->IsInside(binx,biny)) continue;
2204 }
2205 // sum bin content and error if needed
2206 cont += GetBinContent(binx,biny);
2207 if (computeErrors) {
2208 Double_t exy = GetBinError(binx,biny);
2209 err2 += exy*exy;
2210 }
2211 }
2212 // find corresponding bin number in h1 for outbin
2213 Int_t binOut = h1->GetXaxis()->FindBin( outAxis->GetBinCenter(outbin) );
2214 h1->SetBinContent(binOut ,cont);
2215 if (computeErrors) h1->SetBinError(binOut,TMath::Sqrt(err2));
2216 // sum all content
2217 totcont += cont;
2218 }
2219
2220 // check if we can re-use the original statistics from the previous histogram
2221 bool reuseStats = false;
2222 if ( ( GetStatOverflowsBehaviour() == false && firstbin == 1 && lastbin == inNbin ) ||
2223 ( GetStatOverflowsBehaviour() == true && firstbin == 0 && lastbin == inNbin + 1 ) )
2224 reuseStats = true;
2225 else {
2226 // also if total content match we can re-use
2227 double eps = 1.E-12;
2228 if (IsA() == TH2F::Class() ) eps = 1.E-6;
2229 if (fTsumw != 0 && TMath::Abs( fTsumw - totcont) < TMath::Abs(fTsumw) * eps)
2230 reuseStats = true;
2231 }
2232 if (ncuts) reuseStats = false;
2233 // retrieve the statistics and set in projected histogram if we can re-use it
2234 bool reuseEntries = reuseStats;
2235 // can re-use entries if underflow/overflow are included
2236 reuseEntries &= (firstbin==0 && lastbin == inNbin+1);
2237 if (reuseStats) {
2238 Double_t stats[kNstat];
2239 GetStats(stats);
2240 if (!onX) { // case of projection on Y
2241 stats[2] = stats[4];
2242 stats[3] = stats[5];
2243 }
2244 h1->PutStats(stats);
2245 }
2246 else {
2247 // the statistics is automatically recalculated since it is reset by the call to SetBinContent
2248 // we just need to set the entries since they have not been correctly calculated during the projection
2249 // we can only set them to the effective entries
2251 }
2252 if (reuseEntries) {
2254 }
2255 else {
2256 // re-compute the entries
2257 // in case of error calculation (i.e. when Sumw2() is set)
2258 // use the effective entries for the entries
2259 // since this is the only way to estimate them
2260 Double_t entries = TMath::Floor( totcont + 0.5); // to avoid numerical rounding
2261 if (h1->GetSumw2N()) entries = h1->GetEffectiveEntries();
2262 h1->SetEntries( entries );
2263 }
2264
2265 if (opt.Contains("d")) {
2266 TVirtualPad *padsav = gPad;
2267 TVirtualPad *pad = gROOT->GetSelectedPad();
2268 if (pad) pad->cd();
2269 opt.Remove(opt.First("d"),1);
2270 // remove also other options
2271 if (opt.Contains("e")) opt.Remove(opt.First("e"),1);
2272 if (!gPad || !gPad->FindObject(h1)) {
2273 h1->Draw(opt);
2274 } else {
2275 h1->Paint(opt);
2276 }
2277 if (padsav) padsav->cd();
2278 }
2279
2280 return h1;
2281}
2282
2283
2284////////////////////////////////////////////////////////////////////////////////
2285/// Project a 2-D histogram into a 1-D histogram along X.
2286///
2287/// The projection is always of the type TH1D.
2288/// The projection is made from the channels along the Y axis
2289/// ranging from firstybin to lastybin included.
2290/// By default, all bins including under- and overflow are included.
2291/// The number of entries in the projection is estimated from the
2292/// number of effective entries for all the cells included in the projection.
2293///
2294/// To exclude the underflow bins in Y, use firstybin=1.
2295/// To exclude the overflow bins in Y, use lastybin=nx.
2296///
2297/// if option "e" is specified, the errors are computed.
2298/// if option "d" is specified, the projection is drawn in the current pad.
2299/// if option "o" original axis range of the taget axes will be
2300/// kept, but only bins inside the selected range will be filled.
2301///
2302/// Using a TCutG object, it is possible to select a sub-range of a 2-D histogram.
2303/// One must create a graphical cut (mouse or C++) and specify the name
2304/// of the cut between [] in the option.
2305/// For example, with a TCutG named "cutg", one can call:
2306/// myhist->ProjectionX(" ",firstybin,lastybin,"[cutg]");
2307/// To invert the cut, it is enough to put a "-" in front of its name:
2308/// myhist->ProjectionX(" ",firstybin,lastybin,"[-cutg]");
2309/// It is possible to apply several cuts:
2310/// myhist->ProjectionX(" ",firstybin,lastybin,"[cutg1,cutg2]");
2311///
2312/// NOTE that if a TH1D named "name" exists in the current directory or pad
2313/// the histogram is reset and filled again with the projected contents of the TH2.
2314///
2315/// NOTE that the X axis attributes of the TH2 are copied to the X axis of the projection.
2316
2317TH1D *TH2::ProjectionX(const char *name, Int_t firstybin, Int_t lastybin, Option_t *option) const
2318{
2319 return DoProjection(true, name, firstybin, lastybin, option);
2320}
2321
2322
2323////////////////////////////////////////////////////////////////////////////////
2324/// Project a 2-D histogram into a 1-D histogram along Y.
2325///
2326/// The projection is always of the type TH1D.
2327/// The projection is made from the channels along the X axis
2328/// ranging from firstxbin to lastxbin included.
2329/// By default, all bins including under- and overflow are included.
2330/// The number of entries in the projection is estimated from the
2331/// number of effective entries for all the cells included in the projection
2332///
2333/// To exclude the underflow bins in X, use firstxbin=1.
2334/// To exclude the overflow bins in X, use lastxbin=nx.
2335///
2336/// if option "e" is specified, the errors are computed.
2337/// if option "d" is specified, the projection is drawn in the current pad.
2338/// if option "o" original axis range of the taget axes will be
2339/// kept, but only bins inside the selected range will be filled.
2340///
2341/// Using a TCutG object, it is possible to select a sub-range of a 2-D histogram.
2342/// One must create a graphical cut (mouse or C++) and specify the name
2343/// of the cut between [] in the option.
2344/// For example, with a TCutG named "cutg", one can call:
2345/// myhist->ProjectionY(" ",firstxbin,lastxbin,"[cutg]");
2346/// To invert the cut, it is enough to put a "-" in front of its name:
2347/// myhist->ProjectionY(" ",firstxbin,lastxbin,"[-cutg]");
2348/// It is possible to apply several cuts:
2349/// myhist->ProjectionY(" ",firstxbin,lastxbin,"[cutg1,cutg2]");
2350///
2351/// NOTE that if a TH1D named "name" exists in the current directory or pad and having
2352/// a compatible axis, the histogram is reset and filled again with the projected contents of the TH2.
2353/// In the case of axis incompatibility, an error is reported and a NULL pointer is returned.
2354///
2355/// NOTE that the Y axis attributes of the TH2 are copied to the X axis of the projection.
2356
2357TH1D *TH2::ProjectionY(const char *name, Int_t firstxbin, Int_t lastxbin, Option_t *option) const
2358{
2359 return DoProjection(false, name, firstxbin, lastxbin, option);
2360}
2361
2362
2363////////////////////////////////////////////////////////////////////////////////
2364/// Replace current statistics with the values in array stats
2365
2367{
2368 TH1::PutStats(stats);
2369 fTsumwy = stats[4];
2370 fTsumwy2 = stats[5];
2371 fTsumwxy = stats[6];
2372}
2373
2374
2375////////////////////////////////////////////////////////////////////////////////
2376/// Compute the X distribution of quantiles in the other variable Y
2377/// name is the name of the returned histogram
2378/// prob is the probability content for the quantile (0.5 is the default for the median)
2379/// An approximate error for the quantile is computed assuming that the distribution in
2380/// the other variable is normal. According to this approximate formula the error on the quantile is
2381/// estimated as sqrt( p (1-p) / ( n * f(q)^2) ), where p is the probability content of the quantile and
2382/// n is the number of events used to compute the quantile and f(q) is the probability distribution for the
2383/// other variable evaluated at the obtained quantile. In the error estimation the probability is then assumed to be
2384/// a normal distribution.
2385
2386TH1D* TH2::QuantilesX( Double_t prob, const char * name) const
2387{
2388 return DoQuantiles(true, name, prob);
2389}
2390
2391
2392////////////////////////////////////////////////////////////////////////////////
2393/// Compute the Y distribution of quantiles in the other variable X
2394/// name is the name of the returned histogram
2395/// prob is the probability content for the quantile (0.5 is the default for the median)
2396/// An approximate error for the quantile is computed assuming that the distribution in
2397/// the other variable is normal.
2398
2399TH1D* TH2::QuantilesY( Double_t prob, const char * name) const
2400{
2401 return DoQuantiles(false, name, prob);
2402}
2403
2404
2405////////////////////////////////////////////////////////////////////////////////
2406/// Implementation of quantiles for x or y
2407
2408TH1D* TH2::DoQuantiles(bool onX, const char * name, Double_t prob) const
2409{
2410 const TAxis *outAxis = 0;
2411 const TAxis *inAxis = 0;
2412 if ( onX ) {
2413 outAxis = GetXaxis();
2414 inAxis = GetYaxis();
2415 } else {
2416 outAxis = GetYaxis();
2417 inAxis = GetXaxis();
2418 }
2419
2420 // build first name of returned histogram
2421 TString qname = name;
2422 if (qname.IsNull() || qname == "_qx" || qname == "_qy") {
2423 const char * qtype = (onX) ? "qx" : "qy";
2424 qname = TString::Format("%s_%s_%3.2f",GetName(),qtype, prob);
2425 }
2426 // check if the histogram is already existing
2427 TH1D *h1=0;
2428 //check if histogram with identical name exist
2429 TObject *h1obj = gROOT->FindObject(qname);
2430 if (h1obj) {
2431 h1 = dynamic_cast<TH1D*>(h1obj);
2432 if (!h1) {
2433 Error("DoQuantiles","Histogram with name %s must be a TH1D and is a %s",qname.Data(),h1obj->ClassName());
2434 return 0;
2435 }
2436 }
2437 if (h1) {
2438 h1->Reset();
2439 } else {
2440 // create the histogram
2441 h1 = new TH1D(qname, GetTitle(), 1, 0, 1);
2442 }
2443 // set the bin content
2444 Int_t firstOutBin = std::max(outAxis->GetFirst(),1);
2445 Int_t lastOutBin = std::max(outAxis->GetLast(),outAxis->GetNbins());
2446 const TArrayD *xbins = outAxis->GetXbins();
2447 if (xbins->fN == 0)
2448 h1->SetBins(lastOutBin-firstOutBin+1,outAxis->GetBinLowEdge(firstOutBin),outAxis->GetBinUpEdge(lastOutBin));
2449 else
2450 h1->SetBins(lastOutBin-firstOutBin+1,&xbins->fArray[firstOutBin-1]);
2451
2452 // set the bin content of the histogram
2453 Double_t pp[1];
2454 pp[0] = prob;
2455
2456 TH1D * slice = 0;
2457 for (int ibin = inAxis->GetFirst() ; ibin <= inAxis->GetLast() ; ++ibin) {
2458 Double_t qq[1];
2459 // do a projection on the opposite axis
2460 slice = DoProjection(!onX, "tmp",ibin,ibin,"");
2461 if (!slice) break;
2462 if (slice->GetSum() == 0) continue;
2463 slice->GetQuantiles(1,qq,pp);
2464 h1->SetBinContent(ibin,qq[0]);
2465 // compute error using normal approximation
2466 // quantile error ~ sqrt (q*(1-q)/ *( n * f(xq)^2 ) from Kendall
2467 // where f(xq) is the p.d.f value at the quantile xq
2468 Double_t n = slice->GetEffectiveEntries();
2469 Double_t f = TMath::Gaus(qq[0], slice->GetMean(), slice->GetStdDev(), kTRUE);
2470 Double_t error = 0;
2471 // set the errors to zero in case of small statistics
2472 if (f > 0 && n > 1)
2473 error = TMath::Sqrt( prob*(1.-prob)/ (n * f * f) );
2474 h1->SetBinError(ibin, error);
2475 }
2476 if (slice) delete slice;
2477 return h1;
2478}
2479
2480
2481////////////////////////////////////////////////////////////////////////////////
2482/// Reset this histogram: contents, errors, etc.
2483
2485{
2486 TH1::Reset(option);
2487 TString opt = option;
2488 opt.ToUpper();
2489
2490 if (opt.Contains("ICE") && !opt.Contains("S")) return;
2491 fTsumwy = 0;
2492 fTsumwy2 = 0;
2493 fTsumwxy = 0;
2494}
2495
2496
2497////////////////////////////////////////////////////////////////////////////////
2498/// Set bin content
2499
2501{
2502 fEntries++;
2503 fTsumw = 0;
2504 if (bin < 0) return;
2505 if (bin >= fNcells) return;
2506 UpdateBinContent(bin, content);
2507}
2508
2509
2510////////////////////////////////////////////////////////////////////////////////
2511/// When the mouse is moved in a pad containing a 2-d view of this histogram
2512/// a second canvas shows the projection along X corresponding to the
2513/// mouse position along Y.
2514/// To stop the generation of the projections, delete the canvas
2515/// containing the projection.
2516
2518{
2519 GetPainter();
2520
2521 if (fPainter) fPainter->SetShowProjection("x",nbins);
2522}
2523
2524
2525////////////////////////////////////////////////////////////////////////////////
2526/// When the mouse is moved in a pad containing a 2-d view of this histogram
2527/// a second canvas shows the projection along Y corresponding to the
2528/// mouse position along X.
2529/// To stop the generation of the projections, delete the canvas
2530/// containing the projection.
2531
2533{
2534 GetPainter();
2535
2536 if (fPainter) fPainter->SetShowProjection("y",nbins);
2537}
2538
2539
2540////////////////////////////////////////////////////////////////////////////////
2541/// This function calculates the background spectrum in this histogram.
2542/// The background is returned as a histogram.
2543/// to be implemented (may be)
2544
2546{
2547
2548 return (TH1*)gROOT->ProcessLineFast(Form("TSpectrum2::StaticBackground((TH1*)0x%lx,%d,\"%s\")",
2549 (ULong_t)this, niter, option));
2550}
2551
2552
2553////////////////////////////////////////////////////////////////////////////////
2554///Interface to TSpectrum2::Search
2555///the function finds peaks in this histogram where the width is > sigma
2556///and the peak maximum greater than threshold*maximum bin content of this.
2557///for more details see TSpectrum::Search.
2558///note the difference in the default value for option compared to TSpectrum2::Search
2559///option="" by default (instead of "goff")
2560
2562{
2563
2564 return (Int_t)gROOT->ProcessLineFast(Form("TSpectrum2::StaticSearch((TH1*)0x%lx,%g,\"%s\",%g)",
2565 (ULong_t)this, sigma, option, threshold));
2566}
2567
2568
2569////////////////////////////////////////////////////////////////////////////////
2570/// Smooth bin contents of this 2-d histogram using kernel algorithms
2571/// similar to the ones used in the raster graphics community.
2572/// Bin contents in the active range are replaced by their smooth values.
2573/// If Errors are defined via Sumw2, they are also scaled and computed.
2574/// However, note the resulting errors will be correlated between different-bins, so
2575/// the errors should not be used blindly to perform any calculation involving several bins,
2576/// like fitting the histogram. One would need to compute also the bin by bin correlation matrix.
2577///
2578/// 3 kernels are proposed k5a, k5b and k3a.
2579/// k5a and k5b act on 5x5 cells (i-2,i-1,i,i+1,i+2, and same for j)
2580/// k5b is a bit more stronger in smoothing
2581/// k3a acts only on 3x3 cells (i-1,i,i+1, and same for j).
2582/// By default the kernel "k5a" is used. You can select the kernels "k5b" or "k3a"
2583/// via the option argument.
2584/// If TAxis::SetRange has been called on the x or/and y axis, only the bins
2585/// in the specified range are smoothed.
2586/// In the current implementation if the first argument is not used (default value=1).
2587///
2588/// implementation by David McKee (dmckee@bama.ua.edu). Extended by Rene Brun
2589
2590void TH2::Smooth(Int_t ntimes, Option_t *option)
2591{
2592 Double_t k5a[5][5] = { { 0, 0, 1, 0, 0 },
2593 { 0, 2, 2, 2, 0 },
2594 { 1, 2, 5, 2, 1 },
2595 { 0, 2, 2, 2, 0 },
2596 { 0, 0, 1, 0, 0 } };
2597 Double_t k5b[5][5] = { { 0, 1, 2, 1, 0 },
2598 { 1, 2, 4, 2, 1 },
2599 { 2, 4, 8, 4, 2 },
2600 { 1, 2, 4, 2, 1 },
2601 { 0, 1, 2, 1, 0 } };
2602 Double_t k3a[3][3] = { { 0, 1, 0 },
2603 { 1, 2, 1 },
2604 { 0, 1, 0 } };
2605
2606 if (ntimes > 1) {
2607 Warning("Smooth","Currently only ntimes=1 is supported");
2608 }
2609 TString opt = option;
2610 opt.ToLower();
2611 Int_t ksize_x=5;
2612 Int_t ksize_y=5;
2613 Double_t *kernel = &k5a[0][0];
2614 if (opt.Contains("k5b")) kernel = &k5b[0][0];
2615 if (opt.Contains("k3a")) {
2616 kernel = &k3a[0][0];
2617 ksize_x=3;
2618 ksize_y=3;
2619 }
2620
2621 // find i,j ranges
2622 Int_t ifirst = fXaxis.GetFirst();
2623 Int_t ilast = fXaxis.GetLast();
2624 Int_t jfirst = fYaxis.GetFirst();
2625 Int_t jlast = fYaxis.GetLast();
2626
2627 // Determine the size of the bin buffer(s) needed
2629 Int_t nx = GetNbinsX();
2630 Int_t ny = GetNbinsY();
2631 Int_t bufSize = (nx+2)*(ny+2);
2632 Double_t *buf = new Double_t[bufSize];
2633 Double_t *ebuf = 0;
2634 if (fSumw2.fN) ebuf = new Double_t[bufSize];
2635
2636 // Copy all the data to the temporary buffers
2637 Int_t i,j,bin;
2638 for (i=ifirst; i<=ilast; i++){
2639 for (j=jfirst; j<=jlast; j++){
2640 bin = GetBin(i,j);
2641 buf[bin] = RetrieveBinContent(bin);
2642 if (ebuf) ebuf[bin]=GetBinError(bin);
2643 }
2644 }
2645
2646 // Kernel tail sizes (kernel sizes must be odd for this to work!)
2647 Int_t x_push = (ksize_x-1)/2;
2648 Int_t y_push = (ksize_y-1)/2;
2649
2650 // main work loop
2651 for (i=ifirst; i<=ilast; i++){
2652 for (j=jfirst; j<=jlast; j++) {
2653 Double_t content = 0.0;
2654 Double_t error = 0.0;
2655 Double_t norm = 0.0;
2656
2657 for (Int_t n=0; n<ksize_x; n++) {
2658 for (Int_t m=0; m<ksize_y; m++) {
2659 Int_t xb = i+(n-x_push);
2660 Int_t yb = j+(m-y_push);
2661 if ( (xb >= 1) && (xb <= nx) && (yb >= 1) && (yb <= ny) ) {
2662 bin = GetBin(xb,yb);
2663 Double_t k = kernel[n*ksize_y +m];
2664 //if ( (k != 0.0 ) && (buf[bin] != 0.0) ) { // General version probably does not want the second condition
2665 if ( k != 0.0 ) {
2666 norm += k;
2667 content += k*buf[bin];
2668 if (ebuf) error += k*k*ebuf[bin]*ebuf[bin];
2669 }
2670 }
2671 }
2672 }
2673
2674 if ( norm != 0.0 ) {
2675 SetBinContent(i,j,content/norm);
2676 if (ebuf) {
2677 error /= (norm*norm);
2678 SetBinError(i,j,sqrt(error));
2679 }
2680 }
2681 }
2682 }
2684
2685 delete [] buf;
2686 delete [] ebuf;
2687}
2688
2689
2690////////////////////////////////////////////////////////////////////////////////
2691/// Stream an object of class TH2.
2692
2693void TH2::Streamer(TBuffer &R__b)
2694{
2695 if (R__b.IsReading()) {
2696 UInt_t R__s, R__c;
2697 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2698 if (R__v > 2) {
2699 R__b.ReadClassBuffer(TH2::Class(), this, R__v, R__s, R__c);
2700 return;
2701 }
2702 //====process old versions before automatic schema evolution
2703 TH1::Streamer(R__b);
2704 R__b >> fScalefactor;
2705 R__b >> fTsumwy;
2706 R__b >> fTsumwy2;
2707 R__b >> fTsumwxy;
2708 //====end of old versions
2709
2710 } else {
2711 R__b.WriteClassBuffer(TH2::Class(),this);
2712 }
2713}
2714
2715
2716//______________________________________________________________________________
2717// TH2C methods
2718// TH2C a 2-D histogram with one byte per cell (char)
2719//______________________________________________________________________________
2720
2721ClassImp(TH2C);
2722
2723
2724////////////////////////////////////////////////////////////////////////////////
2725/// Constructor.
2726
2728{
2729 SetBinsLength(9);
2730 if (fgDefaultSumw2) Sumw2();
2731}
2732
2733
2734////////////////////////////////////////////////////////////////////////////////
2735/// Destructor.
2736
2738{
2739}
2740
2741
2742////////////////////////////////////////////////////////////////////////////////
2743/// Constructor.
2744
2745TH2C::TH2C(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
2746 ,Int_t nbinsy,Double_t ylow,Double_t yup)
2747 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ylow,yup)
2748{
2750 if (fgDefaultSumw2) Sumw2();
2751
2752 if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
2753}
2754
2755
2756////////////////////////////////////////////////////////////////////////////////
2757/// Constructor.
2758
2759TH2C::TH2C(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
2760 ,Int_t nbinsy,Double_t ylow,Double_t yup)
2761 :TH2(name,title,nbinsx,xbins,nbinsy,ylow,yup)
2762{
2764 if (fgDefaultSumw2) Sumw2();
2765}
2766
2767
2768////////////////////////////////////////////////////////////////////////////////
2769/// Constructor.
2770
2771TH2C::TH2C(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
2772 ,Int_t nbinsy,const Double_t *ybins)
2773 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ybins)
2774{
2776 if (fgDefaultSumw2) Sumw2();
2777}
2778
2779
2780////////////////////////////////////////////////////////////////////////////////
2781/// Constructor.
2782
2783TH2C::TH2C(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
2784 ,Int_t nbinsy,const Double_t *ybins)
2785 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
2786{
2788 if (fgDefaultSumw2) Sumw2();
2789}
2790
2791
2792////////////////////////////////////////////////////////////////////////////////
2793/// Constructor.
2794
2795TH2C::TH2C(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
2796 ,Int_t nbinsy,const Float_t *ybins)
2797 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
2798{
2800 if (fgDefaultSumw2) Sumw2();
2801}
2802
2803
2804////////////////////////////////////////////////////////////////////////////////
2805/// Copy constructor.
2806
2807TH2C::TH2C(const TH2C &h2c) : TH2(), TArrayC()
2808{
2809 ((TH2C&)h2c).Copy(*this);
2810}
2811
2812
2813////////////////////////////////////////////////////////////////////////////////
2814/// Increment bin content by 1.
2815
2817{
2818 if (fArray[bin] < 127) fArray[bin]++;
2819}
2820
2821
2822////////////////////////////////////////////////////////////////////////////////
2823/// Increment bin content by w.
2824
2826{
2827 Int_t newval = fArray[bin] + Int_t(w);
2828 if (newval > -128 && newval < 128) {fArray[bin] = Char_t(newval); return;}
2829 if (newval < -127) fArray[bin] = -127;
2830 if (newval > 127) fArray[bin] = 127;
2831}
2832
2833
2834////////////////////////////////////////////////////////////////////////////////
2835/// Copy.
2836
2837void TH2C::Copy(TObject &newth2) const
2838{
2839 TH2::Copy((TH2C&)newth2);
2840}
2841
2842
2843////////////////////////////////////////////////////////////////////////////////
2844/// Reset this histogram: contents, errors, etc.
2845
2847{
2848 TH2::Reset(option);
2850}
2851
2852
2853////////////////////////////////////////////////////////////////////////////////
2854/// Set total number of bins including under/overflow
2855/// Reallocate bin contents array
2856
2858{
2859 if (n < 0) n = (fXaxis.GetNbins()+2)*(fYaxis.GetNbins()+2);
2860 fNcells = n;
2861 TArrayC::Set(n);
2862}
2863
2864
2865////////////////////////////////////////////////////////////////////////////////
2866/// Stream an object of class TH2C.
2867
2868void TH2C::Streamer(TBuffer &R__b)
2869{
2870 if (R__b.IsReading()) {
2871 UInt_t R__s, R__c;
2872 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2873 if (R__v > 2) {
2874 R__b.ReadClassBuffer(TH2C::Class(), this, R__v, R__s, R__c);
2875 return;
2876 }
2877 //====process old versions before automatic schema evolution
2878 if (R__v < 2) {
2879 R__b.ReadVersion();
2880 TH1::Streamer(R__b);
2881 TArrayC::Streamer(R__b);
2882 R__b.ReadVersion();
2883 R__b >> fScalefactor;
2884 R__b >> fTsumwy;
2885 R__b >> fTsumwy2;
2886 R__b >> fTsumwxy;
2887 } else {
2888 TH2::Streamer(R__b);
2889 TArrayC::Streamer(R__b);
2890 R__b.CheckByteCount(R__s, R__c, TH2C::IsA());
2891 }
2892 //====end of old versions
2893
2894 } else {
2895 R__b.WriteClassBuffer(TH2C::Class(),this);
2896 }
2897}
2898
2899
2900////////////////////////////////////////////////////////////////////////////////
2901/// Operator =
2902
2904{
2905 if (this != &h1) ((TH2C&)h1).Copy(*this);
2906 return *this;
2907}
2908
2909
2910////////////////////////////////////////////////////////////////////////////////
2911/// Operator *
2912
2914{
2915 TH2C hnew = h1;
2916 hnew.Scale(c1);
2917 hnew.SetDirectory(0);
2918 return hnew;
2919}
2920
2921
2922////////////////////////////////////////////////////////////////////////////////
2923/// Operator +
2924
2926{
2927 TH2C hnew = h1;
2928 hnew.Add(&h2,1);
2929 hnew.SetDirectory(0);
2930 return hnew;
2931}
2932
2933
2934////////////////////////////////////////////////////////////////////////////////
2935/// Operator -
2936
2938{
2939 TH2C hnew = h1;
2940 hnew.Add(&h2,-1);
2941 hnew.SetDirectory(0);
2942 return hnew;
2943}
2944
2945
2946////////////////////////////////////////////////////////////////////////////////
2947/// Operator *
2948
2950{
2951 TH2C hnew = h1;
2952 hnew.Multiply(&h2);
2953 hnew.SetDirectory(0);
2954 return hnew;
2955}
2956
2957
2958////////////////////////////////////////////////////////////////////////////////
2959/// Operator /
2960
2962{
2963 TH2C hnew = h1;
2964 hnew.Divide(&h2);
2965 hnew.SetDirectory(0);
2966 return hnew;
2967}
2968
2969
2970//______________________________________________________________________________
2971// TH2S methods
2972// TH2S a 2-D histogram with two bytes per cell (short integer)
2973//______________________________________________________________________________
2974
2975ClassImp(TH2S);
2976
2977
2978////////////////////////////////////////////////////////////////////////////////
2979/// Constructor.
2980
2982{
2983 SetBinsLength(9);
2984 if (fgDefaultSumw2) Sumw2();
2985}
2986
2987
2988////////////////////////////////////////////////////////////////////////////////
2989/// Destructor.
2990
2992{
2993}
2994
2995
2996////////////////////////////////////////////////////////////////////////////////
2997/// Constructor.
2998
2999TH2S::TH2S(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3000 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3001 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ylow,yup)
3002{
3004 if (fgDefaultSumw2) Sumw2();
3005
3006 if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
3007}
3008
3009
3010////////////////////////////////////////////////////////////////////////////////
3011/// Constructor.
3012
3013TH2S::TH2S(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3014 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3015 :TH2(name,title,nbinsx,xbins,nbinsy,ylow,yup)
3016{
3018 if (fgDefaultSumw2) Sumw2();
3019}
3020
3021
3022////////////////////////////////////////////////////////////////////////////////
3023/// Constructor.
3024
3025TH2S::TH2S(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3026 ,Int_t nbinsy,const Double_t *ybins)
3027 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ybins)
3028{
3030 if (fgDefaultSumw2) Sumw2();
3031}
3032
3033
3034////////////////////////////////////////////////////////////////////////////////
3035/// Constructor.
3036
3037TH2S::TH2S(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3038 ,Int_t nbinsy,const Double_t *ybins)
3039 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3040{
3042 if (fgDefaultSumw2) Sumw2();
3043}
3044
3045
3046////////////////////////////////////////////////////////////////////////////////
3047/// Constructor.
3048
3049TH2S::TH2S(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
3050 ,Int_t nbinsy,const Float_t *ybins)
3051 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3052{
3054 if (fgDefaultSumw2) Sumw2();
3055}
3056
3057
3058////////////////////////////////////////////////////////////////////////////////
3059/// Copy constructor.
3060
3061TH2S::TH2S(const TH2S &h2s) : TH2(), TArrayS()
3062{
3063 ((TH2S&)h2s).Copy(*this);
3064}
3065
3066
3067////////////////////////////////////////////////////////////////////////////////
3068/// Increment bin content by 1.
3069
3071{
3072 if (fArray[bin] < 32767) fArray[bin]++;
3073}
3074
3075
3076////////////////////////////////////////////////////////////////////////////////
3077/// Increment bin content by w.
3078
3080{
3081 Int_t newval = fArray[bin] + Int_t(w);
3082 if (newval > -32768 && newval < 32768) {fArray[bin] = Short_t(newval); return;}
3083 if (newval < -32767) fArray[bin] = -32767;
3084 if (newval > 32767) fArray[bin] = 32767;
3085}
3086
3087
3088////////////////////////////////////////////////////////////////////////////////
3089/// Copy.
3090
3091void TH2S::Copy(TObject &newth2) const
3092{
3093 TH2::Copy((TH2S&)newth2);
3094}
3095
3096
3097////////////////////////////////////////////////////////////////////////////////
3098/// Reset this histogram: contents, errors, etc.
3099
3101{
3102 TH2::Reset(option);
3104}
3105
3106
3107////////////////////////////////////////////////////////////////////////////////
3108/// Set total number of bins including under/overflow
3109/// Reallocate bin contents array
3110
3112{
3113 if (n < 0) n = (fXaxis.GetNbins()+2)*(fYaxis.GetNbins()+2);
3114 fNcells = n;
3115 TArrayS::Set(n);
3116}
3117
3118
3119////////////////////////////////////////////////////////////////////////////////
3120/// Stream an object of class TH2S.
3121
3122void TH2S::Streamer(TBuffer &R__b)
3123{
3124 if (R__b.IsReading()) {
3125 UInt_t R__s, R__c;
3126 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
3127 if (R__v > 2) {
3128 R__b.ReadClassBuffer(TH2S::Class(), this, R__v, R__s, R__c);
3129 return;
3130 }
3131 //====process old versions before automatic schema evolution
3132 if (R__v < 2) {
3133 R__b.ReadVersion();
3134 TH1::Streamer(R__b);
3135 TArrayS::Streamer(R__b);
3136 R__b.ReadVersion();
3137 R__b >> fScalefactor;
3138 R__b >> fTsumwy;
3139 R__b >> fTsumwy2;
3140 R__b >> fTsumwxy;
3141 } else {
3142 TH2::Streamer(R__b);
3143 TArrayS::Streamer(R__b);
3144 R__b.CheckByteCount(R__s, R__c, TH2S::IsA());
3145 }
3146 //====end of old versions
3147
3148 } else {
3149 R__b.WriteClassBuffer(TH2S::Class(),this);
3150 }
3151}
3152
3153
3154////////////////////////////////////////////////////////////////////////////////
3155/// Operator =
3156
3158{
3159 if (this != &h1) ((TH2S&)h1).Copy(*this);
3160 return *this;
3161}
3162
3163
3164////////////////////////////////////////////////////////////////////////////////
3165/// Operator *
3166
3168{
3169 TH2S hnew = h1;
3170 hnew.Scale(c1);
3171 hnew.SetDirectory(0);
3172 return hnew;
3173}
3174
3175
3176////////////////////////////////////////////////////////////////////////////////
3177/// Operator +
3178
3180{
3181 TH2S hnew = h1;
3182 hnew.Add(&h2,1);
3183 hnew.SetDirectory(0);
3184 return hnew;
3185}
3186
3187
3188////////////////////////////////////////////////////////////////////////////////
3189/// Operator -
3190
3192{
3193 TH2S hnew = h1;
3194 hnew.Add(&h2,-1);
3195 hnew.SetDirectory(0);
3196 return hnew;
3197}
3198
3199
3200////////////////////////////////////////////////////////////////////////////////
3201/// Operator *
3202
3204{
3205 TH2S hnew = h1;
3206 hnew.Multiply(&h2);
3207 hnew.SetDirectory(0);
3208 return hnew;
3209}
3210
3211
3212////////////////////////////////////////////////////////////////////////////////
3213/// Operator /
3214
3216{
3217 TH2S hnew = h1;
3218 hnew.Divide(&h2);
3219 hnew.SetDirectory(0);
3220 return hnew;
3221}
3222
3223
3224//______________________________________________________________________________
3225// TH2I methods
3226// TH2I a 2-D histogram with four bytes per cell (32 bits integer)
3227//______________________________________________________________________________
3228
3229ClassImp(TH2I);
3230
3231
3232////////////////////////////////////////////////////////////////////////////////
3233/// Constructor.
3234
3236{
3237 SetBinsLength(9);
3238 if (fgDefaultSumw2) Sumw2();
3239}
3240
3241
3242////////////////////////////////////////////////////////////////////////////////
3243/// Destructor.
3244
3246{
3247}
3248
3249
3250////////////////////////////////////////////////////////////////////////////////
3251/// Constructor.
3252
3253TH2I::TH2I(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3254 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3255 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ylow,yup)
3256{
3258 if (fgDefaultSumw2) Sumw2();
3259
3260 if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
3261}
3262
3263
3264////////////////////////////////////////////////////////////////////////////////
3265/// Constructor.
3266
3267TH2I::TH2I(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3268 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3269 :TH2(name,title,nbinsx,xbins,nbinsy,ylow,yup)
3270{
3272 if (fgDefaultSumw2) Sumw2();
3273}
3274
3275
3276////////////////////////////////////////////////////////////////////////////////
3277/// Constructor.
3278
3279TH2I::TH2I(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3280 ,Int_t nbinsy,const Double_t *ybins)
3281 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ybins)
3282{
3284 if (fgDefaultSumw2) Sumw2();
3285}
3286
3287
3288////////////////////////////////////////////////////////////////////////////////
3289/// Constructor.
3290
3291TH2I::TH2I(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3292 ,Int_t nbinsy,const Double_t *ybins)
3293 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3294{
3296 if (fgDefaultSumw2) Sumw2();
3297}
3298
3299
3300////////////////////////////////////////////////////////////////////////////////
3301/// Constructor.
3302
3303TH2I::TH2I(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
3304 ,Int_t nbinsy,const Float_t *ybins)
3305 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3306{
3308 if (fgDefaultSumw2) Sumw2();
3309}
3310
3311
3312////////////////////////////////////////////////////////////////////////////////
3313/// Copy constructor.
3314
3315TH2I::TH2I(const TH2I &h2i) : TH2(), TArrayI()
3316{
3317 ((TH2I&)h2i).Copy(*this);
3318}
3319
3320
3321////////////////////////////////////////////////////////////////////////////////
3322/// Increment bin content by 1.
3323
3325{
3326 if (fArray[bin] < 2147483647) fArray[bin]++;
3327}
3328
3329
3330////////////////////////////////////////////////////////////////////////////////
3331/// Increment bin content by w.
3332
3334{
3335 Long64_t newval = fArray[bin] + Long64_t(w);
3336 if (newval > -2147483647 && newval < 2147483647) {fArray[bin] = Int_t(newval); return;}
3337 if (newval < -2147483647) fArray[bin] = -2147483647;
3338 if (newval > 2147483647) fArray[bin] = 2147483647;
3339}
3340
3341
3342////////////////////////////////////////////////////////////////////////////////
3343/// Copy.
3344
3345void TH2I::Copy(TObject &newth2) const
3346{
3347 TH2::Copy((TH2I&)newth2);
3348}
3349
3350
3351////////////////////////////////////////////////////////////////////////////////
3352/// Reset this histogram: contents, errors, etc.
3353
3355{
3356 TH2::Reset(option);
3358}
3359
3360
3361////////////////////////////////////////////////////////////////////////////////
3362/// Set total number of bins including under/overflow
3363/// Reallocate bin contents array
3364
3366{
3367 if (n < 0) n = (fXaxis.GetNbins()+2)*(fYaxis.GetNbins()+2);
3368 fNcells = n;
3369 TArrayI::Set(n);
3370}
3371
3372
3373////////////////////////////////////////////////////////////////////////////////
3374/// Operator =
3375
3377{
3378 if (this != &h1) ((TH2I&)h1).Copy(*this);
3379 return *this;
3380}
3381
3382
3383////////////////////////////////////////////////////////////////////////////////
3384/// Operator *
3385
3387{
3388 TH2I hnew = h1;
3389 hnew.Scale(c1);
3390 hnew.SetDirectory(0);
3391 return hnew;
3392}
3393
3394
3395////////////////////////////////////////////////////////////////////////////////
3396/// Operator +
3397
3399{
3400 TH2I hnew = h1;
3401 hnew.Add(&h2,1);
3402 hnew.SetDirectory(0);
3403 return hnew;
3404}
3405
3406
3407////////////////////////////////////////////////////////////////////////////////
3408/// Operator -
3409
3411{
3412 TH2I hnew = h1;
3413 hnew.Add(&h2,-1);
3414 hnew.SetDirectory(0);
3415 return hnew;
3416}
3417
3418
3419////////////////////////////////////////////////////////////////////////////////
3420/// Operator *
3421
3423{
3424 TH2I hnew = h1;
3425 hnew.Multiply(&h2);
3426 hnew.SetDirectory(0);
3427 return hnew;
3428}
3429
3430
3431////////////////////////////////////////////////////////////////////////////////
3432/// Operator /
3433
3435{
3436 TH2I hnew = h1;
3437 hnew.Divide(&h2);
3438 hnew.SetDirectory(0);
3439 return hnew;
3440}
3441
3442
3443//______________________________________________________________________________
3444// TH2F methods
3445// TH2F a 2-D histogram with four bytes per cell (float)
3446//______________________________________________________________________________
3447
3448ClassImp(TH2F);
3449
3450
3451////////////////////////////////////////////////////////////////////////////////
3452/// Constructor.
3453
3455{
3456 SetBinsLength(9);
3457 if (fgDefaultSumw2) Sumw2();
3458}
3459
3460
3461////////////////////////////////////////////////////////////////////////////////
3462/// Destructor.
3463
3465{
3466}
3467
3468
3469////////////////////////////////////////////////////////////////////////////////
3470/// Constructor.
3471
3472TH2F::TH2F(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3473 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3474 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ylow,yup)
3475{
3477 if (fgDefaultSumw2) Sumw2();
3478
3479 if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
3480}
3481
3482
3483////////////////////////////////////////////////////////////////////////////////
3484/// Constructor.
3485
3486TH2F::TH2F(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3487 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3488 :TH2(name,title,nbinsx,xbins,nbinsy,ylow,yup)
3489{
3491 if (fgDefaultSumw2) Sumw2();
3492}
3493
3494
3495////////////////////////////////////////////////////////////////////////////////
3496/// Constructor.
3497
3498TH2F::TH2F(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3499 ,Int_t nbinsy,const Double_t *ybins)
3500 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ybins)
3501{
3503 if (fgDefaultSumw2) Sumw2();
3504}
3505
3506
3507////////////////////////////////////////////////////////////////////////////////
3508/// Constructor.
3509
3510TH2F::TH2F(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3511 ,Int_t nbinsy,const Double_t *ybins)
3512 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3513{
3515 if (fgDefaultSumw2) Sumw2();
3516}
3517
3518
3519////////////////////////////////////////////////////////////////////////////////
3520/// Constructor.
3521
3522TH2F::TH2F(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
3523 ,Int_t nbinsy,const Float_t *ybins)
3524 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3525{
3527 if (fgDefaultSumw2) Sumw2();
3528}
3529
3530
3531////////////////////////////////////////////////////////////////////////////////
3532/// Constructor.
3533
3535:TH2("TMatrixFBase","",m.GetNcols(),m.GetColLwb(),1+m.GetColUpb(),m.GetNrows(),m.GetRowLwb(),1+m.GetRowUpb())
3536{
3538 Int_t ilow = m.GetRowLwb();
3539 Int_t iup = m.GetRowUpb();
3540 Int_t jlow = m.GetColLwb();
3541 Int_t jup = m.GetColUpb();
3542 for (Int_t i=ilow;i<=iup;i++) {
3543 for (Int_t j=jlow;j<=jup;j++) {
3544 SetBinContent(j-jlow+1,i-ilow+1,m(i,j));
3545 }
3546 }
3547}
3548
3549
3550////////////////////////////////////////////////////////////////////////////////
3551/// Copy constructor.
3552
3553TH2F::TH2F(const TH2F &h2f) : TH2(), TArrayF()
3554{
3555 ((TH2F&)h2f).Copy(*this);
3556}
3557
3558
3559////////////////////////////////////////////////////////////////////////////////
3560/// Copy.
3561
3562void TH2F::Copy(TObject &newth2) const
3563{
3564 TH2::Copy((TH2F&)newth2);
3565}
3566
3567
3568////////////////////////////////////////////////////////////////////////////////
3569/// Reset this histogram: contents, errors, etc.
3570
3572{
3573 TH2::Reset(option);
3575}
3576
3577
3578////////////////////////////////////////////////////////////////////////////////
3579/// Set total number of bins including under/overflow
3580/// Reallocate bin contents array
3581
3583{
3584 if (n < 0) n = (fXaxis.GetNbins()+2)*(fYaxis.GetNbins()+2);
3585 fNcells = n;
3586 TArrayF::Set(n);
3587}
3588
3589
3590////////////////////////////////////////////////////////////////////////////////
3591/// Stream an object of class TH2F.
3592
3593void TH2F::Streamer(TBuffer &R__b)
3594{
3595 if (R__b.IsReading()) {
3596 UInt_t R__s, R__c;
3597 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
3598 if (R__v > 2) {
3599 R__b.ReadClassBuffer(TH2F::Class(), this, R__v, R__s, R__c);
3600 return;
3601 }
3602 //====process old versions before automatic schema evolution
3603 if (R__v < 2) {
3604 R__b.ReadVersion();
3605 TH1::Streamer(R__b);
3606 TArrayF::Streamer(R__b);
3607 R__b.ReadVersion();
3608 R__b >> fScalefactor;
3609 R__b >> fTsumwy;
3610 R__b >> fTsumwy2;
3611 R__b >> fTsumwxy;
3612 } else {
3613 TH2::Streamer(R__b);
3614 TArrayF::Streamer(R__b);
3615 R__b.CheckByteCount(R__s, R__c, TH2F::IsA());
3616 }
3617 //====end of old versions
3618
3619 } else {
3620 R__b.WriteClassBuffer(TH2F::Class(),this);
3621 }
3622}
3623
3624
3625////////////////////////////////////////////////////////////////////////////////
3626/// Operator =
3627
3629{
3630 if (this != &h1) ((TH2F&)h1).Copy(*this);
3631 return *this;
3632}
3633
3634
3635////////////////////////////////////////////////////////////////////////////////
3636/// Operator *
3637
3639{
3640 TH2F hnew = h1;
3641 hnew.Scale(c1);
3642 hnew.SetDirectory(0);
3643 return hnew;
3644}
3645
3646
3647////////////////////////////////////////////////////////////////////////////////
3648/// Operator *
3649
3651{
3652 TH2F hnew = h1;
3653 hnew.Scale(c1);
3654 hnew.SetDirectory(0);
3655 return hnew;
3656}
3657
3658
3659////////////////////////////////////////////////////////////////////////////////
3660/// Operator +
3661
3663{
3664 TH2F hnew = h1;
3665 hnew.Add(&h2,1);
3666 hnew.SetDirectory(0);
3667 return hnew;
3668}
3669
3670
3671////////////////////////////////////////////////////////////////////////////////
3672/// Operator -
3673
3675{
3676 TH2F hnew = h1;
3677 hnew.Add(&h2,-1);
3678 hnew.SetDirectory(0);
3679 return hnew;
3680}
3681
3682
3683////////////////////////////////////////////////////////////////////////////////
3684/// Operator *
3685
3687{
3688 TH2F hnew = h1;
3689 hnew.Multiply(&h2);
3690 hnew.SetDirectory(0);
3691 return hnew;
3692}
3693
3694
3695////////////////////////////////////////////////////////////////////////////////
3696/// Operator /
3697
3699{
3700 TH2F hnew = h1;
3701 hnew.Divide(&h2);
3702 hnew.SetDirectory(0);
3703 return hnew;
3704}
3705
3706
3707//______________________________________________________________________________
3708// TH2D methods
3709// TH2D a 2-D histogram with eight bytes per cell (double)
3710//______________________________________________________________________________
3711
3712ClassImp(TH2D);
3713
3714
3715////////////////////////////////////////////////////////////////////////////////
3716/// Constructor.
3717
3719{
3720 SetBinsLength(9);
3721 if (fgDefaultSumw2) Sumw2();
3722}
3723
3724
3725////////////////////////////////////////////////////////////////////////////////
3726/// Destructor.
3727
3729{
3730}
3731
3732
3733////////////////////////////////////////////////////////////////////////////////
3734/// Constructor.
3735
3736TH2D::TH2D(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3737 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3738 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ylow,yup)
3739{
3741 if (fgDefaultSumw2) Sumw2();
3742
3743 if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
3744}
3745
3746
3747////////////////////////////////////////////////////////////////////////////////
3748/// Constructor.
3749
3750TH2D::TH2D(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3751 ,Int_t nbinsy,Double_t ylow,Double_t yup)
3752 :TH2(name,title,nbinsx,xbins,nbinsy,ylow,yup)
3753{
3755 if (fgDefaultSumw2) Sumw2();
3756}
3757
3758
3759////////////////////////////////////////////////////////////////////////////////
3760/// Constructor.
3761
3762TH2D::TH2D(const char *name,const char *title,Int_t nbinsx,Double_t xlow,Double_t xup
3763 ,Int_t nbinsy,const Double_t *ybins)
3764 :TH2(name,title,nbinsx,xlow,xup,nbinsy,ybins)
3765{
3767 if (fgDefaultSumw2) Sumw2();
3768}
3769
3770
3771////////////////////////////////////////////////////////////////////////////////
3772/// Constructor.
3773
3774TH2D::TH2D(const char *name,const char *title,Int_t nbinsx,const Double_t *xbins
3775 ,Int_t nbinsy,const Double_t *ybins)
3776 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3777{
3779 if (fgDefaultSumw2) Sumw2();
3780}
3781
3782
3783////////////////////////////////////////////////////////////////////////////////
3784/// Constructor.
3785
3786TH2D::TH2D(const char *name,const char *title,Int_t nbinsx,const Float_t *xbins
3787 ,Int_t nbinsy,const Float_t *ybins)
3788 :TH2(name,title,nbinsx,xbins,nbinsy,ybins)
3789{
3791 if (fgDefaultSumw2) Sumw2();
3792}
3793
3794
3795////////////////////////////////////////////////////////////////////////////////
3796/// Constructor.
3797
3799:TH2("TMatrixDBase","",m.GetNcols(),m.GetColLwb(),1+m.GetColUpb(),m.GetNrows(),m.GetRowLwb(),1+m.GetRowUpb())
3800{
3802 Int_t ilow = m.GetRowLwb();
3803 Int_t iup = m.GetRowUpb();
3804 Int_t jlow = m.GetColLwb();
3805 Int_t jup = m.GetColUpb();
3806 for (Int_t i=ilow;i<=iup;i++) {
3807 for (Int_t j=jlow;j<=jup;j++) {
3808 SetBinContent(j-jlow+1,i-ilow+1,m(i,j));
3809 }
3810 }
3811 if (fgDefaultSumw2) Sumw2();
3812}
3813
3814
3815////////////////////////////////////////////////////////////////////////////////
3816/// Copy constructor.
3817
3818TH2D::TH2D(const TH2D &h2d) : TH2(), TArrayD()
3819{
3820 ((TH2D&)h2d).Copy(*this);
3821}
3822
3823
3824////////////////////////////////////////////////////////////////////////////////
3825/// Copy.
3826
3827void TH2D::Copy(TObject &newth2) const
3828{
3829 TH2::Copy((TH2D&)newth2);
3830}
3831
3832
3833////////////////////////////////////////////////////////////////////////////////
3834/// Reset this histogram: contents, errors, etc.
3835
3837{
3838 TH2::Reset(option);
3840}
3841
3842
3843////////////////////////////////////////////////////////////////////////////////
3844/// Set total number of bins including under/overflow
3845/// Reallocate bin contents array
3846
3848{
3849 if (n < 0) n = (fXaxis.GetNbins()+2)*(fYaxis.GetNbins()+2);
3850 fNcells = n;
3851 TArrayD::Set(n);
3852}
3853
3854
3855////////////////////////////////////////////////////////////////////////////////
3856/// Stream an object of class TH2D.
3857
3858void TH2D::Streamer(TBuffer &R__b)
3859{
3860 if (R__b.IsReading()) {
3861 UInt_t R__s, R__c;
3862 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
3863 if (R__v > 2) {
3864 R__b.ReadClassBuffer(TH2D::Class(), this, R__v, R__s, R__c);
3865 return;
3866 }
3867 //====process old versions before automatic schema evolution
3868 if (R__v < 2) {
3869 R__b.ReadVersion();
3870 TH1::Streamer(R__b);
3871 TArrayD::Streamer(R__b);
3872 R__b.ReadVersion();
3873 R__b >> fScalefactor;
3874 R__b >> fTsumwy;
3875 R__b >> fTsumwy2;
3876 R__b >> fTsumwxy;
3877 } else {
3878 TH2::Streamer(R__b);
3879 TArrayD::Streamer(R__b);
3880 R__b.CheckByteCount(R__s, R__c, TH2D::IsA());
3881 }
3882 //====end of old versions
3883
3884 } else {
3885 R__b.WriteClassBuffer(TH2D::Class(),this);
3886 }
3887}
3888
3889
3890////////////////////////////////////////////////////////////////////////////////
3891/// Operator =
3892
3894{
3895 if (this != &h1) ((TH2D&)h1).Copy(*this);
3896 return *this;
3897}
3898
3899
3900
3901////////////////////////////////////////////////////////////////////////////////
3902/// Operator *
3903
3905{
3906 TH2D hnew = h1;
3907 hnew.Scale(c1);
3908 hnew.SetDirectory(0);
3909 return hnew;
3910}
3911
3912
3913////////////////////////////////////////////////////////////////////////////////
3914/// Operator +
3915
3917{
3918 TH2D hnew = h1;
3919 hnew.Add(&h2,1);
3920 hnew.SetDirectory(0);
3921 return hnew;
3922}
3923
3924
3925////////////////////////////////////////////////////////////////////////////////
3926/// Operator -
3927
3929{
3930 TH2D hnew = h1;
3931 hnew.Add(&h2,-1);
3932 hnew.SetDirectory(0);
3933 return hnew;
3934}
3935
3936
3937////////////////////////////////////////////////////////////////////////////////
3938/// Operator *
3939
3941{
3942 TH2D hnew = h1;
3943 hnew.Multiply(&h2);
3944 hnew.SetDirectory(0);
3945 return hnew;
3946}
3947
3948
3949////////////////////////////////////////////////////////////////////////////////
3950/// Operator /
3951
3953{
3954 TH2D hnew = h1;
3955 hnew.Divide(&h2);
3956 hnew.SetDirectory(0);
3957 return hnew;
3958}
void Class()
Definition: Class.C:29
#define d(i)
Definition: RSha256.hxx:102
#define f(i)
Definition: RSha256.hxx:104
#define c(i)
Definition: RSha256.hxx:101
#define s1(x)
Definition: RSha256.hxx:91
#define h(i)
Definition: RSha256.hxx:106
#define e(i)
Definition: RSha256.hxx:103
static const double x2[5]
static const double x1[5]
int Int_t
Definition: RtypesCore.h:41
short Version_t
Definition: RtypesCore.h:61
char Char_t
Definition: RtypesCore.h:29
unsigned int UInt_t
Definition: RtypesCore.h:42
const Bool_t kFALSE
Definition: RtypesCore.h:88
unsigned long ULong_t
Definition: RtypesCore.h:51
bool Bool_t
Definition: RtypesCore.h:59
short Short_t
Definition: RtypesCore.h:35
double Double_t
Definition: RtypesCore.h:55
short Color_t
Definition: RtypesCore.h:79
long long Long64_t
Definition: RtypesCore.h:69
short Style_t
Definition: RtypesCore.h:76
float Float_t
Definition: RtypesCore.h:53
const Bool_t kTRUE
Definition: RtypesCore.h:87
const char Option_t
Definition: RtypesCore.h:62
#define ClassImp(name)
Definition: Rtypes.h:363
#define gDirectory
Definition: TDirectory.h:213
void Warning(const char *location, const char *msgfmt,...)
TH2C operator-(TH2C &h1, TH2C &h2)
Operator -.
Definition: TH2.cxx:2937
TH2C operator+(TH2C &h1, TH2C &h2)
Operator +.
Definition: TH2.cxx:2925
TH2C operator/(TH2C &h1, TH2C &h2)
Operator /.
Definition: TH2.cxx:2961
TH2C operator*(Float_t c1, TH2C &h1)
Operator *.
Definition: TH2.cxx:2913
float xmin
Definition: THbookFile.cxx:93
int nentries
Definition: THbookFile.cxx:89
float ymin
Definition: THbookFile.cxx:93
float xmax
Definition: THbookFile.cxx:93
float ymax
Definition: THbookFile.cxx:93
double sqrt(double)
#define gROOT
Definition: TROOT.h:410
R__EXTERN TRandom * gRandom
Definition: TRandom.h:62
char * Form(const char *fmt,...)
#define gPad
Definition: TVirtualPad.h:286
#define snprintf
Definition: civetweb.c:1540
Array of chars or bytes (8 bits per element).
Definition: TArrayC.h:27
void Set(Int_t n)
Set size of this array to n chars.
Definition: TArrayC.cxx:105
Char_t * fArray
Definition: TArrayC.h:30
void Copy(TArrayC &array) const
Definition: TArrayC.h:42
void Reset(Char_t val=0)
Definition: TArrayC.h:47
Array of doubles (64 bits per element).
Definition: TArrayD.h:27
Double_t * fArray
Definition: TArrayD.h:30
void Copy(TArrayD &array) const
Definition: TArrayD.h:42
void Set(Int_t n)
Set size of this array to n doubles.
Definition: TArrayD.cxx:106
Stat_t GetSum() const
Definition: TArrayD.h:46
void Reset()
Definition: TArrayD.h:47
Array of floats (32 bits per element).
Definition: TArrayF.h:27
void Copy(TArrayF &array) const
Definition: TArrayF.h:42
void Reset()
Definition: TArrayF.h:47
void Set(Int_t n)
Set size of this array to n floats.
Definition: TArrayF.cxx:105
Array of integers (32 bits per element).
Definition: TArrayI.h:27
Int_t * fArray
Definition: TArrayI.h:30
void Set(Int_t n)
Set size of this array to n ints.
Definition: TArrayI.cxx:105
void Reset()
Definition: TArrayI.h:47
void Copy(TArrayI &array) const
Definition: TArrayI.h:42
Array of shorts (16 bits per element).
Definition: TArrayS.h:27
void Set(Int_t n)
Set size of this array to n shorts.
Definition: TArrayS.cxx:105
void Reset()
Definition: TArrayS.h:47
void Copy(TArrayS &array) const
Definition: TArrayS.h:42
Short_t * fArray
Definition: TArrayS.h:30
Int_t fN
Definition: TArray.h:38
Int_t GetSize() const
Definition: TArray.h:47
virtual Color_t GetTitleColor() const
Definition: TAttAxis.h:45
virtual Color_t GetLabelColor() const
Definition: TAttAxis.h:38
virtual Int_t GetNdivisions() const
Definition: TAttAxis.h:36
virtual Color_t GetAxisColor() const
Definition: TAttAxis.h:37
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title Offset is a correction factor with respect to the "s...
Definition: TAttAxis.cxx:294
virtual Style_t GetTitleFont() const
Definition: TAttAxis.h:46
virtual Float_t GetLabelOffset() const
Definition: TAttAxis.h:40
virtual void SetAxisColor(Color_t color=1, Float_t alpha=1.)
Set color of the line axis and tick marks.
Definition: TAttAxis.cxx:163
virtual void SetLabelSize(Float_t size=0.04)
Set size of axis labels The size is expressed in per cent of the pad width.
Definition: TAttAxis.cxx:204
virtual Style_t GetLabelFont() const
Definition: TAttAxis.h:39
virtual void SetTitleFont(Style_t font=62)
Set the title font.
Definition: TAttAxis.cxx:322
virtual void SetLabelOffset(Float_t offset=0.005)
Set distance between the axis and the labels The distance is expressed in per cent of the pad width.
Definition: TAttAxis.cxx:193
virtual void SetLabelFont(Style_t font=62)
Set labels' font.
Definition: TAttAxis.cxx:183
virtual void SetTitleSize(Float_t size=0.04)
Set size of axis title The size is expressed in per cent of the pad width.
Definition: TAttAxis.cxx:304
virtual void SetTitleColor(Color_t color=1)
Set color of axis title.
Definition: TAttAxis.cxx:313
virtual Float_t GetTitleSize() const
Definition: TAttAxis.h:43
virtual Float_t GetLabelSize() const
Definition: TAttAxis.h:41
virtual Float_t GetTickLength() const
Definition: TAttAxis.h:44
virtual Float_t GetTitleOffset() const
Definition: TAttAxis.h:42
virtual void SetTickLength(Float_t length=0.03)
Set tick mark length The length is expressed in per cent of the pad width.
Definition: TAttAxis.cxx:280
virtual void SetNdivisions(Int_t n=510, Bool_t optim=kTRUE)
Set the number of divisions for this axis.
Definition: TAttAxis.cxx:229
virtual void SetLabelColor(Color_t color=1, Float_t alpha=1.)
Set color of labels.
Definition: TAttAxis.cxx:173
virtual Color_t GetFillColor() const
Return the fill area color.
Definition: TAttFill.h:30
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition: TAttFill.h:37
virtual Color_t GetLineColor() const
Return the line color.
Definition: TAttLine.h:33
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition: TAttLine.h:40
virtual Style_t GetMarkerStyle() const
Return the marker style.
Definition: TAttMarker.h:32
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
Definition: TAttMarker.h:38
virtual Color_t GetMarkerColor() const
Return the marker color.
Definition: TAttMarker.h:31
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition: TAttMarker.h:40
Class to manage histogram axis.
Definition: TAxis.h:30
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
Definition: TAxis.cxx:809
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
Definition: TAxis.cxx:464
const TArrayD * GetXbins() const
Definition: TAxis.h:130
Double_t GetXmax() const
Definition: TAxis.h:134
@ kAxisRange
Definition: TAxis.h:61
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
Definition: TAxis.cxx:279
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Definition: TAxis.cxx:504
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
Definition: TAxis.cxx:717
Int_t GetLast() const
Return last bin on the axis i.e.
Definition: TAxis.cxx:455
virtual void ImportAttributes(const TAxis *axis)
Copy axis attributes to this.
Definition: TAxis.cxx:617
Double_t GetXmin() const
Definition: TAxis.h:133
Int_t GetNbins() const
Definition: TAxis.h:121
const char * GetTitle() const
Returns title of object.
Definition: TAxis.h:129
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
Definition: TAxis.cxx:526
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Definition: TAxis.cxx:514
Int_t GetFirst() const
Return first bin on the axis i.e.
Definition: TAxis.cxx:444
THashList * GetLabels() const
Definition: TAxis.h:117
Buffer base class used for serializing objects.
Definition: TBuffer.h:40
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
Bool_t IsReading() const
Definition: TBuffer.h:83
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
1-Dim function class
Definition: TF1.h:211
virtual TH1 * GetHistogram() const
Return a pointer to the histogram used to visualise the function.
Definition: TF1.cxx:1559
virtual Double_t GetParError(Int_t ipar) const
Return value of parameter number ipar.
Definition: TF1.cxx:1904
Double_t GetChisquare() const
Definition: TF1.h:428
virtual void SetRange(Double_t xmin, Double_t xmax)
Initialize the upper and lower bounds to draw the function.
Definition: TF1.cxx:3512
virtual Int_t GetNpar() const
Definition: TF1.h:465
virtual Double_t Integral(Double_t a, Double_t b, Double_t epsrel=1.e-12)
IntegralOneDim or analytical integral.
Definition: TF1.cxx:2496
virtual Int_t GetNumberFitPoints() const
Definition: TF1.h:487
virtual Double_t * GetParameters() const
Definition: TF1.h:504
virtual void GetRange(Double_t *xmin, Double_t *xmax) const
Return range of a generic N-D function.
Definition: TF1.cxx:2257
virtual const char * GetParName(Int_t ipar) const
Definition: TF1.h:513
virtual void SetParameters(const Double_t *params)
Definition: TF1.h:628
virtual Double_t GetParameter(Int_t ipar) const
Definition: TF1.h:496
A 2-Dim function with parameters.
Definition: TF2.h:29
1-D histogram with a double per channel (see TH1 documentation)}
Definition: TH1.h:614
virtual void Reset(Option_t *option="")
Reset.
Definition: TH1.cxx:9426
The TH1 histogram class.
Definition: TH1.h:56
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
Definition: TH1.cxx:8259
Double_t * fBuffer
[fBufferSize] entry buffer
Definition: TH1.h:105
virtual Double_t GetEffectiveEntries() const
Number of effective entries of the histogram.
Definition: TH1.cxx:4210
virtual Bool_t Multiply(TF1 *f1, Double_t c1=1)
Performs the operation:
Definition: TH1.cxx:5542
Int_t fNcells
number of bins(1D), cells (2D) +U/Overflows
Definition: TH1.h:86
Double_t fTsumw
Total Sum of weights.
Definition: TH1.h:93
Double_t fTsumw2
Total Sum of squares of weights.
Definition: TH1.h:94
virtual Int_t GetQuantiles(Int_t nprobSum, Double_t *q, const Double_t *probSum=0)
Compute Quantiles for this histogram Quantile x_q of a probability distribution Function F is defined...
Definition: TH1.cxx:4342
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, Option_t *opt, Bool_t doerr=kFALSE) const
Internal function compute integral and optionally the error between the limits specified by the bin n...
Definition: TH1.cxx:7357
Double_t fTsumwx2
Total Sum of weight*X*X.
Definition: TH1.h:96
virtual Double_t GetStdDev(Int_t axis=1) const
Returns the Standard Deviation (Sigma).
Definition: TH1.cxx:7012
virtual Int_t GetNbinsY() const
Definition: TH1.h:293
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH1.cxx:1200
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
Definition: TH1.cxx:8384
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
Definition: TH1.cxx:6958
virtual Int_t GetDimension() const
Definition: TH1.h:278
@ kIsNotW
Histogram is forced to be not weighted even when the histogram is filled with weighted different than...
Definition: TH1.h:167
virtual Bool_t CanExtendAllAxes() const
Returns true if all axes are extendable.
Definition: TH1.cxx:6150
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Definition: TH1.cxx:6608
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
Definition: TH1.h:316
virtual Int_t GetNcells() const
Definition: TH1.h:295
virtual void PutStats(Double_t *stats)
Replace current statistics with the values in array stats.
Definition: TH1.cxx:7267
TVirtualHistPainter * GetPainter(Option_t *option="")
Return pointer to painter.
Definition: TH1.cxx:4251
TObject * Clone(const char *newname=0) const
Make a complete copy of the underlying object.
Definition: TH1.cxx:2657
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
Fit histogram with function fname.
Definition: TH1.cxx:3695
virtual Int_t GetBin(Int_t binx, Int_t biny=0, Int_t binz=0) const
Return Global bin number corresponding to binx,y,z.
Definition: TH1.cxx:4692
virtual Int_t GetNbinsX() const
Definition: TH1.h:292
virtual Bool_t Add(TF1 *h1, Double_t c1=1, Option_t *option="")
Performs the operation: this = this + c1*f1 if errors are defined (see TH1::Sumw2),...
Definition: TH1.cxx:777
Int_t fBufferSize
fBuffer size
Definition: TH1.h:104
virtual Double_t RetrieveBinContent(Int_t bin) const
Raw retrieval of bin content on internal data structure see convention for numbering bins in TH1::Get...
Definition: TH1.cxx:8760
Int_t fDimension
!Histogram dimension (1, 2 or 3 dim)
Definition: TH1.h:107
virtual void SetBinError(Int_t bin, Double_t error)
Set the bin Error Note that this resets the bin eror option to be of Normal Type and for the non-empt...
Definition: TH1.cxx:8526
static Int_t fgBufferSize
!default buffer size for automatic histograms
Definition: TH1.h:112
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition: TH1.cxx:3251
TAxis * GetYaxis()
Definition: TH1.h:317
virtual Double_t GetBinErrorSqUnchecked(Int_t bin) const
Definition: TH1.h:439
Double_t * fIntegral
!Integral of bins used by GetRandom
Definition: TH1.h:108
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
Definition: TH1.cxx:8542
virtual Double_t GetEntries() const
Return the current number of entries.
Definition: TH1.cxx:4185
virtual void Copy(TObject &hnew) const
Copy this histogram structure to newth1.
Definition: TH1.cxx:2580
virtual void Draw(Option_t *option="")
Draw this histogram with options.
Definition: TH1.cxx:2974
virtual void ResetStats()
Reset the statistics including the number of entries and replace with values calculates from bin cont...
Definition: TH1.cxx:7282
virtual void SetBuffer(Int_t buffersize, Option_t *option="")
Set the maximum number of entries to be kept in the buffer.
Definition: TH1.cxx:7788
Double_t fEntries
Number of entries.
Definition: TH1.h:92
virtual void SetName(const char *name)
Change the name of this histogram.
Definition: TH1.cxx:8282
virtual void UpdateBinContent(Int_t bin, Double_t content)
Raw update of bin content on internal data structure see convention for numbering bins in TH1::GetBin...
Definition: TH1.cxx:8770
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Definition: TH1.cxx:4790
TAxis fXaxis
X axis descriptor.
Definition: TH1.h:87
virtual void ExtendAxis(Double_t x, TAxis *axis)
Histogram is resized along axis such that x is in the axis range.
Definition: TH1.cxx:6026
TArrayD fSumw2
Array of sum of squares of weights.
Definition: TH1.h:101
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
Definition: TH1.cxx:6126
virtual void Paint(Option_t *option="")
Control routine to paint any kind of histograms.
Definition: TH1.cxx:5717
virtual Int_t GetSumw2N() const
Definition: TH1.h:310
Bool_t GetStatOverflowsBehaviour() const
Definition: TH1.h:148
virtual Bool_t Divide(TF1 *f1, Double_t c1=1)
Performs the operation: this = this/(c1*f1) if errors are defined (see TH1::Sumw2),...
Definition: TH1.cxx:2729
TAxis fYaxis
Y axis descriptor.
Definition: TH1.h:88
TVirtualHistPainter * fPainter
!pointer to histogram painter
Definition: TH1.h:109
virtual void SetBins(Int_t nx, Double_t xmin, Double_t xmax)
Redefine x axis parameters.
Definition: TH1.cxx:8089
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
Definition: TH1.cxx:8341
virtual void SetEntries(Double_t n)
Definition: TH1.h:381
static Bool_t fgDefaultSumw2
!flag to call TH1::Sumw2 automatically at histogram creation time
Definition: TH1.h:115
Double_t fTsumwx
Total Sum of weight*X.
Definition: TH1.h:95
virtual Double_t ComputeIntegral(Bool_t onlyPositive=false)
Compute integral (cumulative sum of bins) The result stored in fIntegral is used by the GetRandom fun...
Definition: TH1.cxx:2467
@ kNstat
Definition: TH1.h:179
2-D histogram with a byte per channel (see TH1 documentation)
Definition: TH2.h:133
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Definition: TH2.cxx:2846
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH2.cxx:2816
virtual ~TH2C()
Destructor.
Definition: TH2.cxx:2737
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH2.cxx:2857
TH2C()
Constructor.
Definition: TH2.cxx:2727
TH2C & operator=(const TH2C &h1)
Operator =.
Definition: TH2.cxx:2903
virtual void Copy(TObject &hnew) const
Copy.
Definition: TH2.cxx:2837
2-D histogram with a double per channel (see TH1 documentation)}
Definition: TH2.h:291
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH2.cxx:3847
virtual ~TH2D()
Destructor.
Definition: TH2.cxx:3728
virtual void Copy(TObject &hnew) const
Copy.
Definition: TH2.cxx:3827
TH2D()
Constructor.
Definition: TH2.cxx:3718
TH2D & operator=(const TH2D &h1)
Operator =.
Definition: TH2.cxx:3893
2-D histogram with a float per channel (see TH1 documentation)}
Definition: TH2.h:250
TH2F()
Constructor.
Definition: TH2.cxx:3454
TH2F & operator=(const TH2F &h1)
Operator =.
Definition: TH2.cxx:3628
virtual ~TH2F()
Destructor.
Definition: TH2.cxx:3464
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH2.cxx:3582
virtual void Copy(TObject &hnew) const
Copy.
Definition: TH2.cxx:3562
2-D histogram with an int per channel (see TH1 documentation)}
Definition: TH2.h:211
TH2I()
Constructor.
Definition: TH2.cxx:3235
virtual void Copy(TObject &hnew) const
Copy.
Definition: TH2.cxx:3345
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH2.cxx:3365
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH2.cxx:3324
virtual ~TH2I()
Destructor.
Definition: TH2.cxx:3245
TH2I & operator=(const TH2I &h1)
Operator =.
Definition: TH2.cxx:3376
2-D histogram with a short per channel (see TH1 documentation)
Definition: TH2.h:172
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH2.cxx:3111
TH2S & operator=(const TH2S &h1)
Operator =.
Definition: TH2.cxx:3157
TH2S()
Constructor.
Definition: TH2.cxx:2981
virtual ~TH2S()
Destructor.
Definition: TH2.cxx:2991
virtual void Copy(TObject &hnew) const
Copy.
Definition: TH2.cxx:3091
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH2.cxx:3070
Service class for 2-Dim histogram classes.
Definition: TH2.h:30
virtual void PutStats(Double_t *stats)
Replace current statistics with the values in array stats.
Definition: TH2.cxx:2366
TH1D * ProjectionY(const char *name="_py", Int_t firstxbin=0, Int_t lastxbin=-1, Option_t *option="") const
Project a 2-D histogram into a 1-D histogram along Y.
Definition: TH2.cxx:2357
virtual Int_t BufferEmpty(Int_t action=0)
Fill histogram with all entries in the buffer.
Definition: TH2.cxx:177
virtual Double_t GetCorrelationFactor(Int_t axis1=1, Int_t axis2=2) const
Return correlation factor between axis1 and axis2.
Definition: TH2.cxx:1040
virtual TProfile * DoProfile(bool onX, const char *name, Int_t firstbin, Int_t lastbin, Option_t *option) const
Definition: TH2.cxx:1768
virtual Double_t GetBinWithContent2(Double_t c, Int_t &binx, Int_t &biny, Int_t firstxbin=1, Int_t lastxbin=-1, Int_t firstybin=1, Int_t lastybin=-1, Double_t maxdiff=0) const
compute first cell (binx,biny) in the range [firstxbin,lastxbin][firstybin,lastybin] for which diff =...
Definition: TH2.cxx:1012
TProfile * ProfileX(const char *name="_pfx", Int_t firstybin=1, Int_t lastybin=-1, Option_t *option="") const
Project a 2-D histogram into a profile histogram along X.
Definition: TH2.cxx:1991
TH1D * QuantilesY(Double_t prob=0.5, const char *name="_qy") const
Compute the Y distribution of quantiles in the other variable X name is the name of the returned hist...
Definition: TH2.cxx:2399
TProfile * ProfileY(const char *name="_pfy", Int_t firstxbin=1, Int_t lastxbin=-1, Option_t *option="") const
Project a 2-D histogram into a profile histogram along Y.
Definition: TH2.cxx:2041
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Definition: TH2.cxx:2484
virtual TH1D * DoQuantiles(bool onX, const char *name, Double_t prob) const
Implementation of quantiles for x or y.
Definition: TH2.cxx:2408
Double_t fTsumwxy
Definition: TH2.h:36
Int_t Fill(Double_t)
Invalid Fill method.
Definition: TH2.cxx:292
virtual TH1 * ShowBackground(Int_t niter=20, Option_t *option="same")
This function calculates the background spectrum in this histogram.
Definition: TH2.cxx:2545
virtual Int_t FindLastBinAbove(Double_t threshold=0, Int_t axis=1) const
Find last bin with content > threshold for axis (1=x, 2=y, 3=z) if no bins with content > threshold i...
Definition: TH2.cxx:725
virtual Int_t ShowPeaks(Double_t sigma=2, Option_t *option="", Double_t threshold=0.05)
Interface to TSpectrum2::Search the function finds peaks in this histogram where the width is > sigma...
Definition: TH2.cxx:2561
virtual Int_t FindFirstBinAbove(Double_t threshold=0, Int_t axis=1) const
Find first bin with content > threshold for axis (1=x, 2=y, 3=z) if no bins with content > threshold ...
Definition: TH2.cxx:695
virtual void DoFitSlices(bool onX, TF1 *f1, Int_t firstbin, Int_t lastbin, Int_t cut, Option_t *option, TObjArray *arr)
Definition: TH2.cxx:753
TH1D * QuantilesX(Double_t prob=0.5, const char *name="_qx") const
Compute the X distribution of quantiles in the other variable Y name is the name of the returned hist...
Definition: TH2.cxx:2386
virtual TH2 * RebinX(Int_t ngroup=2, const char *newname="")
Rebin only the X axis see Rebin2D.
Definition: TH2.cxx:1530
virtual void SetShowProjectionY(Int_t nbins=1)
When the mouse is moved in a pad containing a 2-d view of this histogram a second canvas shows the pr...
Definition: TH2.cxx:2532
virtual void FillRandom(const char *fname, Int_t ntimes=5000)
Fill histogram following distribution in function fname.
Definition: TH2.cxx:597
virtual TH2 * Rebin(Int_t ngroup=2, const char *newname="", const Double_t *xbins=0)
Override TH1::Rebin as TH2::RebinX Rebinning in variable binning as for TH1 is not allowed If a non-n...
Definition: TH2.cxx:1551
Double_t fScalefactor
Definition: TH2.h:33
virtual void GetStats(Double_t *stats) const
Fill the array stats from the contents of this histogram The array stats must be correctly dimensione...
Definition: TH2.cxx:1143
virtual TH1D * DoProjection(bool onX, const char *name, Int_t firstbin, Int_t lastbin, Option_t *option) const
Internal (protected) method for performing projection on the X or Y axis called by ProjectionX or Pro...
Definition: TH2.cxx:2051
Double_t fTsumwy2
Definition: TH2.h:35
virtual Double_t GetCovariance(Int_t axis1=1, Int_t axis2=2) const
Return covariance between axis1 and axis2.
Definition: TH2.cxx:1058
virtual void GetRandom2(Double_t &x, Double_t &y)
Return 2 random numbers along axis x and y distributed according the cell-contents of a 2-dim histogr...
Definition: TH2.cxx:1090
virtual void Smooth(Int_t ntimes=1, Option_t *option="")
Smooth bin contents of this 2-d histogram using kernel algorithms similar to the ones used in the ras...
Definition: TH2.cxx:2590
virtual void FillN(Int_t, const Double_t *, const Double_t *, Int_t)
Fill this histogram with an array x and weights w.
Definition: TH2.h:74
TH1D * ProjectionX(const char *name="_px", Int_t firstybin=0, Int_t lastybin=-1, Option_t *option="") const
Project a 2-D histogram into a 1-D histogram along X.
Definition: TH2.cxx:2317
virtual void FitSlicesX(TF1 *f1=0, Int_t firstybin=0, Int_t lastybin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray *arr=0)
Project slices along X in case of a 2-D histogram, then fit each slice with function f1 and make a hi...
Definition: TH2.cxx:911
virtual Int_t GetBin(Int_t binx, Int_t biny, Int_t binz=0) const
Return Global bin number corresponding to binx,y,z.
Definition: TH2.cxx:981
virtual Double_t Integral(Option_t *option="") const
Return integral of bin contents.
Definition: TH2.cxx:1202
virtual Double_t IntegralAndError(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Double_t &err, Option_t *option="") const
Return integral of bin contents in range [firstxbin,lastxbin],[firstybin,lastybin] for a 2-D histogra...
Definition: TH2.cxx:1231
virtual Double_t KolmogorovTest(const TH1 *h2, Option_t *option="") const
Statistical test of compatibility in shape between THIS histogram and h2, using Kolmogorov test.
Definition: TH2.cxx:1358
virtual Double_t Interpolate(Double_t x)
illegal for a TH2
Definition: TH2.cxx:1240
Double_t fTsumwy
Definition: TH2.h:34
TH2()
Constructor.
Definition: TH2.cxx:60
virtual void SetShowProjectionX(Int_t nbins=1)
When the mouse is moved in a pad containing a 2-d view of this histogram a second canvas shows the pr...
Definition: TH2.cxx:2517
virtual void FitSlicesY(TF1 *f1=0, Int_t firstxbin=0, Int_t lastxbin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray *arr=0)
Project slices along Y in case of a 2-D histogram, then fit each slice with function f1 and make a hi...
Definition: TH2.cxx:976
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Definition: TH2.h:84
virtual TH2 * Rebin2D(Int_t nxgroup=2, Int_t nygroup=2, const char *newname="")
Rebin this histogram grouping nxgroup/nygroup bins along the xaxis/yaxis together.
Definition: TH2.cxx:1586
virtual Int_t BufferFill(Double_t x, Double_t y, Double_t w)
accumulate arguments in buffer.
Definition: TH2.cxx:251
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content.
Definition: TH2.cxx:2500
virtual ~TH2()
Destructor.
Definition: TH2.cxx:164
virtual TH2 * RebinY(Int_t ngroup=2, const char *newname="")
Rebin only the Y axis see Rebin2D.
Definition: TH2.cxx:1540
virtual void Copy(TObject &hnew) const
Copy.
Definition: TH2.cxx:279
static THLimitsFinder * GetLimitsFinder()
Return pointer to the current finder.
virtual Int_t FindGoodLimits(TH1 *h, Double_t xmin, Double_t xmax)
Compute the best axis limits for the X axis.
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Definition: THashList.h:34
Linear Algebra Package.
Definition: TMatrixTBase.h:85
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition: TNamed.cxx:164
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:48
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
An array of TObjects.
Definition: TObjArray.h:37
virtual void Expand(Int_t newSize)
Expand or shrink the array to newSize elements.
Definition: TObjArray.cxx:386
Collectable string class.
Definition: TObjString.h:28
TString & String()
Definition: TObjString.h:49
Mother of all ROOT objects.
Definition: TObject.h:37
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:357
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:866
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:694
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:443
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition: TObject.cxx:854
Profile Histogram.
Definition: TProfile.h:32
virtual Double_t Rndm()
Machine independent random number generator.
Definition: TRandom.cxx:533
Basic string class.
Definition: TString.h:131
void ToLower()
Change string to lower-case.
Definition: TString.cxx:1100
Ssiz_t First(char c) const
Find first occurrence of a character c.
Definition: TString.cxx:487
const char * Data() const
Definition: TString.h:364
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition: TString.h:687
void ToUpper()
Change string to upper case.
Definition: TString.cxx:1113
Bool_t IsNull() const
Definition: TString.h:402
TString & Remove(Ssiz_t pos)
Definition: TString.h:668
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition: TString.cxx:2286
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition: TString.h:619
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition: TString.h:634
virtual void SetShowProjection(const char *option, Int_t nbins)=0
virtual Int_t MakeCuts(char *cutsopt)=0
virtual Bool_t IsInside(Int_t x, Int_t y)=0
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition: TVirtualPad.h:50
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
const Double_t sigma
return c1
Definition: legend1.C:41
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
const Int_t n
Definition: legend1.C:16
TH1F * h1
Definition: legend1.C:5
TF1 * f1
Definition: legend1.C:11
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Calculate a gaussian function with mean and sigma.
Definition: TMath.cxx:448
Short_t Max(Short_t a, Short_t b)
Definition: TMathBase.h:212
Double_t Prob(Double_t chi2, Int_t ndf)
Computation of the probability for a certain Chi-squared (chi2) and number of degrees of freedom (ndf...
Definition: TMath.cxx:621
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754
Definition: TMath.h:889
Double_t Floor(Double_t x)
Definition: TMath.h:691
Double_t Log(Double_t x)
Definition: TMath.h:748
Double_t Sqrt(Double_t x)
Definition: TMath.h:679
Double_t KolmogorovProb(Double_t z)
Calculates the Kolmogorov distribution function,.
Definition: TMath.cxx:663
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Definition: TMathBase.h:278
Short_t Abs(Short_t d)
Definition: TMathBase.h:120
fill
Definition: fit1_py.py:6
auto * m
Definition: textangle.C:8