Logo ROOT   6.14/05
Reference Guide
TH1.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 <stdlib.h>
13 #include <string.h>
14 #include <stdio.h>
15 #include <ctype.h>
16 #include <sstream>
17 #include <cmath>
18 
19 #include "Riostream.h"
20 #include "TROOT.h"
21 #include "TEnv.h"
22 #include "TClass.h"
23 #include "TMath.h"
24 #include "THashList.h"
25 #include "TH1.h"
26 #include "TH2.h"
27 #include "TH3.h"
28 #include "TF2.h"
29 #include "TF3.h"
30 #include "TPluginManager.h"
31 #include "TVirtualPad.h"
32 #include "TRandom.h"
33 #include "TVirtualFitter.h"
34 #include "THLimitsFinder.h"
35 #include "TProfile.h"
36 #include "TStyle.h"
37 #include "TVectorF.h"
38 #include "TVectorD.h"
39 #include "TBrowser.h"
40 #include "TObjString.h"
41 #include "TError.h"
42 #include "TVirtualHistPainter.h"
43 #include "TVirtualFFT.h"
44 #include "TSystem.h"
45 
46 #include "HFitInterface.h"
47 #include "Fit/DataRange.h"
48 #include "Fit/BinData.h"
49 #include "Math/GoFTest.h"
50 #include "Math/MinimizerOptions.h"
51 #include "Math/QuantFuncMathCore.h"
52 
53 #include "TH1Merger.h"
54 
55 /** \addtogroup Hist
56 @{
57 \class TH1C
58 \brief 1-D histogram with a byte per channel (see TH1 documentation)
59 \class TH1S
60 \brief 1-D histogram with a short per channel (see TH1 documentation)
61 \class TH1I
62 \brief 1-D histogram with an int per channel (see TH1 documentation)}
63 \class TH1F
64 \brief 1-D histogram with a float per channel (see TH1 documentation)}
65 \class TH1D
66 \brief 1-D histogram with a double per channel (see TH1 documentation)}
67 @}
68 */
69 
70 /** \class TH1
71 The TH1 histogram class.
72 
73 ### The Histogram classes
74 ROOT supports the following histogram types:
75 
76  - 1-D histograms:
77  - TH1C : histograms with one byte per channel. Maximum bin content = 127
78  - TH1S : histograms with one short per channel. Maximum bin content = 32767
79  - TH1I : histograms with one int per channel. Maximum bin content = 2147483647
80  - TH1F : histograms with one float per channel. Maximum precision 7 digits
81  - TH1D : histograms with one double per channel. Maximum precision 14 digits
82  - 2-D histograms:
83  - TH2C : histograms with one byte per channel. Maximum bin content = 127
84  - TH2S : histograms with one short per channel. Maximum bin content = 32767
85  - TH2I : histograms with one int per channel. Maximum bin content = 2147483647
86  - TH2F : histograms with one float per channel. Maximum precision 7 digits
87  - TH2D : histograms with one double per channel. Maximum precision 14 digits
88  - 3-D histograms:
89  - TH3C : histograms with one byte per channel. Maximum bin content = 127
90  - TH3S : histograms with one short per channel. Maximum bin content = 32767
91  - TH3I : histograms with one int per channel. Maximum bin content = 2147483647
92  - TH3F : histograms with one float per channel. Maximum precision 7 digits
93  - TH3D : histograms with one double per channel. Maximum precision 14 digits
94  - Profile histograms: See classes TProfile, TProfile2D and TProfile3D.
95  Profile histograms are used to display the mean value of Y and its standard deviation
96  for each bin in X. Profile histograms are in many cases an elegant
97  replacement of two-dimensional histograms : the inter-relation of two
98  measured quantities X and Y can always be visualized by a two-dimensional
99  histogram or scatter-plot; If Y is an unknown (but single-valued)
100  approximate function of X, this function is displayed by a profile
101  histogram with much better precision than by a scatter-plot.
102 
103 
104 All histogram classes are derived from the base class TH1
105 ~~~ {.cpp}
106  TH1
107  ^
108  |
109  |
110  |
111  +----------------+-------+------+------+-----+-----+
112  | | | | | | |
113  | | TH1C TH1S TH1I TH1F TH1D
114  | | |
115  | | |
116  | TH2 TProfile
117  | |
118  | |
119  | +-------+------+------+-----+-----+
120  | | | | | |
121  | TH2C TH2S TH2I TH2F TH2D
122  | |
123  TH3 |
124  | TProfile2D
125  |
126  +-------+------+------+------+------+
127  | | | | |
128  TH3C TH3S TH3I TH3F TH3D
129  |
130  |
131  TProfile3D
132 
133  The TH*C classes also inherit from the array class TArrayC.
134  The TH*S classes also inherit from the array class TArrayS.
135  The TH*I classes also inherit from the array class TArrayI.
136  The TH*F classes also inherit from the array class TArrayF.
137  The TH*D classes also inherit from the array class TArrayD.
138 ~~~
139 
140 #### Creating histograms
141 
142 Histograms are created by invoking one of the constructors, e.g.
143 ~~~ {.cpp}
144  TH1F *h1 = new TH1F("h1", "h1 title", 100, 0, 4.4);
145  TH2F *h2 = new TH2F("h2", "h2 title", 40, 0, 4, 30, -3, 3);
146 ~~~
147 Histograms may also be created by:
148 
149  - calling the Clone function, see below
150  - making a projection from a 2-D or 3-D histogram, see below
151  - reading an histogram from a file
152 
153  When an histogram is created, a reference to it is automatically added
154  to the list of in-memory objects for the current file or directory.
155  This default behaviour can be changed by:
156 ~~~ {.cpp}
157  h->SetDirectory(0); for the current histogram h
158  TH1::AddDirectory(kFALSE); sets a global switch disabling the reference
159 ~~~
160  When the histogram is deleted, the reference to it is removed from
161  the list of objects in memory.
162  When a file is closed, all histograms in memory associated with this file
163  are automatically deleted.
164 
165 #### Fix or variable bin size
166 
167  All histogram types support either fix or variable bin sizes.
168  2-D histograms may have fix size bins along X and variable size bins
169  along Y or vice-versa. The functions to fill, manipulate, draw or access
170  histograms are identical in both cases.
171 
172  Each histogram always contains 3 objects TAxis: fXaxis, fYaxis and fZaxis
173  o access the axis parameters, do:
174 ~~~ {.cpp}
175  TAxis *xaxis = h->GetXaxis(); etc.
176  Double_t binCenter = xaxis->GetBinCenter(bin), etc.
177 ~~~
178  See class TAxis for a description of all the access functions.
179  The axis range is always stored internally in double precision.
180 
181 #### Convention for numbering bins
182 
183  For all histogram types: nbins, xlow, xup
184 ~~~ {.cpp}
185  bin = 0; underflow bin
186  bin = 1; first bin with low-edge xlow INCLUDED
187  bin = nbins; last bin with upper-edge xup EXCLUDED
188  bin = nbins+1; overflow bin
189 ~~~
190  In case of 2-D or 3-D histograms, a "global bin" number is defined.
191  For example, assuming a 3-D histogram with (binx, biny, binz), the function
192 ~~~ {.cpp}
193  Int_t gbin = h->GetBin(binx, biny, binz);
194 ~~~
195  returns a global/linearized gbin number. This global gbin is useful
196  to access the bin content/error information independently of the dimension.
197  Note that to access the information other than bin content and errors
198  one should use the TAxis object directly with e.g.:
199 ~~~ {.cpp}
200  Double_t xcenter = h3->GetZaxis()->GetBinCenter(27);
201 ~~~
202  returns the center along z of bin number 27 (not the global bin)
203  in the 3-D histogram h3.
204 
205 #### Alphanumeric Bin Labels
206 
207  By default, an histogram axis is drawn with its numeric bin labels.
208  One can specify alphanumeric labels instead with:
209 
210  - call TAxis::SetBinLabel(bin, label);
211  This can always be done before or after filling.
212  When the histogram is drawn, bin labels will be automatically drawn.
213  See examples labels1.C and labels2.C
214  - call to a Fill function with one of the arguments being a string, e.g.
215 ~~~ {.cpp}
216  hist1->Fill(somename, weight);
217  hist2->Fill(x, somename, weight);
218  hist2->Fill(somename, y, weight);
219  hist2->Fill(somenamex, somenamey, weight);
220 ~~~
221  See examples hlabels1.C and hlabels2.C
222  - via TTree::Draw. see for example cernstaff.C
223 ~~~ {.cpp}
224  tree.Draw("Nation::Division");
225 ~~~
226  where "Nation" and "Division" are two branches of a Tree.
227 
228 When using the options 2 or 3 above, the labels are automatically
229  added to the list (THashList) of labels for a given axis.
230  By default, an axis is drawn with the order of bins corresponding
231  to the filling sequence. It is possible to reorder the axis
232 
233  - alphabetically
234  - by increasing or decreasing values
235 
236  The reordering can be triggered via the TAxis context menu by selecting
237  the menu item "LabelsOption" or by calling directly
238  TH1::LabelsOption(option, axis) where
239 
240  - axis may be "X", "Y" or "Z"
241  - option may be:
242  - "a" sort by alphabetic order
243  - ">" sort by decreasing values
244  - "<" sort by increasing values
245  - "h" draw labels horizontal
246  - "v" draw labels vertical
247  - "u" draw labels up (end of label right adjusted)
248  - "d" draw labels down (start of label left adjusted)
249 
250  When using the option 2 above, new labels are added by doubling the current
251  number of bins in case one label does not exist yet.
252  When the Filling is terminated, it is possible to trim the number
253  of bins to match the number of active labels by calling
254 ~~~ {.cpp}
255  TH1::LabelsDeflate(axis) with axis = "X", "Y" or "Z"
256 ~~~
257  This operation is automatic when using TTree::Draw.
258  Once bin labels have been created, they become persistent if the histogram
259  is written to a file or when generating the C++ code via SavePrimitive.
260 
261 #### Histograms with automatic bins
262 
263  When an histogram is created with an axis lower limit greater or equal
264  to its upper limit, the SetBuffer is automatically called with an
265  argument fBufferSize equal to fgBufferSize (default value=1000).
266  fgBufferSize may be reset via the static function TH1::SetDefaultBufferSize.
267  The axis limits will be automatically computed when the buffer will
268  be full or when the function BufferEmpty is called.
269 
270 #### Filling histograms
271 
272  An histogram is typically filled with statements like:
273 ~~~ {.cpp}
274  h1->Fill(x);
275  h1->Fill(x, w); //fill with weight
276  h2->Fill(x, y)
277  h2->Fill(x, y, w)
278  h3->Fill(x, y, z)
279  h3->Fill(x, y, z, w)
280 ~~~
281  or via one of the Fill functions accepting names described above.
282  The Fill functions compute the bin number corresponding to the given
283  x, y or z argument and increment this bin by the given weight.
284  The Fill functions return the bin number for 1-D histograms or global
285  bin number for 2-D and 3-D histograms.
286  If TH1::Sumw2 has been called before filling, the sum of squares of
287  weights is also stored.
288  One can also increment directly a bin number via TH1::AddBinContent
289  or replace the existing content via TH1::SetBinContent.
290  To access the bin content of a given bin, do:
291 ~~~ {.cpp}
292  Double_t binContent = h->GetBinContent(bin);
293 ~~~
294 
295  By default, the bin number is computed using the current axis ranges.
296  If the automatic binning option has been set via
297 ~~~ {.cpp}
298  h->SetCanExtend(TH1::kAllAxes);
299 ~~~
300  then, the Fill Function will automatically extend the axis range to
301  accomodate the new value specified in the Fill argument. The method
302  used is to double the bin size until the new value fits in the range,
303  merging bins two by two. This automatic binning options is extensively
304  used by the TTree::Draw function when histogramming Tree variables
305  with an unknown range.
306  This automatic binning option is supported for 1-D, 2-D and 3-D histograms.
307 
308  During filling, some statistics parameters are incremented to compute
309  the mean value and Root Mean Square with the maximum precision.
310 
311  In case of histograms of type TH1C, TH1S, TH2C, TH2S, TH3C, TH3S
312  a check is made that the bin contents do not exceed the maximum positive
313  capacity (127 or 32767). Histograms of all types may have positive
314  or/and negative bin contents.
315 
316 #### Rebinning
317  At any time, an histogram can be rebinned via TH1::Rebin. This function
318  returns a new histogram with the rebinned contents.
319  If bin errors were stored, they are recomputed during the rebinning.
320 
321 #### Associated errors
322  By default, for each bin, the sum of weights is computed at fill time.
323  One can also call TH1::Sumw2 to force the storage and computation
324  of the sum of the square of weights per bin.
325  If Sumw2 has been called, the error per bin is computed as the
326  sqrt(sum of squares of weights), otherwise the error is set equal
327  to the sqrt(bin content).
328  To return the error for a given bin number, do:
329 ~~~ {.cpp}
330  Double_t error = h->GetBinError(bin);
331 ~~~
332 
333 #### Associated functions
334  One or more object (typically a TF1*) can be added to the list
335  of functions (fFunctions) associated to each histogram.
336  When TH1::Fit is invoked, the fitted function is added to this list.
337  Given an histogram h, one can retrieve an associated function
338  with:
339 ~~~ {.cpp}
340  TF1 *myfunc = h->GetFunction("myfunc");
341 ~~~
342 
343 #### Operations on histograms
344 
345  Many types of operations are supported on histograms or between histograms
346 
347  - Addition of an histogram to the current histogram.
348  - Additions of two histograms with coefficients and storage into the current
349  histogram.
350  - Multiplications and Divisions are supported in the same way as additions.
351  - The Add, Divide and Multiply functions also exist to add, divide or multiply
352  an histogram by a function.
353 
354  If an histogram has associated error bars (TH1::Sumw2 has been called),
355  the resulting error bars are also computed assuming independent histograms.
356  In case of divisions, Binomial errors are also supported.
357  One can mark a histogram to be an "average" histogram by setting its bit kIsAverage via
358  myhist.SetBit(TH1::kIsAverage);
359  When adding (see TH1::Add) average histograms, the histograms are averaged and not summed.
360 
361 #### Fitting histograms
362 
363  Histograms (1-D, 2-D, 3-D and Profiles) can be fitted with a user
364  specified function via TH1::Fit. When an histogram is fitted, the
365  resulting function with its parameters is added to the list of functions
366  of this histogram. If the histogram is made persistent, the list of
367  associated functions is also persistent. Given a pointer (see above)
368  to an associated function myfunc, one can retrieve the function/fit
369  parameters with calls such as:
370 ~~~ {.cpp}
371  Double_t chi2 = myfunc->GetChisquare();
372  Double_t par0 = myfunc->GetParameter(0); value of 1st parameter
373  Double_t err0 = myfunc->GetParError(0); error on first parameter
374 ~~~
375 
376 #### Projections of histograms
377 
378  One can:
379 
380  - make a 1-D projection of a 2-D histogram or Profile
381  see functions TH2::ProjectionX,Y, TH2::ProfileX,Y, TProfile::ProjectionX
382  - make a 1-D, 2-D or profile out of a 3-D histogram
383  see functions TH3::ProjectionZ, TH3::Project3D.
384 
385  One can fit these projections via:
386 ~~~ {.cpp}
387  TH2::FitSlicesX,Y, TH3::FitSlicesZ.
388 ~~~
389 
390 #### Random Numbers and histograms
391 
392  TH1::FillRandom can be used to randomly fill an histogram using
393  the contents of an existing TF1 function or another
394  TH1 histogram (for all dimensions).
395  For example the following two statements create and fill an histogram
396  10000 times with a default gaussian distribution of mean 0 and sigma 1:
397 ~~~ {.cpp}
398  TH1F h1("h1", "histo from a gaussian", 100, -3, 3);
399  h1.FillRandom("gaus", 10000);
400 ~~~
401  TH1::GetRandom can be used to return a random number distributed
402  according the contents of an histogram.
403 
404 #### Making a copy of an histogram
405  Like for any other ROOT object derived from TObject, one can use
406  the Clone() function. This makes an identical copy of the original
407  histogram including all associated errors and functions, e.g.:
408 ~~~ {.cpp}
409  TH1F *hnew = (TH1F*)h->Clone("hnew");
410 ~~~
411 
412 #### Normalizing histograms
413 
414  One can scale an histogram such that the bins integral is equal to
415  the normalization parameter via TH1::Scale(Double_t norm), where norm
416  is the desired normalization divided by the integral of the histogram.
417 
418 #### Drawing histograms
419 
420  Histograms are drawn via the THistPainter class. Each histogram has
421  a pointer to its own painter (to be usable in a multithreaded program).
422  Many drawing options are supported.
423  See THistPainter::Paint() for more details.
424 
425  The same histogram can be drawn with different options in different pads.
426  When an histogram drawn in a pad is deleted, the histogram is
427  automatically removed from the pad or pads where it was drawn.
428  If an histogram is drawn in a pad, then filled again, the new status
429  of the histogram will be automatically shown in the pad next time
430  the pad is updated. One does not need to redraw the histogram.
431  To draw the current version of an histogram in a pad, one can use
432 ~~~ {.cpp}
433  h->DrawCopy();
434 ~~~
435  This makes a clone (see Clone below) of the histogram. Once the clone
436  is drawn, the original histogram may be modified or deleted without
437  affecting the aspect of the clone.
438 
439  One can use TH1::SetMaximum() and TH1::SetMinimum() to force a particular
440  value for the maximum or the minimum scale on the plot. (For 1-D
441  histograms this means the y-axis, while for 2-D histograms these
442  functions affect the z-axis).
443 
444  TH1::UseCurrentStyle() can be used to change all histogram graphics
445  attributes to correspond to the current selected style.
446  This function must be called for each histogram.
447  In case one reads and draws many histograms from a file, one can force
448  the histograms to inherit automatically the current graphics style
449  by calling before gROOT->ForceStyle().
450 
451 #### Setting Drawing histogram contour levels (2-D hists only)
452 
453  By default contours are automatically generated at equidistant
454  intervals. A default value of 20 levels is used. This can be modified
455  via TH1::SetContour() or TH1::SetContourLevel().
456  the contours level info is used by the drawing options "cont", "surf",
457  and "lego".
458 
459 #### Setting histogram graphics attributes
460 
461  The histogram classes inherit from the attribute classes:
462  TAttLine, TAttFill, and TAttMarker.
463  See the member functions of these classes for the list of options.
464 
465 #### Giving titles to the X, Y and Z axis
466 
467 ~~~ {.cpp}
468  h->GetXaxis()->SetTitle("X axis title");
469  h->GetYaxis()->SetTitle("Y axis title");
470 ~~~
471  The histogram title and the axis titles can be any TLatex string.
472  The titles are part of the persistent histogram.
473  It is also possible to specify the histogram title and the axis
474  titles at creation time. These titles can be given in the "title"
475  parameter. They must be separated by ";":
476 ~~~ {.cpp}
477  TH1F* h=new TH1F("h", "Histogram title;X Axis;Y Axis;Z Axis", 100, 0, 1);
478 ~~~
479  Any title can be omitted:
480 ~~~ {.cpp}
481  TH1F* h=new TH1F("h", "Histogram title;;Y Axis", 100, 0, 1);
482  TH1F* h=new TH1F("h", ";;Y Axis", 100, 0, 1);
483 ~~~
484  The method SetTitle has the same syntax:
485 ~~~ {.cpp}
486  h->SetTitle("Histogram title;Another X title Axis");
487 ~~~
488 
489 #### Saving/Reading histograms to/from a ROOT file
490 
491  The following statements create a ROOT file and store an histogram
492  on the file. Because TH1 derives from TNamed, the key identifier on
493  the file is the histogram name:
494 ~~~ {.cpp}
495  TFile f("histos.root", "new");
496  TH1F h1("hgaus", "histo from a gaussian", 100, -3, 3);
497  h1.FillRandom("gaus", 10000);
498  h1->Write();
499 ~~~
500  To read this histogram in another Root session, do:
501 ~~~ {.cpp}
502  TFile f("histos.root");
503  TH1F *h = (TH1F*)f.Get("hgaus");
504 ~~~
505  One can save all histograms in memory to the file by:
506 ~~~ {.cpp}
507  file->Write();
508 ~~~
509 
510 #### Miscellaneous operations
511 
512 ~~~ {.cpp}
513  TH1::KolmogorovTest(): statistical test of compatibility in shape
514  between two histograms
515  TH1::Smooth() smooths the bin contents of a 1-d histogram
516  TH1::Integral() returns the integral of bin contents in a given bin range
517  TH1::GetMean(int axis) returns the mean value along axis
518  TH1::GetStdDev(int axis) returns the sigma distribution along axis
519  TH1::GetEntries() returns the number of entries
520  TH1::Reset() resets the bin contents and errors of an histogram
521 ~~~
522 */
523 
524 TF1 *gF1=0; //left for back compatibility (use TVirtualFitter::GetUserFunc instead)
525 
526 Int_t TH1::fgBufferSize = 1000;
530 
531 extern void H1InitGaus();
532 extern void H1InitExpo();
533 extern void H1InitPolynom();
534 extern void H1LeastSquareFit(Int_t n, Int_t m, Double_t *a);
535 extern void H1LeastSquareLinearFit(Int_t ndata, Double_t &a0, Double_t &a1, Int_t &ifail);
536 extern void H1LeastSquareSeqnd(Int_t n, Double_t *a, Int_t idim, Int_t &ifail, Int_t k, Double_t *b);
537 
538 // Internal exceptions for the CheckConsistency method
539 class DifferentDimension: public std::exception {};
540 class DifferentNumberOfBins: public std::exception {};
541 class DifferentAxisLimits: public std::exception {};
542 class DifferentBinLimits: public std::exception {};
543 class DifferentLabels: public std::exception {};
544 
545 ClassImp(TH1);
546 
547 ////////////////////////////////////////////////////////////////////////////////
548 /// Histogram default constructor.
549 
551 {
552  fDirectory = 0;
553  fFunctions = new TList;
554  fNcells = 0;
555  fIntegral = 0;
556  fPainter = 0;
557  fEntries = 0;
558  fNormFactor = 0;
560  fMaximum = -1111;
561  fMinimum = -1111;
562  fBufferSize = 0;
563  fBuffer = 0;
565  fStatOverflows = EStatOverflows::kNeutral;
566  fXaxis.SetName("xaxis");
567  fYaxis.SetName("yaxis");
568  fZaxis.SetName("zaxis");
569  fXaxis.SetParent(this);
570  fYaxis.SetParent(this);
571  fZaxis.SetParent(this);
572  UseCurrentStyle();
573 }
574 
575 ////////////////////////////////////////////////////////////////////////////////
576 /// Histogram default destructor.
577 
579 {
580  if (!TestBit(kNotDeleted)) {
581  return;
582  }
583  delete[] fIntegral;
584  fIntegral = 0;
585  delete[] fBuffer;
586  fBuffer = 0;
587  if (fFunctions) {
589 
591  TObject* obj = 0;
592  //special logic to support the case where the same object is
593  //added multiple times in fFunctions.
594  //This case happens when the same object is added with different
595  //drawing modes
596  //In the loop below we must be careful with objects (eg TCutG) that may
597  // have been added to the list of functions of several histograms
598  //and may have been already deleted.
599  while ((obj = fFunctions->First())) {
600  while(fFunctions->Remove(obj)) { }
601  if (!obj->TestBit(kNotDeleted)) {
602  break;
603  }
604  delete obj;
605  obj = 0;
606  }
607  delete fFunctions;
608  fFunctions = 0;
609  }
610  if (fDirectory) {
611  fDirectory->Remove(this);
612  fDirectory = 0;
613  }
614  delete fPainter;
615  fPainter = 0;
616 }
617 
618 ////////////////////////////////////////////////////////////////////////////////
619 /// Normal constructor for fix bin size histograms.
620 /// Creates the main histogram structure.
621 ///
622 /// \param[in] name name of histogram (avoid blanks)
623 /// \param[in] title histogram title.
624 /// If title is of the form stringt;stringx;stringy;stringz`
625 /// the histogram title is set to `stringt`,
626 /// the x axis title to `stringy`, the y axis title to `stringy`, etc.
627 /// \param[in] nbins number of bins
628 /// \param[in] xlow low edge of first bin
629 /// \param[in] xup upper edge of last bin (not included in last bin)
630 ///
631 /// When an histogram is created, it is automatically added to the list
632 /// of special objects in the current directory.
633 /// To find the pointer to this histogram in the current directory
634 /// by its name, do:
635 /// ~~~ {.cpp}
636 /// TH1F *h1 = (TH1F*)gDirectory->FindObject(name);
637 /// ~~~
638 
639 TH1::TH1(const char *name,const char *title,Int_t nbins,Double_t xlow,Double_t xup)
640  :TNamed(name,title), TAttLine(), TAttFill(), TAttMarker()
641 {
642  Build();
643  if (nbins <= 0) {Warning("TH1","nbins is <=0 - set to nbins = 1"); nbins = 1; }
644  fXaxis.Set(nbins,xlow,xup);
645  fNcells = fXaxis.GetNbins()+2;
646 }
647 
648 ////////////////////////////////////////////////////////////////////////////////
649 /// Normal constructor for variable bin size histograms.
650 /// Creates the main histogram structure.
651 ///
652 /// \param[in] name name of histogram (avoid blanks)
653 /// \param[in] title histogram title.
654 /// If title is of the form `stringt;stringx;stringy;stringz`
655 /// the histogram title is set to `stringt`,
656 /// the x axis title to `stringy`, the y axis title to `stringy`, etc.
657 /// \param[in] nbins number of bins
658 /// \param[in] xbins array of low-edges for each bin.
659 /// This is an array of size nbins+1
660 
661 TH1::TH1(const char *name,const char *title,Int_t nbins,const Float_t *xbins)
662  :TNamed(name,title), TAttLine(), TAttFill(), TAttMarker()
663 {
664  Build();
665  if (nbins <= 0) {Warning("TH1","nbins is <=0 - set to nbins = 1"); nbins = 1; }
666  if (xbins) fXaxis.Set(nbins,xbins);
667  else fXaxis.Set(nbins,0,1);
668  fNcells = fXaxis.GetNbins()+2;
669 }
670 
671 ////////////////////////////////////////////////////////////////////////////////
672 /// Normal constructor for variable bin size histograms.
673 ///
674 /// \param[in] name name of histogram (avoid blanks)
675 /// \param[in] title histogram title.
676 /// If title is of the form `stringt;stringx;stringy;stringz`
677 /// the histogram title is set to `stringt`,
678 /// the x axis title to `stringy`, the y axis title to `stringy`, etc.
679 /// \param[in] nbins number of bins
680 /// \param[in] xbins array of low-edges for each bin.
681 /// This is an array of size nbins+1
682 
683 TH1::TH1(const char *name,const char *title,Int_t nbins,const Double_t *xbins)
684  :TNamed(name,title), TAttLine(), TAttFill(), TAttMarker()
685 {
686  Build();
687  if (nbins <= 0) {Warning("TH1","nbins is <=0 - set to nbins = 1"); nbins = 1; }
688  if (xbins) fXaxis.Set(nbins,xbins);
689  else fXaxis.Set(nbins,0,1);
690  fNcells = fXaxis.GetNbins()+2;
691 }
692 
693 ////////////////////////////////////////////////////////////////////////////////
694 /// Copy constructor.
695 /// The list of functions is not copied. (Use Clone if needed)
696 
698 {
699  ((TH1&)h).Copy(*this);
700 }
701 
702 ////////////////////////////////////////////////////////////////////////////////
703 /// Static function: cannot be inlined on Windows/NT.
704 
706 {
707  return fgAddDirectory;
708 }
709 
710 ////////////////////////////////////////////////////////////////////////////////
711 /// Browse the Histogram object.
712 
714 {
715  Draw(b ? b->GetDrawOption() : "");
716  gPad->Update();
717 }
718 
719 ////////////////////////////////////////////////////////////////////////////////
720 /// Creates histogram basic data structure.
721 
723 {
724  fDirectory = 0;
725  fPainter = 0;
726  fIntegral = 0;
727  fEntries = 0;
728  fNormFactor = 0;
730  fMaximum = -1111;
731  fMinimum = -1111;
732  fBufferSize = 0;
733  fBuffer = 0;
735  fStatOverflows = EStatOverflows::kNeutral;
736  fXaxis.SetName("xaxis");
737  fYaxis.SetName("yaxis");
738  fZaxis.SetName("zaxis");
739  fYaxis.Set(1,0.,1.);
740  fZaxis.Set(1,0.,1.);
741  fXaxis.SetParent(this);
742  fYaxis.SetParent(this);
743  fZaxis.SetParent(this);
744 
745  SetTitle(fTitle.Data());
746 
747  fFunctions = new TList;
748 
749  UseCurrentStyle();
750 
751  if (TH1::AddDirectoryStatus()) {
753  if (fDirectory) {
754  fFunctions->UseRWLock();
755  fDirectory->Append(this,kTRUE);
756  }
757  }
758 }
759 
760 ////////////////////////////////////////////////////////////////////////////////
761 /// Performs the operation: `this = this + c1*f1`
762 /// if errors are defined (see TH1::Sumw2), errors are also recalculated.
763 ///
764 /// By default, the function is computed at the centre of the bin.
765 /// if option "I" is specified (1-d histogram only), the integral of the
766 /// function in each bin is used instead of the value of the function at
767 /// the centre of the bin.
768 ///
769 /// Only bins inside the function range are recomputed.
770 ///
771 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
772 /// you should call Sumw2 before making this operation.
773 /// This is particularly important if you fit the histogram after TH1::Add
774 ///
775 /// The function return kFALSE if the Add operation failed
776 
778 {
779  if (!f1) {
780  Error("Add","Attempt to add a non-existing function");
781  return kFALSE;
782  }
783 
784  TString opt = option;
785  opt.ToLower();
786  Bool_t integral = kFALSE;
787  if (opt.Contains("i") && fDimension == 1) integral = kTRUE;
788 
789  Int_t ncellsx = GetNbinsX() + 2; // cells = normal bins + underflow bin + overflow bin
790  Int_t ncellsy = GetNbinsY() + 2;
791  Int_t ncellsz = GetNbinsZ() + 2;
792  if (fDimension < 2) ncellsy = 1;
793  if (fDimension < 3) ncellsz = 1;
794 
795  // delete buffer if it is there since it will become invalid
796  if (fBuffer) BufferEmpty(1);
797 
798  // - Add statistics
799  Double_t s1[10];
800  for (Int_t i = 0; i < 10; ++i) s1[i] = 0;
801  PutStats(s1);
802  SetMinimum();
803  SetMaximum();
804 
805  // - Loop on bins (including underflows/overflows)
806  Int_t bin, binx, biny, binz;
807  Double_t cu=0;
808  Double_t xx[3];
809  Double_t *params = 0;
810  f1->InitArgs(xx,params);
811  for (binz = 0; binz < ncellsz; ++binz) {
812  xx[2] = fZaxis.GetBinCenter(binz);
813  for (biny = 0; biny < ncellsy; ++biny) {
814  xx[1] = fYaxis.GetBinCenter(biny);
815  for (binx = 0; binx < ncellsx; ++binx) {
816  xx[0] = fXaxis.GetBinCenter(binx);
817  if (!f1->IsInside(xx)) continue;
819  bin = binx + ncellsx * (biny + ncellsy * binz);
820  if (integral) {
821  cu = c1*f1->Integral(fXaxis.GetBinLowEdge(binx), fXaxis.GetBinUpEdge(binx), 0.) / fXaxis.GetBinWidth(binx);
822  } else {
823  cu = c1*f1->EvalPar(xx);
824  }
825  if (TF1::RejectedPoint()) continue;
826  AddBinContent(bin,cu);
827  }
828  }
829  }
830 
831  return kTRUE;
832 }
833 
834 ////////////////////////////////////////////////////////////////////////////////
835 /// Performs the operation: `this = this + c1*h1`
836 /// If errors are defined (see TH1::Sumw2), errors are also recalculated.
837 ///
838 /// Note that if h1 has Sumw2 set, Sumw2 is automatically called for this
839 /// if not already set.
840 ///
841 /// Note also that adding histogram with labels is not supported, histogram will be
842 /// added merging them by bin number independently of the labels.
843 /// For adding histogram with labels one should use TH1::Merge
844 ///
845 /// SPECIAL CASE (Average/Efficiency histograms)
846 /// For histograms representing averages or efficiencies, one should compute the average
847 /// of the two histograms and not the sum. One can mark a histogram to be an average
848 /// histogram by setting its bit kIsAverage with
849 /// myhist.SetBit(TH1::kIsAverage);
850 /// Note that the two histograms must have their kIsAverage bit set
851 ///
852 /// IMPORTANT NOTE1: If you intend to use the errors of this histogram later
853 /// you should call Sumw2 before making this operation.
854 /// This is particularly important if you fit the histogram after TH1::Add
855 ///
856 /// IMPORTANT NOTE2: if h1 has a normalisation factor, the normalisation factor
857 /// is used , ie this = this + c1*factor*h1
858 /// Use the other TH1::Add function if you do not want this feature
859 ///
860 /// The function return kFALSE if the Add operation failed
861 
863 {
864  if (!h1) {
865  Error("Add","Attempt to add a non-existing histogram");
866  return kFALSE;
867  }
868 
869  // delete buffer if it is there since it will become invalid
870  if (fBuffer) BufferEmpty(1);
871 
872  bool useMerge = (c1 == 1. && !this->TestBit(kIsAverage) && !h1->TestBit(kIsAverage) );
873  try {
874  CheckConsistency(this,h1);
875  useMerge = kFALSE;
876  } catch(DifferentNumberOfBins&) {
877  if (useMerge)
878  Info("Add","Attempt to add histograms with different number of bins - trying to use TH1::Merge");
879  else {
880  Error("Add","Attempt to add histograms with different number of bins : nbins h1 = %d , nbins h2 = %d",GetNbinsX(), h1->GetNbinsX());
881  return kFALSE;
882  }
883  } catch(DifferentAxisLimits&) {
884  if (useMerge)
885  Info("Add","Attempt to add histograms with different axis limits - trying to use TH1::Merge");
886  else
887  Warning("Add","Attempt to add histograms with different axis limits");
888  } catch(DifferentBinLimits&) {
889  if (useMerge)
890  Info("Add","Attempt to add histograms with different bin limits - trying to use TH1::Merge");
891  else
892  Warning("Add","Attempt to add histograms with different bin limits");
893  } catch(DifferentLabels&) {
894  // in case of different labels -
895  if (useMerge)
896  Info("Add","Attempt to add histograms with different labels - trying to use TH1::Merge");
897  else
898  Info("Warning","Attempt to add histograms with different labels");
899  }
900 
901  if (useMerge) {
902  TList l;
903  l.Add(const_cast<TH1*>(h1));
904  auto iret = Merge(&l);
905  return (iret >= 0);
906  }
907 
908  // Create Sumw2 if h1 has Sumw2 set
909  if (fSumw2.fN == 0 && h1->GetSumw2N() != 0) Sumw2();
910 
911  // - Add statistics
912  Double_t entries = TMath::Abs( GetEntries() + c1 * h1->GetEntries() );
913 
914  // statistics can be preserved only in case of positive coefficients
915  // otherwise with negative c1 (histogram subtraction) one risks to get negative variances
916  Bool_t resetStats = (c1 < 0);
917  Double_t s1[kNstat] = {0};
918  Double_t s2[kNstat] = {0};
919  if (!resetStats) {
920  // need to initialize to zero s1 and s2 since
921  // GetStats fills only used elements depending on dimension and type
922  GetStats(s1);
923  h1->GetStats(s2);
924  }
925 
926  SetMinimum();
927  SetMaximum();
928 
929  // - Loop on bins (including underflows/overflows)
930  Double_t factor = 1;
931  if (h1->GetNormFactor() != 0) factor = h1->GetNormFactor()/h1->GetSumOfWeights();;
932  Double_t c1sq = c1 * c1;
933  Double_t factsq = factor * factor;
934 
935  for (Int_t bin = 0; bin < fNcells; ++bin) {
936  //special case where histograms have the kIsAverage bit set
937  if (this->TestBit(kIsAverage) && h1->TestBit(kIsAverage)) {
938  Double_t y1 = h1->RetrieveBinContent(bin);
939  Double_t y2 = this->RetrieveBinContent(bin);
940  Double_t e1sq = h1->GetBinErrorSqUnchecked(bin);
941  Double_t e2sq = this->GetBinErrorSqUnchecked(bin);
942  Double_t w1 = 1., w2 = 1.;
943 
944  // consider all special cases when bin errors are zero
945  // see http://root-forum.cern.ch/viewtopic.php?f=3&t=13299
946  if (e1sq) w1 = 1. / e1sq;
947  else if (h1->fSumw2.fN) {
948  w1 = 1.E200; // use an arbitrary huge value
949  if (y1 == 0) {
950  // use an estimated error from the global histogram scale
951  double sf = (s2[0] != 0) ? s2[1]/s2[0] : 1;
952  w1 = 1./(sf*sf);
953  }
954  }
955  if (e2sq) w2 = 1. / e2sq;
956  else if (fSumw2.fN) {
957  w2 = 1.E200; // use an arbitrary huge value
958  if (y2 == 0) {
959  // use an estimated error from the global histogram scale
960  double sf = (s1[0] != 0) ? s1[1]/s1[0] : 1;
961  w2 = 1./(sf*sf);
962  }
963  }
964 
965  double y = (w1*y1 + w2*y2)/(w1 + w2);
966  UpdateBinContent(bin, y);
967  if (fSumw2.fN) {
968  double err2 = 1./(w1 + w2);
969  if (err2 < 1.E-200) err2 = 0; // to remove arbitrary value when e1=0 AND e2=0
970  fSumw2.fArray[bin] = err2;
971  }
972  } else { // normal case of addition between histograms
973  AddBinContent(bin, c1 * factor * h1->RetrieveBinContent(bin));
974  if (fSumw2.fN) fSumw2.fArray[bin] += c1sq * factsq * h1->GetBinErrorSqUnchecked(bin);
975  }
976  }
977 
978  // update statistics (do here to avoid changes by SetBinContent)
979  if (resetStats) {
980  // statistics need to be reset in case coefficient are negative
981  ResetStats();
982  }
983  else {
984  for (Int_t i=0;i<kNstat;i++) {
985  if (i == 1) s1[i] += c1*c1*s2[i];
986  else s1[i] += c1*s2[i];
987  }
988  PutStats(s1);
989  SetEntries(entries);
990  }
991  return kTRUE;
992 }
993 
994 ////////////////////////////////////////////////////////////////////////////////
995 /// Replace contents of this histogram by the addition of h1 and h2.
996 ///
997 /// `this = c1*h1 + c2*h2`
998 /// if errors are defined (see TH1::Sumw2), errors are also recalculated
999 ///
1000 /// Note that if h1 or h2 have Sumw2 set, Sumw2 is automatically called for this
1001 /// if not already set.
1002 ///
1003 /// Note also that adding histogram with labels is not supported, histogram will be
1004 /// added merging them by bin number independently of the labels.
1005 /// For adding histogram ith labels one should use TH1::Merge
1006 ///
1007 /// SPECIAL CASE (Average/Efficiency histograms)
1008 /// For histograms representing averages or efficiencies, one should compute the average
1009 /// of the two histograms and not the sum. One can mark a histogram to be an average
1010 /// histogram by setting its bit kIsAverage with
1011 /// myhist.SetBit(TH1::kIsAverage);
1012 /// Note that the two histograms must have their kIsAverage bit set
1013 ///
1014 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
1015 /// you should call Sumw2 before making this operation.
1016 /// This is particularly important if you fit the histogram after TH1::Add
1017 ///
1018 /// ANOTHER SPECIAL CASE : h1 = h2 and c2 < 0
1019 /// do a scaling this = c1 * h1 / (bin Volume)
1020 ///
1021 /// The function returns kFALSE if the Add operation failed
1022 
1024 {
1025 
1026  if (!h1 || !h2) {
1027  Error("Add","Attempt to add a non-existing histogram");
1028  return kFALSE;
1029  }
1030 
1031  // delete buffer if it is there since it will become invalid
1032  if (fBuffer) BufferEmpty(1);
1033 
1034  Bool_t normWidth = kFALSE;
1035  if (h1 == h2 && c2 < 0) {c2 = 0; normWidth = kTRUE;}
1036 
1037  if (h1 != h2) {
1038  bool useMerge = (c1 == 1. && c2 == 1. && !this->TestBit(kIsAverage) && !h1->TestBit(kIsAverage) );
1039 
1040  try {
1041  CheckConsistency(h1,h2);
1042  CheckConsistency(this,h1);
1043  useMerge = kFALSE;
1044  } catch(DifferentNumberOfBins&) {
1045  if (useMerge)
1046  Info("Add","Attempt to add histograms with different number of bins - trying to use TH1::Merge");
1047  else {
1048  Error("Add","Attempt to add histograms with different number of bins : nbins h1 = %d , nbins h2 = %d",GetNbinsX(), h1->GetNbinsX());
1049  return kFALSE;
1050  }
1051  } catch(DifferentAxisLimits&) {
1052  if (useMerge)
1053  Info("Add","Attempt to add histograms with different axis limits - trying to use TH1::Merge");
1054  else
1055  Warning("Add","Attempt to add histograms with different axis limits");
1056  } catch(DifferentBinLimits&) {
1057  if (useMerge)
1058  Info("Add","Attempt to add histograms with different bin limits - trying to use TH1::Merge");
1059  else
1060  Warning("Add","Attempt to add histograms with different bin limits");
1061  } catch(DifferentLabels&) {
1062  // in case of different labels -
1063  if (useMerge)
1064  Info("Add","Attempt to add histograms with different labels - trying to use TH1::Merge");
1065  else
1066  Info("Warning","Attempt to add histograms with different labels");
1067  }
1068 
1069  if (useMerge) {
1070  TList l;
1071  // why TList takes non-const pointers ????
1072  l.Add(const_cast<TH1*>(h1));
1073  l.Add(const_cast<TH1*>(h2));
1074  Reset("ICE");
1075  auto iret = Merge(&l);
1076  return (iret >= 0);
1077  }
1078  }
1079 
1080  // Create Sumw2 if h1 or h2 have Sumw2 set
1081  if (fSumw2.fN == 0 && (h1->GetSumw2N() != 0 || h2->GetSumw2N() != 0)) Sumw2();
1082 
1083  // - Add statistics
1084  Double_t nEntries = TMath::Abs( c1*h1->GetEntries() + c2*h2->GetEntries() );
1085 
1086  // TODO remove
1087  // statistics can be preserved only in case of positive coefficients
1088  // otherwise with negative c1 (histogram subtraction) one risks to get negative variances
1089  // also in case of scaling with the width we cannot preserve the statistics
1090  Double_t s1[kNstat] = {0};
1091  Double_t s2[kNstat] = {0};
1092  Double_t s3[kNstat];
1093 
1094 
1095  Bool_t resetStats = (c1*c2 < 0) || normWidth;
1096  if (!resetStats) {
1097  // need to initialize to zero s1 and s2 since
1098  // GetStats fills only used elements depending on dimension and type
1099  h1->GetStats(s1);
1100  h2->GetStats(s2);
1101  for (Int_t i=0;i<kNstat;i++) {
1102  if (i == 1) s3[i] = c1*c1*s1[i] + c2*c2*s2[i];
1103  //else s3[i] = TMath::Abs(c1)*s1[i] + TMath::Abs(c2)*s2[i];
1104  else s3[i] = c1*s1[i] + c2*s2[i];
1105  }
1106  }
1107 
1108  SetMinimum();
1109  SetMaximum();
1110 
1111  if (normWidth) { // DEPRECATED CASE: belongs to fitting / drawing modules
1112 
1113  Int_t nbinsx = GetNbinsX() + 2; // normal bins + underflow, overflow
1114  Int_t nbinsy = GetNbinsY() + 2;
1115  Int_t nbinsz = GetNbinsZ() + 2;
1116 
1117  if (fDimension < 2) nbinsy = 1;
1118  if (fDimension < 3) nbinsz = 1;
1119 
1120  Int_t bin, binx, biny, binz;
1121  for (binz = 0; binz < nbinsz; ++binz) {
1122  Double_t wz = h1->GetZaxis()->GetBinWidth(binz);
1123  for (biny = 0; biny < nbinsy; ++biny) {
1124  Double_t wy = h1->GetYaxis()->GetBinWidth(biny);
1125  for (binx = 0; binx < nbinsx; ++binx) {
1126  Double_t wx = h1->GetXaxis()->GetBinWidth(binx);
1127  bin = GetBin(binx, biny, binz);
1128  Double_t w = wx*wy*wz;
1129  UpdateBinContent(bin, c1 * h1->RetrieveBinContent(bin) / w);
1130  if (fSumw2.fN) {
1131  Double_t e1 = h1->GetBinError(bin)/w;
1132  fSumw2.fArray[bin] = c1*c1*e1*e1;
1133  }
1134  }
1135  }
1136  }
1137  } else if (h1->TestBit(kIsAverage) && h2->TestBit(kIsAverage)) {
1138  for (Int_t i = 0; i < fNcells; ++i) { // loop on cells (bins including underflow / overflow)
1139  // special case where histograms have the kIsAverage bit set
1140  Double_t y1 = h1->RetrieveBinContent(i);
1141  Double_t y2 = h2->RetrieveBinContent(i);
1142  Double_t e1sq = h1->GetBinErrorSqUnchecked(i);
1143  Double_t e2sq = h2->GetBinErrorSqUnchecked(i);
1144  Double_t w1 = 1., w2 = 1.;
1145 
1146  // consider all special cases when bin errors are zero
1147  // see http://root-forum.cern.ch/viewtopic.php?f=3&t=13299
1148  if (e1sq) w1 = 1./ e1sq;
1149  else if (h1->fSumw2.fN) {
1150  w1 = 1.E200; // use an arbitrary huge value
1151  if (y1 == 0 ) { // use an estimated error from the global histogram scale
1152  double sf = (s1[0] != 0) ? s1[1]/s1[0] : 1;
1153  w1 = 1./(sf*sf);
1154  }
1155  }
1156  if (e2sq) w2 = 1./ e2sq;
1157  else if (h2->fSumw2.fN) {
1158  w2 = 1.E200; // use an arbitrary huge value
1159  if (y2 == 0) { // use an estimated error from the global histogram scale
1160  double sf = (s2[0] != 0) ? s2[1]/s2[0] : 1;
1161  w2 = 1./(sf*sf);
1162  }
1163  }
1164 
1165  double y = (w1*y1 + w2*y2)/(w1 + w2);
1166  UpdateBinContent(i, y);
1167  if (fSumw2.fN) {
1168  double err2 = 1./(w1 + w2);
1169  if (err2 < 1.E-200) err2 = 0; // to remove arbitrary value when e1=0 AND e2=0
1170  fSumw2.fArray[i] = err2;
1171  }
1172  }
1173  } else { // case of simple histogram addition
1174  Double_t c1sq = c1 * c1;
1175  Double_t c2sq = c2 * c2;
1176  for (Int_t i = 0; i < fNcells; ++i) { // Loop on cells (bins including underflows/overflows)
1177  UpdateBinContent(i, c1 * h1->RetrieveBinContent(i) + c2 * h2->RetrieveBinContent(i));
1178  if (fSumw2.fN) {
1179  fSumw2.fArray[i] = c1sq * h1->GetBinErrorSqUnchecked(i) + c2sq * h2->GetBinErrorSqUnchecked(i);
1180  }
1181  }
1182  }
1183 
1184  if (resetStats) {
1185  // statistics need to be reset in case coefficient are negative
1186  ResetStats();
1187  }
1188  else {
1189  // update statistics (do here to avoid changes by SetBinContent) FIXME remove???
1190  PutStats(s3);
1191  SetEntries(nEntries);
1192  }
1193 
1194  return kTRUE;
1195 }
1196 
1197 ////////////////////////////////////////////////////////////////////////////////
1198 /// Increment bin content by 1.
1199 
1201 {
1202  AbstractMethod("AddBinContent");
1203 }
1204 
1205 ////////////////////////////////////////////////////////////////////////////////
1206 /// Increment bin content by a weight w.
1207 
1209 {
1210  AbstractMethod("AddBinContent");
1211 }
1212 
1213 ////////////////////////////////////////////////////////////////////////////////
1214 /// Sets the flag controlling the automatic add of histograms in memory
1215 ///
1216 /// By default (fAddDirectory = kTRUE), histograms are automatically added
1217 /// to the list of objects in memory.
1218 /// Note that one histogram can be removed from its support directory
1219 /// by calling h->SetDirectory(0) or h->SetDirectory(dir) to add it
1220 /// to the list of objects in the directory dir.
1221 ///
1222 /// NOTE that this is a static function. To call it, use;
1223 /// TH1::AddDirectory
1224 
1226 {
1227  fgAddDirectory = add;
1228 }
1229 
1230 ////////////////////////////////////////////////////////////////////////////////
1231 /// Auxilliary function to get the power of 2 next (larger) or previous (smaller)
1232 /// a given x
1233 ///
1234 /// next = kTRUE : next larger
1235 /// next = kFALSE : previous smaller
1236 ///
1237 /// Used by the autobin power of 2 algorithm
1238 
1240 {
1241  Int_t nn;
1242  Double_t f2 = std::frexp(x, &nn);
1243  return ((next && x > 0.) || (!next && x <= 0.)) ? std::ldexp(std::copysign(1., f2), nn)
1244  : std::ldexp(std::copysign(1., f2), --nn);
1245 }
1246 
1247 ////////////////////////////////////////////////////////////////////////////////
1248 /// Auxilliary function to get the next power of 2 integer value larger then n
1249 ///
1250 /// Used by the autobin power of 2 algorithm
1251 
1253 {
1254  Int_t nn;
1255  Double_t f2 = std::frexp(n, &nn);
1256  if (TMath::Abs(f2 - .5) > 0.001)
1257  return (Int_t)std::ldexp(1., nn);
1258  return n;
1259 }
1260 
1261 ////////////////////////////////////////////////////////////////////////////////
1262 /// Buffer-based estimate of the histogram range using the power of 2 algorithm.
1263 ///
1264 /// Used by the autobin power of 2 algorithm.
1265 ///
1266 /// Works on arguments (min and max from fBuffer) and internal inputs: fXmin,
1267 /// fXmax, NBinsX (from fXaxis), ...
1268 /// Result save internally in fXaxis.
1269 ///
1270 /// Overloaded by TH2 and TH3.
1271 ///
1272 /// Return -1 if internal inputs are incosistent, 0 otherwise.
1273 ///
1274 
1276 {
1277  // We need meaningful raw limits
1278  if (xmi >= xma)
1279  return -1;
1280 
1282  Double_t xhmi = fXaxis.GetXmin();
1283  Double_t xhma = fXaxis.GetXmax();
1284 
1285  // Now adjust
1286  if (TMath::Abs(xhma) > TMath::Abs(xhmi)) {
1287  // Start from the upper limit
1288  xhma = TH1::AutoP2GetPower2(xhma);
1289  xhmi = xhma - TH1::AutoP2GetPower2(xhma - xhmi);
1290  } else {
1291  // Start from the lower limit
1292  xhmi = TH1::AutoP2GetPower2(xhmi, kFALSE);
1293  xhma = xhmi + TH1::AutoP2GetPower2(xhma - xhmi);
1294  }
1295 
1296  // Round the bins to the next power of 2; take into account the possible inflation
1297  // of the range
1298  Double_t rr = (xhma - xhmi) / (xma - xmi);
1299  Int_t nb = TH1::AutoP2GetBins((Int_t)(rr * GetNbinsX()));
1300 
1301  // Adjust using the same bin width and offsets
1302  Double_t bw = (xhma - xhmi) / nb;
1303  // Bins to left free on each side
1304  Double_t autoside = gEnv->GetValue("Hist.Binning.Auto.Side", 0.05);
1305  Int_t nbside = (Int_t)(nb * autoside);
1306 
1307  // Side up
1308  Int_t nbup = (xhma - xma) / bw;
1309  if (nbup % 2 != 0)
1310  nbup++; // Must be even
1311  if (nbup != nbside) {
1312  // Accounts also for both case: larger or smaller
1313  xhma -= bw * (nbup - nbside);
1314  nb -= (nbup - nbside);
1315  }
1316 
1317  // Side low
1318  Int_t nblw = (xmi - xhmi) / bw;
1319  if (nblw % 2 != 0)
1320  nblw++; // Must be even
1321  if (nblw != nbside) {
1322  // Accounts also for both case: larger or smaller
1323  xhmi += bw * (nblw - nbside);
1324  nb -= (nblw - nbside);
1325  }
1326 
1327  // Set everything and project
1328  SetBins(nb, xhmi, xhma);
1329 
1330  // Done
1331  return 0;
1332 }
1333 
1334 /// Fill histogram with all entries in the buffer.
1335 ///
1336 /// - action = -1 histogram is reset and refilled from the buffer (called by THistPainter::Paint)
1337 /// - action = 0 histogram is reset and filled from the buffer. When the histogram is filled from the
1338 /// buffer the value fBuffer[0] is set to a negative number (= - number of entries)
1339 /// When calling with action == 0 the histogram is NOT refilled when fBuffer[0] is < 0
1340 /// While when calling with action = -1 the histogram is reset and ALWAYS refilled independently if
1341 /// the histogram was filled before. This is needed when drawing the histogram
1342 /// - action = 1 histogram is filled and buffer is deleted
1343 /// The buffer is automatically deleted when filling the histogram and the entries is
1344 /// larger than the buffer size
1345 
1347 {
1348  // do we need to compute the bin size?
1349  if (!fBuffer) return 0;
1350  Int_t nbentries = (Int_t)fBuffer[0];
1351 
1352  // nbentries correspond to the number of entries of histogram
1353 
1354  if (nbentries == 0) {
1355  // if action is 1 we delete the buffer
1356  // this will avoid infinite recursion
1357  if (action > 0) {
1358  delete [] fBuffer;
1359  fBuffer = 0;
1360  fBufferSize = 0;
1361  }
1362  return 0;
1363  }
1364  if (nbentries < 0 && action == 0) return 0; // case histogram has been already filled from the buffer
1365 
1366  Double_t *buffer = fBuffer;
1367  if (nbentries < 0) {
1368  nbentries = -nbentries;
1369  // a reset might call BufferEmpty() giving an infinite recursion
1370  // Protect it by setting fBuffer = 0
1371  fBuffer=0;
1372  //do not reset the list of functions
1373  Reset("ICES");
1374  fBuffer = buffer;
1375  }
1376  if (CanExtendAllAxes() || (fXaxis.GetXmax() <= fXaxis.GetXmin())) {
1377  //find min, max of entries in buffer
1378  Double_t xmin = fBuffer[2];
1379  Double_t xmax = xmin;
1380  for (Int_t i=1;i<nbentries;i++) {
1381  Double_t x = fBuffer[2*i+2];
1382  if (x < xmin) xmin = x;
1383  if (x > xmax) xmax = x;
1384  }
1385  if (fXaxis.GetXmax() <= fXaxis.GetXmin()) {
1386  Int_t rc = -1;
1387  if (TestBit(TH1::kAutoBinPTwo)) {
1388  if ((rc = AutoP2FindLimits(xmin, xmax)) < 0)
1389  Warning("BufferEmpty",
1390  "incosistency found by power-of-2 autobin algorithm: fallback to standard method");
1391  }
1392  if (rc < 0)
1393  THLimitsFinder::GetLimitsFinder()->FindGoodLimits(this, xmin, xmax);
1394  } else {
1395  fBuffer = 0;
1396  Int_t keep = fBufferSize; fBufferSize = 0;
1397  if (xmin < fXaxis.GetXmin()) ExtendAxis(xmin, &fXaxis);
1398  if (xmax >= fXaxis.GetXmax()) ExtendAxis(xmax, &fXaxis);
1399  fBuffer = buffer;
1400  fBufferSize = keep;
1401  }
1402  }
1403 
1404  // call DoFillN which will not put entries in the buffer as FillN does
1405  // set fBuffer to zero to avoid re-emptying the buffer from functions called
1406  // by DoFillN (e.g Sumw2)
1407  buffer = fBuffer; fBuffer = 0;
1408  DoFillN(nbentries,&buffer[2],&buffer[1],2);
1409  fBuffer = buffer;
1410 
1411  // if action == 1 - delete the buffer
1412  if (action > 0) {
1413  delete [] fBuffer;
1414  fBuffer = 0;
1415  fBufferSize = 0;
1416  } else {
1417  // if number of entries is consistent with buffer - set it negative to avoid
1418  // refilling the histogram every time BufferEmpty(0) is called
1419  // In case it is not consistent, by setting fBuffer[0]=0 is like resetting the buffer
1420  // (it will not be used anymore the next time BufferEmpty is called)
1421  if (nbentries == (Int_t)fEntries)
1422  fBuffer[0] = -nbentries;
1423  else
1424  fBuffer[0] = 0;
1425  }
1426  return nbentries;
1427 }
1428 
1429 ////////////////////////////////////////////////////////////////////////////////
1430 /// accumulate arguments in buffer. When buffer is full, empty the buffer
1431 ///
1432 /// - `fBuffer[0]` = number of entries in buffer
1433 /// - `fBuffer[1]` = w of first entry
1434 /// - `fBuffer[2]` = x of first entry
1435 
1437 {
1438  if (!fBuffer) return -2;
1439  Int_t nbentries = (Int_t)fBuffer[0];
1440 
1441 
1442  if (nbentries < 0) {
1443  // reset nbentries to a positive value so next time BufferEmpty() is called
1444  // the histogram will be refilled
1445  nbentries = -nbentries;
1446  fBuffer[0] = nbentries;
1447  if (fEntries > 0) {
1448  // set fBuffer to zero to avoid calling BufferEmpty in Reset
1449  Double_t *buffer = fBuffer; fBuffer=0;
1450  Reset("ICES"); // do not reset list of functions
1451  fBuffer = buffer;
1452  }
1453  }
1454  if (2*nbentries+2 >= fBufferSize) {
1455  BufferEmpty(1);
1456  if (!fBuffer)
1457  // to avoid infinite recursion Fill->BufferFill->Fill
1458  return Fill(x,w);
1459  // this cannot happen
1460  R__ASSERT(0);
1461  }
1462  fBuffer[2*nbentries+1] = w;
1463  fBuffer[2*nbentries+2] = x;
1464  fBuffer[0] += 1;
1465  return -2;
1466 }
1467 
1468 ////////////////////////////////////////////////////////////////////////////////
1469 /// Check bin limits.
1470 
1471 bool TH1::CheckBinLimits(const TAxis* a1, const TAxis * a2)
1472 {
1473  const TArrayD * h1Array = a1->GetXbins();
1474  const TArrayD * h2Array = a2->GetXbins();
1475  Int_t fN = h1Array->fN;
1476  if ( fN != 0 ) {
1477  if ( h2Array->fN != fN ) {
1478  throw DifferentBinLimits();
1479  return false;
1480  }
1481  else {
1482  for ( int i = 0; i < fN; ++i ) {
1483  if ( ! TMath::AreEqualRel( h1Array->GetAt(i), h2Array->GetAt(i), 1E-10 ) ) {
1484  throw DifferentBinLimits();
1485  return false;
1486  }
1487  }
1488  }
1489  }
1490 
1491  return true;
1492 }
1493 
1494 ////////////////////////////////////////////////////////////////////////////////
1495 /// Check that axis have same labels.
1496 
1497 bool TH1::CheckBinLabels(const TAxis* a1, const TAxis * a2)
1498 {
1499  THashList *l1 = a1->GetLabels();
1500  THashList *l2 = a2->GetLabels();
1501 
1502  if (!l1 && !l2 )
1503  return true;
1504  if (!l1 || !l2 ) {
1505  throw DifferentLabels();
1506  return false;
1507  }
1508  // check now labels sizes are the same
1509  if (l1->GetSize() != l2->GetSize() ) {
1510  throw DifferentLabels();
1511  return false;
1512  }
1513  for (int i = 1; i <= a1->GetNbins(); ++i) {
1514  TString label1 = a1->GetBinLabel(i);
1515  TString label2 = a2->GetBinLabel(i);
1516  if (label1 != label2) {
1517  throw DifferentLabels();
1518  return false;
1519  }
1520  }
1521 
1522  return true;
1523 }
1524 
1525 ////////////////////////////////////////////////////////////////////////////////
1526 /// Check that the axis limits of the histograms are the same.
1527 /// If a first and last bin is passed the axis is compared between the given range
1528 
1529 bool TH1::CheckAxisLimits(const TAxis *a1, const TAxis *a2 )
1530 {
1531  if ( ! TMath::AreEqualRel(a1->GetXmin(), a2->GetXmin(),1.E-12) ||
1532  ! TMath::AreEqualRel(a1->GetXmax(), a2->GetXmax(),1.E-12) ) {
1533  throw DifferentAxisLimits();
1534  return false;
1535  }
1536  return true;
1537 }
1538 
1539 ////////////////////////////////////////////////////////////////////////////////
1540 /// Check that the axis are the same
1541 
1542 bool TH1::CheckEqualAxes(const TAxis *a1, const TAxis *a2 )
1543 {
1544  if (a1->GetNbins() != a2->GetNbins() ) {
1545  //throw DifferentNumberOfBins();
1546  ::Info("CheckEqualAxes","Axes have different number of bins : nbin1 = %d nbin2 = %d",a1->GetNbins(),a2->GetNbins() );
1547  return false;
1548  }
1549  try {
1550  CheckAxisLimits(a1,a2);
1551  } catch (DifferentAxisLimits&) {
1552  ::Info("CheckEqualAxes","Axes have different limits");
1553  return false;
1554  }
1555  try {
1556  CheckBinLimits(a1,a2);
1557  } catch (DifferentBinLimits&) {
1558  ::Info("CheckEqualAxes","Axes have different bin limits");
1559  return false;
1560  }
1561 
1562  // check labels
1563  try {
1564  CheckBinLabels(a1,a2);
1565  } catch (DifferentLabels&) {
1566  ::Info("CheckEqualAxes","Axes have different labels");
1567  return false;
1568  }
1569 
1570  return true;
1571 }
1572 
1573 ////////////////////////////////////////////////////////////////////////////////
1574 /// Check that two sub axis are the same.
1575 /// The limits are defined by first bin and last bin
1576 /// N.B. no check is done in this case for variable bins
1577 
1578 bool TH1::CheckConsistentSubAxes(const TAxis *a1, Int_t firstBin1, Int_t lastBin1, const TAxis * a2, Int_t firstBin2, Int_t lastBin2 )
1579 {
1580  // By default is assumed that no bins are given for the second axis
1581  Int_t nbins1 = lastBin1-firstBin1 + 1;
1582  Double_t xmin1 = a1->GetBinLowEdge(firstBin1);
1583  Double_t xmax1 = a1->GetBinUpEdge(lastBin1);
1584 
1585  Int_t nbins2 = a2->GetNbins();
1586  Double_t xmin2 = a2->GetXmin();
1587  Double_t xmax2 = a2->GetXmax();
1588 
1589  if (firstBin2 < lastBin2) {
1590  // in this case assume no bins are given for the second axis
1591  nbins2 = lastBin1-firstBin1 + 1;
1592  xmin2 = a1->GetBinLowEdge(firstBin1);
1593  xmax2 = a1->GetBinUpEdge(lastBin1);
1594  }
1595 
1596  if (nbins1 != nbins2 ) {
1597  ::Info("CheckConsistentSubAxes","Axes have different number of bins");
1598  return false;
1599  }
1600 
1601  if ( ! TMath::AreEqualRel(xmin1,xmin2,1.E-12) ||
1602  ! TMath::AreEqualRel(xmax1,xmax2,1.E-12) ) {
1603  ::Info("CheckConsistentSubAxes","Axes have different limits");
1604  return false;
1605  }
1606 
1607  return true;
1608 }
1609 
1610 ////////////////////////////////////////////////////////////////////////////////
1611 /// Check histogram compatibility.
1612 
1613 bool TH1::CheckConsistency(const TH1* h1, const TH1* h2)
1614 {
1615  if (h1 == h2) return true;
1616 
1617  if (h1->GetDimension() != h2->GetDimension() ) {
1618  throw DifferentDimension();
1619  return false;
1620  }
1621  Int_t dim = h1->GetDimension();
1622 
1623  // returns kTRUE if number of bins and bin limits are identical
1624  Int_t nbinsx = h1->GetNbinsX();
1625  Int_t nbinsy = h1->GetNbinsY();
1626  Int_t nbinsz = h1->GetNbinsZ();
1627 
1628  // Check whether the histograms have the same number of bins.
1629  if (nbinsx != h2->GetNbinsX() ||
1630  (dim > 1 && nbinsy != h2->GetNbinsY()) ||
1631  (dim > 2 && nbinsz != h2->GetNbinsZ()) ) {
1632  throw DifferentNumberOfBins();
1633  return false;
1634  }
1635 
1636  bool ret = true;
1637 
1638  // check axis limits
1639  ret &= CheckAxisLimits(h1->GetXaxis(), h2->GetXaxis());
1640  if (dim > 1) ret &= CheckAxisLimits(h1->GetYaxis(), h2->GetYaxis());
1641  if (dim > 2) ret &= CheckAxisLimits(h1->GetZaxis(), h2->GetZaxis());
1642 
1643  // check bin limits
1644  ret &= CheckBinLimits(h1->GetXaxis(), h2->GetXaxis());
1645  if (dim > 1) ret &= CheckBinLimits(h1->GetYaxis(), h2->GetYaxis());
1646  if (dim > 2) ret &= CheckBinLimits(h1->GetZaxis(), h2->GetZaxis());
1647 
1648  // check labels if histograms are both not empty
1649  if ( !h1->IsEmpty() && !h2->IsEmpty() ) {
1650  ret &= CheckBinLabels(h1->GetXaxis(), h2->GetXaxis());
1651  if (dim > 1) ret &= CheckBinLabels(h1->GetYaxis(), h2->GetYaxis());
1652  if (dim > 2) ret &= CheckBinLabels(h1->GetZaxis(), h2->GetZaxis());
1653  }
1654 
1655  return ret;
1656 }
1657 
1658 ////////////////////////////////////////////////////////////////////////////////
1659 /// \f$ \chi^{2} \f$ test for comparing weighted and unweighted histograms
1660 ///
1661 /// Function: Returns p-value. Other return values are specified by the 3rd parameter
1662 ///
1663 /// \param[in] h2 the second histogram
1664 /// \param[in] option
1665 /// - "UU" = experiment experiment comparison (unweighted-unweighted)
1666 /// - "UW" = experiment MC comparison (unweighted-weighted). Note that
1667 /// the first histogram should be unweighted
1668 /// - "WW" = MC MC comparison (weighted-weighted)
1669 /// - "NORM" = to be used when one or both of the histograms is scaled
1670 /// but the histogram originally was unweighted
1671 /// - by default underflows and overflows are not included:
1672 /// * "OF" = overflows included
1673 /// * "UF" = underflows included
1674 /// - "P" = print chi2, ndf, p_value, igood
1675 /// - "CHI2" = returns chi2 instead of p-value
1676 /// - "CHI2/NDF" = returns \f$ \chi^{2} \f$/ndf
1677 /// \param[in] res not empty - computes normalized residuals and returns them in this array
1678 ///
1679 /// The current implementation is based on the papers \f$ \chi^{2} \f$ test for comparison
1680 /// of weighted and unweighted histograms" in Proceedings of PHYSTAT05 and
1681 /// "Comparison weighted and unweighted histograms", arXiv:physics/0605123
1682 /// by N.Gagunashvili. This function has been implemented by Daniel Haertl in August 2006.
1683 ///
1684 /// #### Introduction:
1685 ///
1686 /// A frequently used technique in data analysis is the comparison of
1687 /// histograms. First suggested by Pearson [1] the \f$ \chi^{2} \f$ test of
1688 /// homogeneity is used widely for comparing usual (unweighted) histograms.
1689 /// This paper describes the implementation modified \f$ \chi^{2} \f$ tests
1690 /// for comparison of weighted and unweighted histograms and two weighted
1691 /// histograms [2] as well as usual Pearson's \f$ \chi^{2} \f$ test for
1692 /// comparison two usual (unweighted) histograms.
1693 ///
1694 /// #### Overview:
1695 ///
1696 /// Comparison of two histograms expect hypotheses that two histograms
1697 /// represent identical distributions. To make a decision p-value should
1698 /// be calculated. The hypotheses of identity is rejected if the p-value is
1699 /// lower then some significance level. Traditionally significance levels
1700 /// 0.1, 0.05 and 0.01 are used. The comparison procedure should include an
1701 /// analysis of the residuals which is often helpful in identifying the
1702 /// bins of histograms responsible for a significant overall \f$ \chi^{2} \f$ value.
1703 /// Residuals are the difference between bin contents and expected bin
1704 /// contents. Most convenient for analysis are the normalized residuals. If
1705 /// hypotheses of identity are valid then normalized residuals are
1706 /// approximately independent and identically distributed random variables
1707 /// having N(0,1) distribution. Analysis of residuals expect test of above
1708 /// mentioned properties of residuals. Notice that indirectly the analysis
1709 /// of residuals increase the power of \f$ \chi^{2} \f$ test.
1710 ///
1711 /// #### Methods of comparison:
1712 ///
1713 /// \f$ \chi^{2} \f$ test for comparison two (unweighted) histograms:
1714 /// Let us consider two histograms with the same binning and the number
1715 /// of bins equal to r. Let us denote the number of events in the ith bin
1716 /// in the first histogram as ni and as mi in the second one. The total
1717 /// number of events in the first histogram is equal to:
1718 /// \f[
1719 /// N = \sum_{i=1}^{r} n_{i}
1720 /// \f]
1721 /// and
1722 /// \f[
1723 /// M = \sum_{i=1}^{r} m_{i}
1724 /// \f]
1725 /// in the second histogram. The hypothesis of identity (homogeneity) [3]
1726 /// is that the two histograms represent random values with identical
1727 /// distributions. It is equivalent that there exist r constants p1,...,pr,
1728 /// such that
1729 /// \f[
1730 ///\sum_{i=1}^{r} p_{i}=1
1731 /// \f]
1732 /// and the probability of belonging to the ith bin for some measured value
1733 /// in both experiments is equal to pi. The number of events in the ith
1734 /// bin is a random variable with a distribution approximated by a Poisson
1735 /// probability distribution
1736 /// \f[
1737 ///\frac{e^{-Np_{i}}(Np_{i})^{n_{i}}}{n_{i}!}
1738 /// \f]
1739 ///for the first histogram and with distribution
1740 /// \f[
1741 ///\frac{e^{-Mp_{i}}(Mp_{i})^{m_{i}}}{m_{i}!}
1742 /// \f]
1743 /// for the second histogram. If the hypothesis of homogeneity is valid,
1744 /// then the maximum likelihood estimator of pi, i=1,...,r, is
1745 /// \f[
1746 ///\hat{p}_{i}= \frac{n_{i}+m_{i}}{N+M}
1747 /// \f]
1748 /// and then
1749 /// \f[
1750 /// X^{2} = \sum_{i=1}^{r}\frac{(n_{i}-N\hat{p}_{i})^{2}}{N\hat{p}_{i}} + \sum_{i=1}^{r}\frac{(m_{i}-M\hat{p}_{i})^{2}}{M\hat{p}_{i}} =\frac{1}{MN} \sum_{i=1}^{r}\frac{(Mn_{i}-Nm_{i})^{2}}{n_{i}+m_{i}}
1751 /// \f]
1752 /// has approximately a \f$ \chi^{2}_{(r-1)} \f$ distribution [3].
1753 /// The comparison procedure can include an analysis of the residuals which
1754 /// is often helpful in identifying the bins of histograms responsible for
1755 /// a significant overall \f$ \chi^{2} \f$ value. Most convenient for
1756 /// analysis are the adjusted (normalized) residuals [4]
1757 /// \f[
1758 /// r_{i} = \frac{n_{i}-N\hat{p}_{i}}{\sqrt{N\hat{p}_{i}}\sqrt{(1-N/(N+M))(1-(n_{i}+m_{i})/(N+M))}}
1759 /// \f]
1760 /// If hypotheses of homogeneity are valid then residuals ri are
1761 /// approximately independent and identically distributed random variables
1762 /// having N(0,1) distribution. The application of the \f$ \chi^{2} \f$ test has
1763 /// restrictions related to the value of the expected frequencies Npi,
1764 /// Mpi, i=1,...,r. A conservative rule formulated in [5] is that all the
1765 /// expectations must be 1 or greater for both histograms. In practical
1766 /// cases when expected frequencies are not known the estimated expected
1767 /// frequencies \f$ M\hat{p}_{i}, N\hat{p}_{i}, i=1,...,r \f$ can be used.
1768 ///
1769 /// #### Unweighted and weighted histograms comparison:
1770 ///
1771 /// A simple modification of the ideas described above can be used for the
1772 /// comparison of the usual (unweighted) and weighted histograms. Let us
1773 /// denote the number of events in the ith bin in the unweighted
1774 /// histogram as ni and the common weight of events in the ith bin of the
1775 /// weighted histogram as wi. The total number of events in the
1776 /// unweighted histogram is equal to
1777 ///\f[
1778 /// N = \sum_{i=1}^{r} n_{i}
1779 ///\f]
1780 /// and the total weight of events in the weighted histogram is equal to
1781 ///\f[
1782 /// W = \sum_{i=1}^{r} w_{i}
1783 ///\f]
1784 /// Let us formulate the hypothesis of identity of an unweighted histogram
1785 /// to a weighted histogram so that there exist r constants p1,...,pr, such
1786 /// that
1787 ///\f[
1788 /// \sum_{i=1}^{r} p_{i} = 1
1789 ///\f]
1790 /// for the unweighted histogram. The weight wi is a random variable with a
1791 /// distribution approximated by the normal probability distribution
1792 /// \f$ N(Wp_{i},\sigma_{i}^{2}) \f$ where \f$ \sigma_{i}^{2} \f$ is the variance of the weight wi.
1793 /// If we replace the variance \f$ \sigma_{i}^{2} \f$
1794 /// with estimate \f$ s_{i}^{2} \f$ (sum of squares of weights of
1795 /// events in the ith bin) and the hypothesis of identity is valid, then the
1796 /// maximum likelihood estimator of pi,i=1,...,r, is
1797 ///\f[
1798 /// \hat{p}_{i} = \frac{Ww_{i}-Ns_{i}^{2}+\sqrt{(Ww_{i}-Ns_{i}^{2})^{2}+4W^{2}s_{i}^{2}n_{i}}}{2W^{2}}
1799 ///\f]
1800 /// We may then use the test statistic
1801 ///\f[
1802 /// X^{2} = \sum_{i=1}^{r} \frac{(n_{i}-N\hat{p}_{i})^{2}}{N\hat{p}_{i}} + \sum_{i=1}^{r} \frac{(w_{i}-W\hat{p}_{i})^{2}}{s_{i}^{2}}
1803 ///\f]
1804 /// and it has approximately a \f$ \sigma^{2}_{(r-1)} \f$ distribution [2]. This test, as well
1805 /// as the original one [3], has a restriction on the expected frequencies. The
1806 /// expected frequencies recommended for the weighted histogram is more than 25.
1807 /// The value of the minimal expected frequency can be decreased down to 10 for
1808 /// the case when the weights of the events are close to constant. In the case
1809 /// of a weighted histogram if the number of events is unknown, then we can
1810 /// apply this recommendation for the equivalent number of events as
1811 ///\f[
1812 /// n_{i}^{equiv} = \frac{ w_{i}^{2} }{ s_{i}^{2} }
1813 ///\f]
1814 /// The minimal expected frequency for an unweighted histogram must be 1. Notice
1815 /// that any usual (unweighted) histogram can be considered as a weighted
1816 /// histogram with events that have constant weights equal to 1.
1817 /// The variance \f$ z_{i}^{2} \f$ of the difference between the weight wi
1818 /// and the estimated expectation value of the weight is approximately equal to:
1819 ///\f[
1820 /// z_{i}^{2} = Var(w_{i}-W\hat{p}_{i}) = N\hat{p}_{i}(1-N\hat{p}_{i})\left(\frac{Ws_{i}^{2}}{\sqrt{(Ns_{i}^{2}-w_{i}W)^{2}+4W^{2}s_{i}^{2}n_{i}}}\right)^{2}+\frac{s_{i}^{2}}{4}\left(1+\frac{Ns_{i}^{2}-w_{i}W}{\sqrt{(Ns_{i}^{2}-w_{i}W)^{2}+4W^{2}s_{i}^{2}n_{i}}}\right)^{2}
1821 ///\f]
1822 /// The residuals
1823 ///\f[
1824 /// r_{i} = \frac{w_{i}-W\hat{p}_{i}}{z_{i}}
1825 ///\f]
1826 /// have approximately a normal distribution with mean equal to 0 and standard
1827 /// deviation equal to 1.
1828 ///
1829 /// #### Two weighted histograms comparison:
1830 ///
1831 /// Let us denote the common weight of events of the ith bin in the first
1832 /// histogram as w1i and as w2i in the second one. The total weight of events
1833 /// in the first histogram is equal to
1834 ///\f[
1835 /// W_{1} = \sum_{i=1}^{r} w_{1i}
1836 ///\f]
1837 /// and
1838 ///\f[
1839 /// W_{2} = \sum_{i=1}^{r} w_{2i}
1840 ///\f]
1841 /// in the second histogram. Let us formulate the hypothesis of identity of
1842 /// weighted histograms so that there exist r constants p1,...,pr, such that
1843 ///\f[
1844 /// \sum_{i=1}^{r} p_{i} = 1
1845 ///\f]
1846 /// and also expectation value of weight w1i equal to W1pi and expectation value
1847 /// of weight w2i equal to W2pi. Weights in both the histograms are random
1848 /// variables with distributions which can be approximated by a normal
1849 /// probability distribution \f$ N(W_{1}p_{i},\sigma_{1i}^{2}) \f$ for the first histogram
1850 /// and by a distribution \f$ N(W_{2}p_{i},\sigma_{2i}^{2}) \f$ for the second.
1851 /// Here \f$ \sigma_{1i}^{2} \f$ and \f$ \sigma_{2i}^{2} \f$ are the variances
1852 /// of w1i and w2i with estimators \f$ s_{1i}^{2} \f$ and \f$ s_{2i}^{2} \f$ respectively.
1853 /// If the hypothesis of identity is valid, then the maximum likelihood and
1854 /// Least Square Method estimator of pi,i=1,...,r, is
1855 ///\f[
1856 /// \hat{p}_{i} = \frac{w_{1i}W_{1}/s_{1i}^{2}+w_{2i}W_{2} /s_{2i}^{2}}{W_{1}^{2}/s_{1i}^{2}+W_{2}^{2}/s_{2i}^{2}}
1857 ///\f]
1858 /// We may then use the test statistic
1859 ///\f[
1860 /// X^{2} = \sum_{i=1}^{r} \frac{(w_{1i}-W_{1}\hat{p}_{i})^{2}}{s_{1i}^{2}} + \sum_{i=1}^{r} \frac{(w_{2i}-W_{2}\hat{p}_{i})^{2}}{s_{2i}^{2}} = \sum_{i=1}^{r} \frac{(W_{1}w_{2i}-W_{2}w_{1i})^{2}}{W_{1}^{2}s_{2i}^{2}+W_{2}^{2}s_{1i}^{2}}
1861 ///\f]
1862 /// and it has approximately a \f$ \chi^{2}_{(r-1)} \f$ distribution [2].
1863 /// The normalized or studentised residuals [6]
1864 ///\f[
1865 /// r_{i} = \frac{w_{1i}-W_{1}\hat{p}_{i}}{s_{1i}\sqrt{1 - \frac{1}{(1+W_{2}^{2}s_{1i}^{2}/W_{1}^{2}s_{2i}^{2})}}}
1866 ///\f]
1867 /// have approximately a normal distribution with mean equal to 0 and standard
1868 /// deviation 1. A recommended minimal expected frequency is equal to 10 for
1869 /// the proposed test.
1870 ///
1871 /// #### Numerical examples:
1872 ///
1873 /// The method described herein is now illustrated with an example.
1874 /// We take a distribution
1875 ///\f[
1876 /// \phi(x) = \frac{2}{(x-10)^{2}+1} + \frac{1}{(x-14)^{2}+1} (1)
1877 ///\f]
1878 /// defined on the interval [4,16]. Events distributed according to the formula
1879 /// (1) are simulated to create the unweighted histogram. Uniformly distributed
1880 /// events are simulated for the weighted histogram with weights calculated by
1881 /// formula (1). Each histogram has the same number of bins: 20. Fig.1 shows
1882 /// the result of comparison of the unweighted histogram with 200 events
1883 /// (minimal expected frequency equal to one) and the weighted histogram with
1884 /// 500 events (minimal expected frequency equal to 25)
1885 /// Begin_Macro
1886 /// ../../../tutorials/math/chi2test.C
1887 /// End_Macro
1888 /// Fig 1. An example of comparison of the unweighted histogram with 200 events
1889 /// and the weighted histogram with 500 events:
1890 /// 1. unweighted histogram;
1891 /// 2. weighted histogram;
1892 /// 3. normalized residuals plot;
1893 /// 4. normal Q-Q plot of residuals.
1894 ///
1895 /// The value of the test statistic \f$ \chi^{2} \f$ is equal to
1896 /// 21.09 with p-value equal to 0.33, therefore the hypothesis of identity of
1897 /// the two histograms can be accepted for 0.05 significant level. The behavior
1898 /// of the normalized residuals plot (see Fig. 1c) and the normal Q-Q plot
1899 /// (see Fig. 1d) of residuals are regular and we cannot identify the outliers
1900 /// or bins with a big influence on \f$ \chi^{2} \f$.
1901 ///
1902 /// The second example presents the same two histograms but 17 events was added
1903 /// to content of bin number 15 in unweighted histogram. Fig.2 shows the result
1904 /// of comparison of the unweighted histogram with 217 events (minimal expected
1905 /// frequency equal to one) and the weighted histogram with 500 events (minimal
1906 /// expected frequency equal to 25)
1907 /// Begin_Macro
1908 /// ../../../tutorials/math/chi2test.C(17)
1909 /// End_Macro
1910 /// Fig 2. An example of comparison of the unweighted histogram with 217 events
1911 /// and the weighted histogram with 500 events:
1912 /// 1. unweighted histogram;
1913 /// 2. weighted histogram;
1914 /// 3. normalized residuals plot;
1915 /// 4. normal Q-Q plot of residuals.
1916 ///
1917 /// The value of the test statistic \f$ \chi^{2} \f$ is equal to
1918 /// 32.33 with p-value equal to 0.029, therefore the hypothesis of identity of
1919 /// the two histograms is rejected for 0.05 significant level. The behavior of
1920 /// the normalized residuals plot (see Fig. 2c) and the normal Q-Q plot (see
1921 /// Fig. 2d) of residuals are not regular and we can identify the outlier or
1922 /// bin with a big influence on \f$ \chi^{2} \f$.
1923 ///
1924 /// #### References:
1925 ///
1926 /// - [1] Pearson, K., 1904. On the Theory of Contingency and Its Relation to
1927 /// Association and Normal Correlation. Drapers' Co. Memoirs, Biometric
1928 /// Series No. 1, London.
1929 /// - [2] Gagunashvili, N., 2006. \f$ \sigma^{2} \f$ test for comparison
1930 /// of weighted and unweighted histograms. Statistical Problems in Particle
1931 /// Physics, Astrophysics and Cosmology, Proceedings of PHYSTAT05,
1932 /// Oxford, UK, 12-15 September 2005, Imperial College Press, London, 43-44.
1933 /// Gagunashvili,N., Comparison of weighted and unweighted histograms,
1934 /// arXiv:physics/0605123, 2006.
1935 /// - [3] Cramer, H., 1946. Mathematical methods of statistics.
1936 /// Princeton University Press, Princeton.
1937 /// - [4] Haberman, S.J., 1973. The analysis of residuals in cross-classified tables.
1938 /// Biometrics 29, 205-220.
1939 /// - [5] Lewontin, R.C. and Felsenstein, J., 1965. The robustness of homogeneity
1940 /// test in 2xN tables. Biometrics 21, 19-33.
1941 /// - [6] Seber, G.A.F., Lee, A.J., 2003, Linear Regression Analysis.
1942 /// John Wiley & Sons Inc., New York.
1943 
1944 Double_t TH1::Chi2Test(const TH1* h2, Option_t *option, Double_t *res) const
1945 {
1946  Double_t chi2 = 0;
1947  Int_t ndf = 0, igood = 0;
1948 
1949  TString opt = option;
1950  opt.ToUpper();
1951 
1952  Double_t prob = Chi2TestX(h2,chi2,ndf,igood,option,res);
1953 
1954  if(opt.Contains("P")) {
1955  printf("Chi2 = %f, Prob = %g, NDF = %d, igood = %d\n", chi2,prob,ndf,igood);
1956  }
1957  if(opt.Contains("CHI2/NDF")) {
1958  if (ndf == 0) return 0;
1959  return chi2/ndf;
1960  }
1961  if(opt.Contains("CHI2")) {
1962  return chi2;
1963  }
1964 
1965  return prob;
1966 }
1967 
1968 ////////////////////////////////////////////////////////////////////////////////
1969 /// The computation routine of the Chisquare test. For the method description,
1970 /// see Chi2Test() function.
1971 ///
1972 /// \return p-value
1973 /// \param[in] h2 the second histogram
1974 /// \param[in] option
1975 /// - "UU" = experiment experiment comparison (unweighted-unweighted)
1976 /// - "UW" = experiment MC comparison (unweighted-weighted). Note that the first
1977 /// histogram should be unweighted
1978 /// - "WW" = MC MC comparison (weighted-weighted)
1979 /// - "NORM" = if one or both histograms is scaled
1980 /// - "OF" = overflows included
1981 /// - "UF" = underflows included
1982 /// by default underflows and overflows are not included
1983 /// \param[out] igood test output
1984 /// - igood=0 - no problems
1985 /// - For unweighted unweighted comparison
1986 /// - igood=1'There is a bin in the 1st histogram with less than 1 event'
1987 /// - igood=2'There is a bin in the 2nd histogram with less than 1 event'
1988 /// - igood=3'when the conditions for igood=1 and igood=2 are satisfied'
1989 /// - For unweighted weighted comparison
1990 /// - igood=1'There is a bin in the 1st histogram with less then 1 event'
1991 /// - igood=2'There is a bin in the 2nd histogram with less then 10 effective number of events'
1992 /// - igood=3'when the conditions for igood=1 and igood=2 are satisfied'
1993 /// - For weighted weighted comparison
1994 /// - igood=1'There is a bin in the 1st histogram with less then 10 effective
1995 /// number of events'
1996 /// - igood=2'There is a bin in the 2nd histogram with less then 10 effective
1997 /// number of events'
1998 /// - igood=3'when the conditions for igood=1 and igood=2 are satisfied'
1999 /// \param[out] chi2 chisquare of the test
2000 /// \param[out] ndf number of degrees of freedom (important, when both histograms have the same empty bins)
2001 /// \param[out] res normalized residuals for further analysis
2002 
2003 Double_t TH1::Chi2TestX(const TH1* h2, Double_t &chi2, Int_t &ndf, Int_t &igood, Option_t *option, Double_t *res) const
2004 {
2005 
2006  Int_t i_start, i_end;
2007  Int_t j_start, j_end;
2008  Int_t k_start, k_end;
2009 
2010  Double_t sum1 = 0.0, sumw1 = 0.0;
2011  Double_t sum2 = 0.0, sumw2 = 0.0;
2012 
2013  chi2 = 0.0;
2014  ndf = 0;
2015 
2016  TString opt = option;
2017  opt.ToUpper();
2018 
2019  if (fBuffer) const_cast<TH1*>(this)->BufferEmpty();
2020 
2021  const TAxis *xaxis1 = GetXaxis();
2022  const TAxis *xaxis2 = h2->GetXaxis();
2023  const TAxis *yaxis1 = GetYaxis();
2024  const TAxis *yaxis2 = h2->GetYaxis();
2025  const TAxis *zaxis1 = GetZaxis();
2026  const TAxis *zaxis2 = h2->GetZaxis();
2027 
2028  Int_t nbinx1 = xaxis1->GetNbins();
2029  Int_t nbinx2 = xaxis2->GetNbins();
2030  Int_t nbiny1 = yaxis1->GetNbins();
2031  Int_t nbiny2 = yaxis2->GetNbins();
2032  Int_t nbinz1 = zaxis1->GetNbins();
2033  Int_t nbinz2 = zaxis2->GetNbins();
2034 
2035  //check dimensions
2036  if (this->GetDimension() != h2->GetDimension() ){
2037  Error("Chi2TestX","Histograms have different dimensions.");
2038  return 0.0;
2039  }
2040 
2041  //check number of channels
2042  if (nbinx1 != nbinx2) {
2043  Error("Chi2TestX","different number of x channels");
2044  }
2045  if (nbiny1 != nbiny2) {
2046  Error("Chi2TestX","different number of y channels");
2047  }
2048  if (nbinz1 != nbinz2) {
2049  Error("Chi2TestX","different number of z channels");
2050  }
2051 
2052  //check for ranges
2053  i_start = j_start = k_start = 1;
2054  i_end = nbinx1;
2055  j_end = nbiny1;
2056  k_end = nbinz1;
2057 
2058  if (xaxis1->TestBit(TAxis::kAxisRange)) {
2059  i_start = xaxis1->GetFirst();
2060  i_end = xaxis1->GetLast();
2061  }
2062  if (yaxis1->TestBit(TAxis::kAxisRange)) {
2063  j_start = yaxis1->GetFirst();
2064  j_end = yaxis1->GetLast();
2065  }
2066  if (zaxis1->TestBit(TAxis::kAxisRange)) {
2067  k_start = zaxis1->GetFirst();
2068  k_end = zaxis1->GetLast();
2069  }
2070 
2071 
2072  if (opt.Contains("OF")) {
2073  if (GetDimension() == 3) k_end = ++nbinz1;
2074  if (GetDimension() >= 2) j_end = ++nbiny1;
2075  if (GetDimension() >= 1) i_end = ++nbinx1;
2076  }
2077 
2078  if (opt.Contains("UF")) {
2079  if (GetDimension() == 3) k_start = 0;
2080  if (GetDimension() >= 2) j_start = 0;
2081  if (GetDimension() >= 1) i_start = 0;
2082  }
2083 
2084  ndf = (i_end - i_start + 1) * (j_end - j_start + 1) * (k_end - k_start + 1) - 1;
2085 
2086  Bool_t comparisonUU = opt.Contains("UU");
2087  Bool_t comparisonUW = opt.Contains("UW");
2088  Bool_t comparisonWW = opt.Contains("WW");
2089  Bool_t scaledHistogram = opt.Contains("NORM");
2090 
2091  if (scaledHistogram && !comparisonUU) {
2092  Info("Chi2TestX", "NORM option should be used together with UU option. It is ignored");
2093  }
2094 
2095  // look at histo global bin content and effective entries
2096  Stat_t s[kNstat];
2097  GetStats(s);// s[1] sum of squares of weights, s[0] sum of weights
2098  Double_t sumBinContent1 = s[0];
2099  Double_t effEntries1 = (s[1] ? s[0] * s[0] / s[1] : 0.0);
2100 
2101  h2->GetStats(s);// s[1] sum of squares of weights, s[0] sum of weights
2102  Double_t sumBinContent2 = s[0];
2103  Double_t effEntries2 = (s[1] ? s[0] * s[0] / s[1] : 0.0);
2104 
2105  if (!comparisonUU && !comparisonUW && !comparisonWW ) {
2106  // deduce automatically from type of histogram
2107  if (TMath::Abs(sumBinContent1 - effEntries1) < 1) {
2108  if ( TMath::Abs(sumBinContent2 - effEntries2) < 1) comparisonUU = true;
2109  else comparisonUW = true;
2110  }
2111  else comparisonWW = true;
2112  }
2113  // check unweighted histogram
2114  if (comparisonUW) {
2115  if (TMath::Abs(sumBinContent1 - effEntries1) >= 1) {
2116  Warning("Chi2TestX","First histogram is not unweighted and option UW has been requested");
2117  }
2118  }
2119  if ( (!scaledHistogram && comparisonUU) ) {
2120  if ( ( TMath::Abs(sumBinContent1 - effEntries1) >= 1) || (TMath::Abs(sumBinContent2 - effEntries2) >= 1) ) {
2121  Warning("Chi2TestX","Both histograms are not unweighted and option UU has been requested");
2122  }
2123  }
2124 
2125 
2126  //get number of events in histogram
2127  if (comparisonUU && scaledHistogram) {
2128  for (Int_t i = i_start; i <= i_end; ++i) {
2129  for (Int_t j = j_start; j <= j_end; ++j) {
2130  for (Int_t k = k_start; k <= k_end; ++k) {
2131 
2132  Int_t bin = GetBin(i, j, k);
2133 
2134  Double_t cnt1 = RetrieveBinContent(bin);
2135  Double_t cnt2 = h2->RetrieveBinContent(bin);
2136  Double_t e1sq = GetBinErrorSqUnchecked(bin);
2137  Double_t e2sq = h2->GetBinErrorSqUnchecked(bin);
2138 
2139  if (e1sq > 0.0) cnt1 = TMath::Floor(cnt1 * cnt1 / e1sq + 0.5); // avoid rounding errors
2140  else cnt1 = 0.0;
2141 
2142  if (e2sq > 0.0) cnt2 = TMath::Floor(cnt2 * cnt2 / e2sq + 0.5); // avoid rounding errors
2143  else cnt2 = 0.0;
2144 
2145  // sum contents
2146  sum1 += cnt1;
2147  sum2 += cnt2;
2148  sumw1 += e1sq;
2149  sumw2 += e2sq;
2150  }
2151  }
2152  }
2153  if (sumw1 <= 0.0 || sumw2 <= 0.0) {
2154  Error("Chi2TestX", "Cannot use option NORM when one histogram has all zero errors");
2155  return 0.0;
2156  }
2157 
2158  } else {
2159  for (Int_t i = i_start; i <= i_end; ++i) {
2160  for (Int_t j = j_start; j <= j_end; ++j) {
2161  for (Int_t k = k_start; k <= k_end; ++k) {
2162 
2163  Int_t bin = GetBin(i, j, k);
2164 
2165  sum1 += RetrieveBinContent(bin);
2166  sum2 += h2->RetrieveBinContent(bin);
2167 
2168  if ( comparisonWW ) sumw1 += GetBinErrorSqUnchecked(bin);
2169  if ( comparisonUW || comparisonWW ) sumw2 += h2->GetBinErrorSqUnchecked(bin);
2170  }
2171  }
2172  }
2173  }
2174  //checks that the histograms are not empty
2175  if (sum1 == 0.0 || sum2 == 0.0) {
2176  Error("Chi2TestX","one histogram is empty");
2177  return 0.0;
2178  }
2179 
2180  if ( comparisonWW && ( sumw1 <= 0.0 && sumw2 <= 0.0 ) ){
2181  Error("Chi2TestX","Hist1 and Hist2 have both all zero errors\n");
2182  return 0.0;
2183  }
2184 
2185  //THE TEST
2186  Int_t m = 0, n = 0;
2187 
2188  //Experiment - experiment comparison
2189  if (comparisonUU) {
2190  Double_t sum = sum1 + sum2;
2191  for (Int_t i = i_start; i <= i_end; ++i) {
2192  for (Int_t j = j_start; j <= j_end; ++j) {
2193  for (Int_t k = k_start; k <= k_end; ++k) {
2194 
2195  Int_t bin = GetBin(i, j, k);
2196 
2197  Double_t cnt1 = RetrieveBinContent(bin);
2198  Double_t cnt2 = h2->RetrieveBinContent(bin);
2199 
2200  if (scaledHistogram) {
2201  // scale bin value to effective bin entries
2202  Double_t e1sq = GetBinErrorSqUnchecked(bin);
2203  Double_t e2sq = h2->GetBinErrorSqUnchecked(bin);
2204 
2205  if (e1sq > 0) cnt1 = TMath::Floor(cnt1 * cnt1 / e1sq + 0.5); // avoid rounding errors
2206  else cnt1 = 0;
2207 
2208  if (e2sq > 0) cnt2 = TMath::Floor(cnt2 * cnt2 / e2sq + 0.5); // avoid rounding errors
2209  else cnt2 = 0;
2210  }
2211 
2212  if (Int_t(cnt1) == 0 && Int_t(cnt2) == 0) --ndf; // no data means one degree of freedom less
2213  else {
2214 
2215  Double_t cntsum = cnt1 + cnt2;
2216  Double_t nexp1 = cntsum * sum1 / sum;
2217  //Double_t nexp2 = binsum*sum2/sum;
2218 
2219  if (res) res[i - i_start] = (cnt1 - nexp1) / TMath::Sqrt(nexp1);
2220 
2221  if (cnt1 < 1) ++m;
2222  if (cnt2 < 1) ++n;
2223 
2224  //Habermann correction for residuals
2225  Double_t correc = (1. - sum1 / sum) * (1. - cntsum / sum);
2226  if (res) res[i - i_start] /= TMath::Sqrt(correc);
2227 
2228  Double_t delta = sum2 * cnt1 - sum1 * cnt2;
2229  chi2 += delta * delta / cntsum;
2230  }
2231  }
2232  }
2233  }
2234  chi2 /= sum1 * sum2;
2235 
2236  // flag error only when of the two histogram is zero
2237  if (m) {
2238  igood += 1;
2239  Info("Chi2TestX","There is a bin in h1 with less than 1 event.\n");
2240  }
2241  if (n) {
2242  igood += 2;
2243  Info("Chi2TestX","There is a bin in h2 with less than 1 event.\n");
2244  }
2245 
2246  Double_t prob = TMath::Prob(chi2,ndf);
2247  return prob;
2248 
2249  }
2250 
2251  // unweighted - weighted comparison
2252  // case of error = 0 and content not zero is treated without problems by excluding second chi2 sum
2253  // and can be considered as a data-theory comparison
2254  if ( comparisonUW ) {
2255  for (Int_t i = i_start; i <= i_end; ++i) {
2256  for (Int_t j = j_start; j <= j_end; ++j) {
2257  for (Int_t k = k_start; k <= k_end; ++k) {
2258 
2259  Int_t bin = GetBin(i, j, k);
2260 
2261  Double_t cnt1 = RetrieveBinContent(bin);
2262  Double_t cnt2 = h2->RetrieveBinContent(bin);
2263  Double_t e2sq = h2->GetBinErrorSqUnchecked(bin);
2264 
2265  // case both histogram have zero bin contents
2266  if (cnt1 * cnt1 == 0 && cnt2 * cnt2 == 0) {
2267  --ndf; //no data means one degree of freedom less
2268  continue;
2269  }
2270 
2271  // case weighted histogram has zero bin content and error
2272  if (cnt2 * cnt2 == 0 && e2sq == 0) {
2273  if (sumw2 > 0) {
2274  // use as approximated error as 1 scaled by a scaling ratio
2275  // estimated from the total sum weight and sum weight squared
2276  e2sq = sumw2 / sum2;
2277  }
2278  else {
2279  // return error because infinite discrepancy here:
2280  // bin1 != 0 and bin2 =0 in a histogram with all errors zero
2281  Error("Chi2TestX","Hist2 has in bin (%d,%d,%d) zero content and zero errors\n", i, j, k);
2282  chi2 = 0; return 0;
2283  }
2284  }
2285 
2286  if (cnt1 < 1) m++;
2287  if (e2sq > 0 && cnt2 * cnt2 / e2sq < 10) n++;
2288 
2289  Double_t var1 = sum2 * cnt2 - sum1 * e2sq;
2290  Double_t var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2291 
2292  // if cnt1 is zero and cnt2 = 1 and sum1 = sum2 var1 = 0 && var2 == 0
2293  // approximate by incrementing cnt1
2294  // LM (this need to be fixed for numerical errors)
2295  while (var1 * var1 + cnt1 == 0 || var1 + var2 == 0) {
2296  sum1++;
2297  cnt1++;
2298  var1 = sum2 * cnt2 - sum1 * e2sq;
2299  var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2300  }
2301  var2 = TMath::Sqrt(var2);
2302 
2303  while (var1 + var2 == 0) {
2304  sum1++;
2305  cnt1++;
2306  var1 = sum2 * cnt2 - sum1 * e2sq;
2307  var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2308  while (var1 * var1 + cnt1 == 0 || var1 + var2 == 0) {
2309  sum1++;
2310  cnt1++;
2311  var1 = sum2 * cnt2 - sum1 * e2sq;
2312  var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2313  }
2314  var2 = TMath::Sqrt(var2);
2315  }
2316 
2317  Double_t probb = (var1 + var2) / (2. * sum2 * sum2);
2318 
2319  Double_t nexp1 = probb * sum1;
2320  Double_t nexp2 = probb * sum2;
2321 
2322  Double_t delta1 = cnt1 - nexp1;
2323  Double_t delta2 = cnt2 - nexp2;
2324 
2325  chi2 += delta1 * delta1 / nexp1;
2326 
2327  if (e2sq > 0) {
2328  chi2 += delta2 * delta2 / e2sq;
2329  }
2330 
2331  if (res) {
2332  if (e2sq > 0) {
2333  Double_t temp1 = sum2 * e2sq / var2;
2334  Double_t temp2 = 1.0 + (sum1 * e2sq - sum2 * cnt2) / var2;
2335  temp2 = temp1 * temp1 * sum1 * probb * (1.0 - probb) + temp2 * temp2 * e2sq / 4.0;
2336  // invert sign here
2337  res[i - i_start] = - delta2 / TMath::Sqrt(temp2);
2338  }
2339  else
2340  res[i - i_start] = delta1 / TMath::Sqrt(nexp1);
2341  }
2342  }
2343  }
2344  }
2345 
2346  if (m) {
2347  igood += 1;
2348  Info("Chi2TestX","There is a bin in h1 with less than 1 event.\n");
2349  }
2350  if (n) {
2351  igood += 2;
2352  Info("Chi2TestX","There is a bin in h2 with less than 10 effective events.\n");
2353  }
2354 
2355  Double_t prob = TMath::Prob(chi2, ndf);
2356 
2357  return prob;
2358  }
2359 
2360  // weighted - weighted comparison
2361  if (comparisonWW) {
2362  for (Int_t i = i_start; i <= i_end; ++i) {
2363  for (Int_t j = j_start; j <= j_end; ++j) {
2364  for (Int_t k = k_start; k <= k_end; ++k) {
2365 
2366  Int_t bin = GetBin(i, j, k);
2367  Double_t cnt1 = RetrieveBinContent(bin);
2368  Double_t cnt2 = h2->RetrieveBinContent(bin);
2369  Double_t e1sq = GetBinErrorSqUnchecked(bin);
2370  Double_t e2sq = h2->GetBinErrorSqUnchecked(bin);
2371 
2372  // case both histogram have zero bin contents
2373  // (use square of content to avoid numerical errors)
2374  if (cnt1 * cnt1 == 0 && cnt2 * cnt2 == 0) {
2375  --ndf; //no data means one degree of freedom less
2376  continue;
2377  }
2378 
2379  if (e1sq == 0 && e2sq == 0) {
2380  // cannot treat case of booth histogram have zero zero errors
2381  Error("Chi2TestX","h1 and h2 both have bin %d,%d,%d with all zero errors\n", i,j,k);
2382  chi2 = 0; return 0;
2383  }
2384 
2385  Double_t sigma = sum1 * sum1 * e2sq + sum2 * sum2 * e1sq;
2386  Double_t delta = sum2 * cnt1 - sum1 * cnt2;
2387  chi2 += delta * delta / sigma;
2388 
2389  if (res) {
2390  Double_t temp = cnt1 * sum1 * e2sq + cnt2 * sum2 * e1sq;
2391  Double_t probb = temp / sigma;
2392  Double_t z = 0;
2393  if (e1sq > e2sq) {
2394  Double_t d1 = cnt1 - sum1 * probb;
2395  Double_t s1 = e1sq * ( 1. - e2sq * sum1 * sum1 / sigma );
2396  z = d1 / TMath::Sqrt(s1);
2397  }
2398  else {
2399  Double_t d2 = cnt2 - sum2 * probb;
2400  Double_t s2 = e2sq * ( 1. - e1sq * sum2 * sum2 / sigma );
2401  z = -d2 / TMath::Sqrt(s2);
2402  }
2403  res[i - i_start] = z;
2404  }
2405 
2406  if (e1sq > 0 && cnt1 * cnt1 / e1sq < 10) m++;
2407  if (e2sq > 0 && cnt2 * cnt2 / e2sq < 10) n++;
2408  }
2409  }
2410  }
2411  if (m) {
2412  igood += 1;
2413  Info("Chi2TestX","There is a bin in h1 with less than 10 effective events.\n");
2414  }
2415  if (n) {
2416  igood += 2;
2417  Info("Chi2TestX","There is a bin in h2 with less than 10 effective events.\n");
2418  }
2419  Double_t prob = TMath::Prob(chi2, ndf);
2420  return prob;
2421  }
2422  return 0;
2423 }
2424 ////////////////////////////////////////////////////////////////////////////////
2425 /// Compute and return the chisquare of this histogram with respect to a function
2426 /// The chisquare is computed by weighting each histogram point by the bin error
2427 /// By default the full range of the histogram is used.
2428 /// Use option "R" for restricting the chisquare calculation to the given range of the function
2429 /// Use option "L" for using the chisquare based on the poisson likelihood (Baker-Cousins Chisquare)
2430 
2431 Double_t TH1::Chisquare(TF1 * func, Option_t *option) const
2432 {
2433  if (!func) {
2434  Error("Chisquare","Function pointer is Null - return -1");
2435  return -1;
2436  }
2437 
2438  TString opt(option); opt.ToUpper();
2439  bool useRange = opt.Contains("R");
2440  bool usePL = opt.Contains("L");
2441 
2442  return ROOT::Fit::Chisquare(*this, *func, useRange, usePL);
2443 }
2444 
2445 ////////////////////////////////////////////////////////////////////////////////
2446 /// Remove all the content from the underflow and overflow bins, without changing the number of entries
2447 /// After calling this method, every undeflow and overflow bins will have content 0.0
2448 /// The Sumw2 is also cleared, since there is no more content in the bins
2449 
2451 {
2452  for (Int_t bin = 0; bin < fNcells; ++bin)
2453  if (IsBinUnderflow(bin) || IsBinOverflow(bin)) {
2454  UpdateBinContent(bin, 0.0);
2455  if (fSumw2.fN) fSumw2.fArray[bin] = 0.0;
2456  }
2457 }
2458 
2459 ////////////////////////////////////////////////////////////////////////////////
2460 /// Compute integral (cumulative sum of bins)
2461 /// The result stored in fIntegral is used by the GetRandom functions.
2462 /// This function is automatically called by GetRandom when the fIntegral
2463 /// array does not exist or when the number of entries in the histogram
2464 /// has changed since the previous call to GetRandom.
2465 /// The resulting integral is normalized to 1
2466 /// If the routine is called with the onlyPositive flag set an error will
2467 /// be produced in case of negative bin content and a NaN value returned
2468 
2469 Double_t TH1::ComputeIntegral(Bool_t onlyPositive)
2470 {
2471  if (fBuffer) BufferEmpty();
2472 
2473  // delete previously computed integral (if any)
2474  if (fIntegral) delete [] fIntegral;
2475 
2476  // - Allocate space to store the integral and compute integral
2477  Int_t nbinsx = GetNbinsX();
2478  Int_t nbinsy = GetNbinsY();
2479  Int_t nbinsz = GetNbinsZ();
2480  Int_t nbins = nbinsx * nbinsy * nbinsz;
2481 
2482  fIntegral = new Double_t[nbins + 2];
2483  Int_t ibin = 0; fIntegral[ibin] = 0;
2484 
2485  for (Int_t binz=1; binz <= nbinsz; ++binz) {
2486  for (Int_t biny=1; biny <= nbinsy; ++biny) {
2487  for (Int_t binx=1; binx <= nbinsx; ++binx) {
2488  ++ibin;
2489  Double_t y = RetrieveBinContent(GetBin(binx, biny, binz));
2490  if (onlyPositive && y < 0) {
2491  Error("ComputeIntegral","Bin content is negative - return a NaN value");
2492  fIntegral[nbins] = TMath::QuietNaN();
2493  break;
2494  }
2495  fIntegral[ibin] = fIntegral[ibin - 1] + y;
2496  }
2497  }
2498  }
2499 
2500  // - Normalize integral to 1
2501  if (fIntegral[nbins] == 0 ) {
2502  Error("ComputeIntegral", "Integral = zero"); return 0;
2503  }
2504  for (Int_t bin=1; bin <= nbins; ++bin) fIntegral[bin] /= fIntegral[nbins];
2505  fIntegral[nbins+1] = fEntries;
2506  return fIntegral[nbins];
2507 }
2508 
2509 ////////////////////////////////////////////////////////////////////////////////
2510 /// Return a pointer to the array of bins integral.
2511 /// if the pointer fIntegral is null, TH1::ComputeIntegral is called
2512 /// The array dimension is the number of bins in the histograms
2513 /// including underflow and overflow (fNCells)
2514 /// the last value integral[fNCells] is set to the number of entries of
2515 /// the histogram
2516 
2518 {
2519  if (!fIntegral) ComputeIntegral();
2520  return fIntegral;
2521 }
2522 
2523 ////////////////////////////////////////////////////////////////////////////////
2524 /// Return a pointer to an histogram containing the cumulative The
2525 /// cumulative can be computed both in the forward (default) or backward
2526 /// direction; the name of the new histogram is constructed from
2527 /// the name of this histogram with the suffix suffix appended.
2528 ///
2529 /// The cumulative distribution is formed by filling each bin of the
2530 /// resulting histogram with the sum of that bin and all previous
2531 /// (forward == kTRUE) or following (forward = kFALSE) bins.
2532 ///
2533 /// note: while cumulative distributions make sense in one dimension, you
2534 /// may not be getting what you expect in more than 1D because the concept
2535 /// of a cumulative distribution is much trickier to define; make sure you
2536 /// understand the order of summation before you use this method with
2537 /// histograms of dimension >= 2.
2538 
2539 TH1 *TH1::GetCumulative(Bool_t forward, const char* suffix) const
2540 {
2541  const Int_t nbinsx = GetNbinsX();
2542  const Int_t nbinsy = GetNbinsY();
2543  const Int_t nbinsz = GetNbinsZ();
2544  TH1* hintegrated = (TH1*) Clone(fName + suffix);
2545  hintegrated->Reset();
2546  if (forward) { // Forward computation
2547  Double_t sum = 0.;
2548  for (Int_t binz = 1; binz <= nbinsz; ++binz) {
2549  for (Int_t biny = 1; biny <= nbinsy; ++biny) {
2550  for (Int_t binx = 1; binx <= nbinsx; ++binx) {
2551  const Int_t bin = hintegrated->GetBin(binx, biny, binz);
2552  sum += GetBinContent(bin);
2553  hintegrated->SetBinContent(bin, sum);
2554  }
2555  }
2556  }
2557  } else { // Backward computation
2558  Double_t sum = 0.;
2559  for (Int_t binz = nbinsz; binz >= 1; --binz) {
2560  for (Int_t biny = nbinsy; biny >= 1; --biny) {
2561  for (Int_t binx = nbinsx; binx >= 1; --binx) {
2562  const Int_t bin = hintegrated->GetBin(binx, biny, binz);
2563  sum += GetBinContent(bin);
2564  hintegrated->SetBinContent(bin, sum);
2565  }
2566  }
2567  }
2568  }
2569  return hintegrated;
2570 }
2571 
2572 ////////////////////////////////////////////////////////////////////////////////
2573 /// Copy this histogram structure to newth1.
2574 ///
2575 /// Note that this function does not copy the list of associated functions.
2576 /// Use TObject::Clone to make a full copy of an histogram.
2577 ///
2578 /// Note also that the histogram it will be created in gDirectory (if AddDirectoryStatus()=true)
2579 /// or will not be added to any directory if AddDirectoryStatus()=false
2580 /// independently of the current directory stored in the original histogram
2581 
2582 void TH1::Copy(TObject &obj) const
2583 {
2584  if (((TH1&)obj).fDirectory) {
2585  // We are likely to change the hash value of this object
2586  // with TNamed::Copy, to keep things correct, we need to
2587  // clean up its existing entries.
2588  ((TH1&)obj).fDirectory->Remove(&obj);
2589  ((TH1&)obj).fDirectory = 0;
2590  }
2591  TNamed::Copy(obj);
2592  ((TH1&)obj).fDimension = fDimension;
2593  ((TH1&)obj).fNormFactor= fNormFactor;
2594  ((TH1&)obj).fNcells = fNcells;
2595  ((TH1&)obj).fBarOffset = fBarOffset;
2596  ((TH1&)obj).fBarWidth = fBarWidth;
2597  ((TH1&)obj).fOption = fOption;
2598  ((TH1&)obj).fBinStatErrOpt = fBinStatErrOpt;
2599  ((TH1&)obj).fBufferSize= fBufferSize;
2600  // copy the Buffer
2601  // delete first a previously existing buffer
2602  if (((TH1&)obj).fBuffer != 0) {
2603  delete [] ((TH1&)obj).fBuffer;
2604  ((TH1&)obj).fBuffer = 0;
2605  }
2606  if (fBuffer) {
2607  Double_t *buf = new Double_t[fBufferSize];
2608  for (Int_t i=0;i<fBufferSize;i++) buf[i] = fBuffer[i];
2609  // obj.fBuffer has been deleted before
2610  ((TH1&)obj).fBuffer = buf;
2611  }
2612 
2613 
2614  TArray* a = dynamic_cast<TArray*>(&obj);
2615  if (a) a->Set(fNcells);
2616  for (Int_t i = 0; i < fNcells; i++) ((TH1&)obj).UpdateBinContent(i, RetrieveBinContent(i));
2617 
2618  ((TH1&)obj).fEntries = fEntries;
2619 
2620  // which will call BufferEmpty(0) and set fBuffer[0] to a Maybe one should call
2621  // assignment operator on the TArrayD
2622 
2623  ((TH1&)obj).fTsumw = fTsumw;
2624  ((TH1&)obj).fTsumw2 = fTsumw2;
2625  ((TH1&)obj).fTsumwx = fTsumwx;
2626  ((TH1&)obj).fTsumwx2 = fTsumwx2;
2627  ((TH1&)obj).fMaximum = fMaximum;
2628  ((TH1&)obj).fMinimum = fMinimum;
2629 
2630  TAttLine::Copy(((TH1&)obj));
2631  TAttFill::Copy(((TH1&)obj));
2632  TAttMarker::Copy(((TH1&)obj));
2633  fXaxis.Copy(((TH1&)obj).fXaxis);
2634  fYaxis.Copy(((TH1&)obj).fYaxis);
2635  fZaxis.Copy(((TH1&)obj).fZaxis);
2636  ((TH1&)obj).fXaxis.SetParent(&obj);
2637  ((TH1&)obj).fYaxis.SetParent(&obj);
2638  ((TH1&)obj).fZaxis.SetParent(&obj);
2639  fContour.Copy(((TH1&)obj).fContour);
2640  fSumw2.Copy(((TH1&)obj).fSumw2);
2641  // fFunctions->Copy(((TH1&)obj).fFunctions);
2642  // when copying an histogram if the AddDirectoryStatus() is true it
2643  // will be added to gDirectory independently of the fDirectory stored.
2644  // and if the AddDirectoryStatus() is false it will not be added to
2645  // any directory (fDirectory = 0)
2646  if (fgAddDirectory && gDirectory) {
2647  gDirectory->Append(&obj);
2648  ((TH1&)obj).fFunctions->UseRWLock();
2649  ((TH1&)obj).fDirectory = gDirectory;
2650  } else
2651  ((TH1&)obj).fDirectory = 0;
2652 
2653 }
2654 
2655 ////////////////////////////////////////////////////////////////////////////////
2656 /// Make a complete copy of the underlying object. If 'newname' is set,
2657 /// the copy's name will be set to that name.
2658 
2659 TObject* TH1::Clone(const char* newname) const
2660 {
2661  TH1* obj = (TH1*)IsA()->GetNew()(0);
2662  Copy(*obj);
2663 
2664  // Now handle the parts that Copy doesn't do
2665  if(fFunctions) {
2666  // The Copy above might have published 'obj' to the ListOfCleanups.
2667  // Clone can call RecursiveRemove, for example via TCheckHashRecursiveRemoveConsistency
2668  // when dictionary information is initialized, so we need to
2669  // keep obj->fFunction valid during its execution and
2670  // protect the update with the write lock.
2671  auto newlist = (TList*)fFunctions->Clone();
2672  auto oldlist = obj->fFunctions;
2673  {
2675  obj->fFunctions = newlist;
2676  }
2677  delete oldlist;
2678  }
2679  if(newname && strlen(newname) ) {
2680  obj->SetName(newname);
2681  }
2682  return obj;
2683 }
2684 
2685 ////////////////////////////////////////////////////////////////////////////////
2686 /// Perform the automatic addition of the histogram to the given directory
2687 ///
2688 /// Note this function is called in place when the semantic requires
2689 /// this object to be added to a directory (I.e. when being read from
2690 /// a TKey or being Cloned)
2691 
2693 {
2694  Bool_t addStatus = TH1::AddDirectoryStatus();
2695  if (addStatus) {
2696  SetDirectory(dir);
2697  if (dir) {
2699  }
2700  }
2701 }
2702 
2703 ////////////////////////////////////////////////////////////////////////////////
2704 /// Compute distance from point px,py to a line.
2705 ///
2706 /// Compute the closest distance of approach from point px,py to elements
2707 /// of an histogram.
2708 /// The distance is computed in pixels units.
2709 ///
2710 /// #### Algorithm:
2711 /// Currently, this simple model computes the distance from the mouse
2712 /// to the histogram contour only.
2713 
2715 {
2716  if (!fPainter) return 9999;
2717  return fPainter->DistancetoPrimitive(px,py);
2718 }
2719 
2720 ////////////////////////////////////////////////////////////////////////////////
2721 /// Performs the operation: `this = this/(c1*f1)`
2722 /// if errors are defined (see TH1::Sumw2), errors are also recalculated.
2723 ///
2724 /// Only bins inside the function range are recomputed.
2725 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
2726 /// you should call Sumw2 before making this operation.
2727 /// This is particularly important if you fit the histogram after TH1::Divide
2728 ///
2729 /// The function return kFALSE if the divide operation failed
2730 
2732 {
2733  if (!f1) {
2734  Error("Divide","Attempt to divide by a non-existing function");
2735  return kFALSE;
2736  }
2737 
2738  // delete buffer if it is there since it will become invalid
2739  if (fBuffer) BufferEmpty(1);
2740 
2741  Int_t nx = GetNbinsX() + 2; // normal bins + uf / of
2742  Int_t ny = GetNbinsY() + 2;
2743  Int_t nz = GetNbinsZ() + 2;
2744  if (fDimension < 2) ny = 1;
2745  if (fDimension < 3) nz = 1;
2746 
2747 
2748  SetMinimum();
2749  SetMaximum();
2750 
2751  // - Loop on bins (including underflows/overflows)
2752  Int_t bin, binx, biny, binz;
2753  Double_t cu, w;
2754  Double_t xx[3];
2755  Double_t *params = 0;
2756  f1->InitArgs(xx,params);
2757  for (binz = 0; binz < nz; ++binz) {
2758  xx[2] = fZaxis.GetBinCenter(binz);
2759  for (biny = 0; biny < ny; ++biny) {
2760  xx[1] = fYaxis.GetBinCenter(biny);
2761  for (binx = 0; binx < nx; ++binx) {
2762  xx[0] = fXaxis.GetBinCenter(binx);
2763  if (!f1->IsInside(xx)) continue;
2765  bin = binx + nx * (biny + ny * binz);
2766  cu = c1 * f1->EvalPar(xx);
2767  if (TF1::RejectedPoint()) continue;
2768  if (cu) w = RetrieveBinContent(bin) / cu;
2769  else w = 0;
2770  UpdateBinContent(bin, w);
2771  if (fSumw2.fN) {
2772  if (cu != 0) fSumw2.fArray[bin] = GetBinErrorSqUnchecked(bin) / (cu * cu);
2773  else fSumw2.fArray[bin] = 0;
2774  }
2775  }
2776  }
2777  }
2778  ResetStats();
2779  return kTRUE;
2780 }
2781 
2782 ////////////////////////////////////////////////////////////////////////////////
2783 /// Divide this histogram by h1.
2784 ///
2785 /// `this = this/h1`
2786 /// if errors are defined (see TH1::Sumw2), errors are also recalculated.
2787 /// Note that if h1 has Sumw2 set, Sumw2 is automatically called for this
2788 /// if not already set.
2789 /// The resulting errors are calculated assuming uncorrelated histograms.
2790 /// See the other TH1::Divide that gives the possibility to optionally
2791 /// compute binomial errors.
2792 ///
2793 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
2794 /// you should call Sumw2 before making this operation.
2795 /// This is particularly important if you fit the histogram after TH1::Scale
2796 ///
2797 /// The function return kFALSE if the divide operation failed
2798 
2799 Bool_t TH1::Divide(const TH1 *h1)
2800 {
2801  if (!h1) {
2802  Error("Divide", "Input histogram passed does not exist (NULL).");
2803  return kFALSE;
2804  }
2805 
2806  // delete buffer if it is there since it will become invalid
2807  if (fBuffer) BufferEmpty(1);
2808 
2809  try {
2810  CheckConsistency(this,h1);
2811  } catch(DifferentNumberOfBins&) {
2812  Error("Divide","Cannot divide histograms with different number of bins");
2813  return kFALSE;
2814  } catch(DifferentAxisLimits&) {
2815  Warning("Divide","Dividing histograms with different axis limits");
2816  } catch(DifferentBinLimits&) {
2817  Warning("Divide","Dividing histograms with different bin limits");
2818  } catch(DifferentLabels&) {
2819  Warning("Divide","Dividing histograms with different labels");
2820  }
2821 
2822  // Create Sumw2 if h1 has Sumw2 set
2823  if (fSumw2.fN == 0 && h1->GetSumw2N() != 0) Sumw2();
2824 
2825  // - Loop on bins (including underflows/overflows)
2826  for (Int_t i = 0; i < fNcells; ++i) {
2827  Double_t c0 = RetrieveBinContent(i);
2828  Double_t c1 = h1->RetrieveBinContent(i);
2829  if (c1) UpdateBinContent(i, c0 / c1);
2830  else UpdateBinContent(i, 0);
2831 
2832  if(fSumw2.fN) {
2833  if (c1 == 0) { fSumw2.fArray[i] = 0; continue; }
2834  Double_t c1sq = c1 * c1;
2835  fSumw2.fArray[i] = (GetBinErrorSqUnchecked(i) * c1sq + h1->GetBinErrorSqUnchecked(i) * c0 * c0) / (c1sq * c1sq);
2836  }
2837  }
2838  ResetStats();
2839  return kTRUE;
2840 }
2841 
2842 ////////////////////////////////////////////////////////////////////////////////
2843 /// Replace contents of this histogram by the division of h1 by h2.
2844 ///
2845 /// `this = c1*h1/(c2*h2)`
2846 ///
2847 /// If errors are defined (see TH1::Sumw2), errors are also recalculated
2848 /// Note that if h1 or h2 have Sumw2 set, Sumw2 is automatically called for this
2849 /// if not already set.
2850 /// The resulting errors are calculated assuming uncorrelated histograms.
2851 /// However, if option ="B" is specified, Binomial errors are computed.
2852 /// In this case c1 and c2 do not make real sense and they are ignored.
2853 ///
2854 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
2855 /// you should call Sumw2 before making this operation.
2856 /// This is particularly important if you fit the histogram after TH1::Divide
2857 ///
2858 /// Please note also that in the binomial case errors are calculated using standard
2859 /// binomial statistics, which means when b1 = b2, the error is zero.
2860 /// If you prefer to have efficiency errors not going to zero when the efficiency is 1, you must
2861 /// use the function TGraphAsymmErrors::BayesDivide, which will return an asymmetric and non-zero lower
2862 /// error for the case b1=b2.
2863 ///
2864 /// The function return kFALSE if the divide operation failed
2865 
2866 Bool_t TH1::Divide(const TH1 *h1, const TH1 *h2, Double_t c1, Double_t c2, Option_t *option)
2867 {
2868 
2869  TString opt = option;
2870  opt.ToLower();
2871  Bool_t binomial = kFALSE;
2872  if (opt.Contains("b")) binomial = kTRUE;
2873  if (!h1 || !h2) {
2874  Error("Divide", "At least one of the input histograms passed does not exist (NULL).");
2875  return kFALSE;
2876  }
2877 
2878  // delete buffer if it is there since it will become invalid
2879  if (fBuffer) BufferEmpty(1);
2880 
2881  try {
2882  CheckConsistency(h1,h2);
2883  CheckConsistency(this,h1);
2884  } catch(DifferentNumberOfBins&) {
2885  Error("Divide","Cannot divide histograms with different number of bins");
2886  return kFALSE;
2887  } catch(DifferentAxisLimits&) {
2888  Warning("Divide","Dividing histograms with different axis limits");
2889  } catch(DifferentBinLimits&) {
2890  Warning("Divide","Dividing histograms with different bin limits");
2891  } catch(DifferentLabels&) {
2892  Warning("Divide","Dividing histograms with different labels");
2893  }
2894 
2895 
2896  if (!c2) {
2897  Error("Divide","Coefficient of dividing histogram cannot be zero");
2898  return kFALSE;
2899  }
2900 
2901  // Create Sumw2 if h1 or h2 have Sumw2 set
2902  if (fSumw2.fN == 0 && (h1->GetSumw2N() != 0 || h2->GetSumw2N() != 0)) Sumw2();
2903 
2904  SetMinimum();
2905  SetMaximum();
2906 
2907  // - Loop on bins (including underflows/overflows)
2908  for (Int_t i = 0; i < fNcells; ++i) {
2909  Double_t b1 = h1->RetrieveBinContent(i);
2910  Double_t b2 = h2->RetrieveBinContent(i);
2911  if (b2) UpdateBinContent(i, c1 * b1 / (c2 * b2));
2912  else UpdateBinContent(i, 0);
2913 
2914  if (fSumw2.fN) {
2915  if (b2 == 0) { fSumw2.fArray[i] = 0; continue; }
2916  Double_t b1sq = b1 * b1; Double_t b2sq = b2 * b2;
2917  Double_t c1sq = c1 * c1; Double_t c2sq = c2 * c2;
2918  Double_t e1sq = h1->GetBinErrorSqUnchecked(i);
2919  Double_t e2sq = h2->GetBinErrorSqUnchecked(i);
2920  if (binomial) {
2921  if (b1 != b2) {
2922  // in the case of binomial statistics c1 and c2 must be 1 otherwise it does not make sense
2923  // c1 and c2 are ignored
2924  //fSumw2.fArray[bin] = TMath::Abs(w*(1-w)/(c2*b2));//this is the formula in Hbook/Hoper1
2925  //fSumw2.fArray[bin] = TMath::Abs(w*(1-w)/b2); // old formula from G. Flucke
2926  // formula which works also for weighted histogram (see http://root-forum.cern.ch/viewtopic.php?t=3753 )
2927  fSumw2.fArray[i] = TMath::Abs( ( (1. - 2.* b1 / b2) * e1sq + b1sq * e2sq / b2sq ) / b2sq );
2928  } else {
2929  //in case b1=b2 error is zero
2930  //use TGraphAsymmErrors::BayesDivide for getting the asymmetric error not equal to zero
2931  fSumw2.fArray[i] = 0;
2932  }
2933  } else {
2934  fSumw2.fArray[i] = c1sq * c2sq * (e1sq * b2sq + e2sq * b1sq) / (c2sq * c2sq * b2sq * b2sq);
2935  }
2936  }
2937  }
2938  ResetStats();
2939  if (binomial)
2940  // in case of binomial division use denominator for number of entries
2941  SetEntries ( h2->GetEntries() );
2942 
2943  return kTRUE;
2944 }
2945 
2946 ////////////////////////////////////////////////////////////////////////////////
2947 /// Draw this histogram with options.
2948 ///
2949 /// Histograms are drawn via the THistPainter class. Each histogram has
2950 /// a pointer to its own painter (to be usable in a multithreaded program).
2951 /// The same histogram can be drawn with different options in different pads.
2952 /// When an histogram drawn in a pad is deleted, the histogram is
2953 /// automatically removed from the pad or pads where it was drawn.
2954 /// If an histogram is drawn in a pad, then filled again, the new status
2955 /// of the histogram will be automatically shown in the pad next time
2956 /// the pad is updated. One does not need to redraw the histogram.
2957 /// To draw the current version of an histogram in a pad, one can use
2958 /// `h->DrawCopy();`
2959 /// This makes a clone of the histogram. Once the clone is drawn, the original
2960 /// histogram may be modified or deleted without affecting the aspect of the
2961 /// clone.
2962 /// By default, TH1::Draw clears the current pad.
2963 ///
2964 /// One can use TH1::SetMaximum and TH1::SetMinimum to force a particular
2965 /// value for the maximum or the minimum scale on the plot.
2966 ///
2967 /// TH1::UseCurrentStyle can be used to change all histogram graphics
2968 /// attributes to correspond to the current selected style.
2969 /// This function must be called for each histogram.
2970 /// In case one reads and draws many histograms from a file, one can force
2971 /// the histograms to inherit automatically the current graphics style
2972 /// by calling before gROOT->ForceStyle();
2973 ///
2974 /// See the THistPainter class for a description of all the drawing options.
2975 
2976 void TH1::Draw(Option_t *option)
2977 {
2978  TString opt1 = option; opt1.ToLower();
2979  TString opt2 = option;
2980  Int_t index = opt1.Index("same");
2981 
2982  // Check if the string "same" is part of a TCutg name.
2983  if (index>=0) {
2984  Int_t indb = opt1.Index("[");
2985  if (indb>=0) {
2986  Int_t indk = opt1.Index("]");
2987  if (index>indb && index<indk) index = -1;
2988  }
2989  }
2990 
2991  // If there is no pad or an empty pad the "same" option is ignored.
2992  if (gPad) {
2993  if (!gPad->IsEditable()) gROOT->MakeDefCanvas();
2994  if (index>=0) {
2995  if (gPad->GetX1() == 0 && gPad->GetX2() == 1 &&
2996  gPad->GetY1() == 0 && gPad->GetY2() == 1 &&
2997  gPad->GetListOfPrimitives()->GetSize()==0) opt2.Remove(index,4);
2998  } else {
2999  //the following statement is necessary in case one attempts to draw
3000  //a temporary histogram already in the current pad
3001  if (TestBit(kCanDelete)) gPad->GetListOfPrimitives()->Remove(this);
3002  gPad->Clear();
3003  }
3004  gPad->IncrementPaletteColor(1, opt1);
3005  } else {
3006  if (index>=0) opt2.Remove(index,4);
3007  }
3008 
3009  AppendPad(opt2.Data());
3010 }
3011 
3012 ////////////////////////////////////////////////////////////////////////////////
3013 /// Copy this histogram and Draw in the current pad.
3014 ///
3015 /// Once the histogram is drawn into the pad, any further modification
3016 /// using graphics input will be made on the copy of the histogram,
3017 /// and not to the original object.
3018 /// By default a postfix "_copy" is added to the histogram name. Pass an empty postfix in case
3019 /// you want to draw an histogram with the same name
3020 ///
3021 /// See Draw for the list of options
3022 
3023 TH1 *TH1::DrawCopy(Option_t *option, const char * name_postfix) const
3024 {
3025  TString opt = option;
3026  opt.ToLower();
3027  if (gPad && !opt.Contains("same")) gPad->Clear();
3028  TString newName = (name_postfix) ? TString::Format("%s%s",GetName(),name_postfix) : "";
3029  TH1 *newth1 = (TH1 *)Clone(newName);
3030  newth1->SetDirectory(0);
3031  newth1->SetBit(kCanDelete);
3032  if (gPad) gPad->IncrementPaletteColor(1, opt);
3033 
3034  newth1->AppendPad(option);
3035  return newth1;
3036 }
3037 
3038 ////////////////////////////////////////////////////////////////////////////////
3039 /// Draw a normalized copy of this histogram.
3040 ///
3041 /// A clone of this histogram is normalized to norm and drawn with option.
3042 /// A pointer to the normalized histogram is returned.
3043 /// The contents of the histogram copy are scaled such that the new
3044 /// sum of weights (excluding under and overflow) is equal to norm.
3045 /// Note that the returned normalized histogram is not added to the list
3046 /// of histograms in the current directory in memory.
3047 /// It is the user's responsibility to delete this histogram.
3048 /// The kCanDelete bit is set for the returned object. If a pad containing
3049 /// this copy is cleared, the histogram will be automatically deleted.
3050 ///
3051 /// See Draw for the list of options
3052 
3053 TH1 *TH1::DrawNormalized(Option_t *option, Double_t norm) const
3054 {
3056  if (sum == 0) {
3057  Error("DrawNormalized","Sum of weights is null. Cannot normalize histogram: %s",GetName());
3058  return 0;
3059  }
3060  Bool_t addStatus = TH1::AddDirectoryStatus();
3062  TH1 *h = (TH1*)Clone();
3063  h->SetBit(kCanDelete);
3064  // in case of drawing with error options - scale correctly the error
3065  TString opt(option); opt.ToUpper();
3066  if (fSumw2.fN == 0) {
3067  h->Sumw2();
3068  // do not use in this case the "Error option " for drawing which is enabled by default since the normalized histogram has now errors
3069  if (opt.IsNull() || opt == "SAME") opt += "HIST";
3070  }
3071  h->Scale(norm/sum);
3072  if (TMath::Abs(fMaximum+1111) > 1e-3) h->SetMaximum(fMaximum*norm/sum);
3073  if (TMath::Abs(fMinimum+1111) > 1e-3) h->SetMinimum(fMinimum*norm/sum);
3074  h->Draw(opt);
3075  TH1::AddDirectory(addStatus);
3076  return h;
3077 }
3078 
3079 ////////////////////////////////////////////////////////////////////////////////
3080 /// Display a panel with all histogram drawing options.
3081 ///
3082 /// See class TDrawPanelHist for example
3083 
3084 void TH1::DrawPanel()
3085 {
3086  if (!fPainter) {Draw(); if (gPad) gPad->Update();}
3087  if (fPainter) fPainter->DrawPanel();
3088 }
3089 
3090 ////////////////////////////////////////////////////////////////////////////////
3091 /// Evaluate function f1 at the center of bins of this histogram.
3092 ///
3093 /// - If option "R" is specified, the function is evaluated only
3094 /// for the bins included in the function range.
3095 /// - If option "A" is specified, the value of the function is added to the
3096 /// existing bin contents
3097 /// - If option "S" is specified, the value of the function is used to
3098 /// generate a value, distributed according to the Poisson
3099 /// distribution, with f1 as the mean.
3100 
3101 void TH1::Eval(TF1 *f1, Option_t *option)
3102 {
3103  Double_t x[3];
3104  Int_t range, stat, add;
3105  if (!f1) return;
3106 
3107  TString opt = option;
3108  opt.ToLower();
3109  if (opt.Contains("a")) add = 1;
3110  else add = 0;
3111  if (opt.Contains("s")) stat = 1;
3112  else stat = 0;
3113  if (opt.Contains("r")) range = 1;
3114  else range = 0;
3115 
3116  // delete buffer if it is there since it will become invalid
3117  if (fBuffer) BufferEmpty(1);
3118 
3119  Int_t nbinsx = fXaxis.GetNbins();
3120  Int_t nbinsy = fYaxis.GetNbins();
3121  Int_t nbinsz = fZaxis.GetNbins();
3122  if (!add) Reset();
3123 
3124  for (Int_t binz = 1; binz <= nbinsz; ++binz) {
3125  x[2] = fZaxis.GetBinCenter(binz);
3126  for (Int_t biny = 1; biny <= nbinsy; ++biny) {
3127  x[1] = fYaxis.GetBinCenter(biny);
3128  for (Int_t binx = 1; binx <= nbinsx; ++binx) {
3129  Int_t bin = GetBin(binx,biny,binz);
3130  x[0] = fXaxis.GetBinCenter(binx);
3131  if (range && !f1->IsInside(x)) continue;
3132  Double_t fu = f1->Eval(x[0], x[1], x[2]);
3133  if (stat) fu = gRandom->PoissonD(fu);
3134  AddBinContent(bin, fu);
3135  if (fSumw2.fN) fSumw2.fArray[bin] += TMath::Abs(fu);
3136  }
3137  }
3138  }
3139 }
3140 
3141 ////////////////////////////////////////////////////////////////////////////////
3142 /// Execute action corresponding to one event.
3143 ///
3144 /// This member function is called when a histogram is clicked with the locator
3145 ///
3146 /// If Left button clicked on the bin top value, then the content of this bin
3147 /// is modified according to the new position of the mouse when it is released.
3148 
3149 void TH1::ExecuteEvent(Int_t event, Int_t px, Int_t py)
3150 {
3151  if (fPainter) fPainter->ExecuteEvent(event, px, py);
3152 }
3153 
3154 ////////////////////////////////////////////////////////////////////////////////
3155 /// This function allows to do discrete Fourier transforms of TH1 and TH2.
3156 /// Available transform types and flags are described below.
3157 ///
3158 /// To extract more information about the transform, use the function
3159 /// TVirtualFFT::GetCurrentTransform() to get a pointer to the current
3160 /// transform object.
3161 ///
3162 /// \param[out] h_output histogram for the output. If a null pointer is passed, a new histogram is created
3163 /// and returned, otherwise, the provided histogram is used and should be big enough
3164 /// \param[in] option option parameters consists of 3 parts:
3165 /// - option on what to return
3166 /// - "RE" - returns a histogram of the real part of the output
3167 /// - "IM" - returns a histogram of the imaginary part of the output
3168 /// - "MAG"- returns a histogram of the magnitude of the output
3169 /// - "PH" - returns a histogram of the phase of the output
3170 /// - option of transform type
3171 /// - "R2C" - real to complex transforms - default
3172 /// - "R2HC" - real to halfcomplex (special format of storing output data,
3173 /// results the same as for R2C)
3174 /// - "DHT" - discrete Hartley transform
3175 /// real to real transforms (sine and cosine):
3176 /// - "R2R_0", "R2R_1", "R2R_2", "R2R_3" - discrete cosine transforms of types I-IV
3177 /// - "R2R_4", "R2R_5", "R2R_6", "R2R_7" - discrete sine transforms of types I-IV
3178 /// To specify the type of each dimension of a 2-dimensional real to real
3179 /// transform, use options of form "R2R_XX", for example, "R2R_02" for a transform,
3180 /// which is of type "R2R_0" in 1st dimension and "R2R_2" in the 2nd.
3181 /// - option of transform flag
3182 /// - "ES" (from "estimate") - no time in preparing the transform, but probably sub-optimal
3183 /// performance
3184 /// - "M" (from "measure") - some time spend in finding the optimal way to do the transform
3185 /// - "P" (from "patient") - more time spend in finding the optimal way to do the transform
3186 /// - "EX" (from "exhaustive") - the most optimal way is found
3187 /// This option should be chosen depending on how many transforms of the same size and
3188 /// type are going to be done. Planning is only done once, for the first transform of this
3189 /// size and type. Default is "ES".
3190 ///
3191 /// Examples of valid options: "Mag R2C M" "Re R2R_11" "Im R2C ES" "PH R2HC EX"
3192 
3193 TH1* TH1::FFT(TH1* h_output, Option_t *option)
3194 {
3195 
3196  Int_t ndim[3];
3197  ndim[0] = this->GetNbinsX();
3198  ndim[1] = this->GetNbinsY();
3199  ndim[2] = this->GetNbinsZ();
3200 
3201  TVirtualFFT *fft;
3202  TString opt = option;
3203  opt.ToUpper();
3204  if (!opt.Contains("2R")){
3205  if (!opt.Contains("2C") && !opt.Contains("2HC") && !opt.Contains("DHT")) {
3206  //no type specified, "R2C" by default
3207  opt.Append("R2C");
3208  }
3209  fft = TVirtualFFT::FFT(this->GetDimension(), ndim, opt.Data());
3210  }
3211  else {
3212  //find the kind of transform
3213  Int_t ind = opt.Index("R2R", 3);
3214  Int_t *kind = new Int_t[2];
3215  char t;
3216  t = opt[ind+4];
3217  kind[0] = atoi(&t);
3218  if (h_output->GetDimension()>1) {
3219  t = opt[ind+5];
3220  kind[1] = atoi(&t);
3221  }
3222  fft = TVirtualFFT::SineCosine(this->GetDimension(), ndim, kind, option);
3223  delete [] kind;
3224  }
3225 
3226  if (!fft) return 0;
3227  Int_t in=0;
3228  for (Int_t binx = 1; binx<=ndim[0]; binx++) {
3229  for (Int_t biny=1; biny<=ndim[1]; biny++) {
3230  for (Int_t binz=1; binz<=ndim[2]; binz++) {
3231  fft->SetPoint(in, this->GetBinContent(binx, biny, binz));
3232  in++;
3233  }
3234  }
3235  }
3236  fft->Transform();
3237  h_output = TransformHisto(fft, h_output, option);
3238  return h_output;
3239 }
3240 
3241 ////////////////////////////////////////////////////////////////////////////////
3242 /// Increment bin with abscissa X by 1.
3243 ///
3244 /// if x is less than the low-edge of the first bin, the Underflow bin is incremented
3245 /// if x is greater than the upper edge of last bin, the Overflow bin is incremented
3246 ///
3247 /// If the storage of the sum of squares of weights has been triggered,
3248 /// via the function Sumw2, then the sum of the squares of weights is incremented
3249 /// by 1 in the bin corresponding to x.
3250 ///
3251 /// The function returns the corresponding bin number which has its content incremented by 1
3252 
3254 {
3255  if (fBuffer) return BufferFill(x,1);
3256 
3257  Int_t bin;
3258  fEntries++;
3259  bin =fXaxis.FindBin(x);
3260  if (bin <0) return -1;
3261  AddBinContent(bin);
3262  if (fSumw2.fN) ++fSumw2.fArray[bin];
3263  if (bin == 0 || bin > fXaxis.GetNbins()) {
3264  if (!GetStatOverflowsBehaviour()) return -1;
3265  }
3266  ++fTsumw;
3267  ++fTsumw2;
3268  fTsumwx += x;
3269  fTsumwx2 += x*x;
3270  return bin;
3271 }
3272 
3273 ////////////////////////////////////////////////////////////////////////////////
3274 /// Increment bin with abscissa X with a weight w.
3275 ///
3276 /// if x is less than the low-edge of the first bin, the Underflow bin is incremented
3277 /// if x is greater than the upper edge of last bin, the Overflow bin is incremented
3278 ///
3279 /// If the weight is not equal to 1, the storage of the sum of squares of
3280 /// weights is automatically triggered and the sum of the squares of weights is incremented
3281 /// by \f$ w^2 \f$ in the bin corresponding to x.
3282 ///
3283 /// The function returns the corresponding bin number which has its content incremented by w
3284 
3286 {
3287 
3288  if (fBuffer) return BufferFill(x,w);
3289 
3290  Int_t bin;
3291  fEntries++;
3292  bin =fXaxis.FindBin(x);
3293  if (bin <0) return -1;
3294  if (!fSumw2.fN && w != 1.0 && !TestBit(TH1::kIsNotW) ) Sumw2(); // must be called before AddBinContent
3295  if (fSumw2.fN) fSumw2.fArray[bin] += w*w;
3296  AddBinContent(bin, w);
3297  if (bin == 0 || bin > fXaxis.GetNbins()) {
3298  if (!GetStatOverflowsBehaviour()) return -1;
3299  }
3300  Double_t z= w;
3301  fTsumw += z;
3302  fTsumw2 += z*z;
3303  fTsumwx += z*x;
3304  fTsumwx2 += z*x*x;
3305  return bin;
3306 }
3307 
3308 ////////////////////////////////////////////////////////////////////////////////
3309 /// Increment bin with namex with a weight w
3310 ///
3311 /// if x is less than the low-edge of the first bin, the Underflow bin is incremented
3312 /// if x is greater than the upper edge of last bin, the Overflow bin is incremented
3313 ///
3314 /// If the weight is not equal to 1, the storage of the sum of squares of
3315 /// weights is automatically triggered and the sum of the squares of weights is incremented
3316 /// by \f$ w^2 \f$ in the bin corresponding to x.
3317 ///
3318 /// The function returns the corresponding bin number which has its content
3319 /// incremented by w.
3320 
3321 Int_t TH1::Fill(const char *namex, Double_t w)
3322 {
3323  Int_t bin;
3324  fEntries++;
3325  bin =fXaxis.FindBin(namex);
3326  if (bin <0) return -1;
3327  if (!fSumw2.fN && w != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2();
3328  if (fSumw2.fN) fSumw2.fArray[bin] += w*w;
3329  AddBinContent(bin, w);
3330  if (bin == 0 || bin > fXaxis.GetNbins()) return -1;
3331  Double_t z= w;
3332  fTsumw += z;
3333  fTsumw2 += z*z;
3334  // this make sense if the histogram is not expanding (no axis can be extended)
3335  if (!CanExtendAllAxes()) {
3336  Double_t x = fXaxis.GetBinCenter(bin);
3337  fTsumwx += z*x;
3338  fTsumwx2 += z*x*x;
3339  }
3340  return bin;
3341 }
3342 
3343 ////////////////////////////////////////////////////////////////////////////////
3344 /// Fill this histogram with an array x and weights w.
3345 ///
3346 /// \param[in] ntimes number of entries in arrays x and w (array size must be ntimes*stride)
3347 /// \param[in] x array of values to be histogrammed
3348 /// \param[in] w array of weighs
3349 /// \param[in] stride step size through arrays x and w
3350 ///
3351 /// If the weight is not equal to 1, the storage of the sum of squares of
3352 /// weights is automatically triggered and the sum of the squares of weights is incremented
3353 /// by \f$ w^2 \f$ in the bin corresponding to x.
3354 /// if w is NULL each entry is assumed a weight=1
3355 
3356 void TH1::FillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride)
3357 {
3358  //If a buffer is activated, fill buffer
3359  if (fBuffer) {
3360  ntimes *= stride;
3361  Int_t i = 0;
3362  for (i=0;i<ntimes;i+=stride) {
3363  if (!fBuffer) break; // buffer can be deleted in BufferFill when is empty
3364  if (w) BufferFill(x[i],w[i]);
3365  else BufferFill(x[i], 1.);
3366  }
3367  // fill the remaining entries if the buffer has been deleted
3368  if (i < ntimes && fBuffer==0) {
3369  auto weights = w ? &w[i] : nullptr;
3370  DoFillN((ntimes-i)/stride,&x[i],weights,stride);
3371  }
3372  return;
3373  }
3374  // call internal method
3375  DoFillN(ntimes, x, w, stride);
3376 }
3377 
3378 ////////////////////////////////////////////////////////////////////////////////
3379 /// Internal method to fill histogram content from a vector
3380 /// called directly by TH1::BufferEmpty
3381 
3382 void TH1::DoFillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride)
3383 {
3384  Int_t bin,i;
3385 
3386  fEntries += ntimes;
3387  Double_t ww = 1;
3388  Int_t nbins = fXaxis.GetNbins();
3389  ntimes *= stride;
3390  for (i=0;i<ntimes;i+=stride) {
3391  bin =fXaxis.FindBin(x[i]);
3392  if (bin <0) continue;
3393  if (w) ww = w[i];
3394  if (!fSumw2.fN && ww != 1.0 && !TestBit(TH1::kIsNotW)) Sumw2();
3395  if (fSumw2.fN) fSumw2.fArray[bin] += ww*ww;
3396  AddBinContent(bin, ww);
3397  if (bin == 0 || bin > nbins) {
3398  if (!GetStatOverflowsBehaviour()) continue;
3399  }
3400  Double_t z= ww;
3401  fTsumw += z;
3402  fTsumw2 += z*z;
3403  fTsumwx += z*x[i];
3404  fTsumwx2 += z*x[i]*x[i];
3405  }
3406 }
3407 
3408 ////////////////////////////////////////////////////////////////////////////////
3409 /// Fill histogram following distribution in function fname.
3410 ///
3411 /// The distribution contained in the function fname (TF1) is integrated
3412 /// over the channel contents for the bin range of this histogram.
3413 /// It is normalized to 1.
3414 ///
3415 /// Getting one random number implies:
3416 /// - Generating a random number between 0 and 1 (say r1)
3417 /// - Look in which bin in the normalized integral r1 corresponds to
3418 /// - Fill histogram channel
3419 /// ntimes random numbers are generated
3420 ///
3421 /// One can also call TF1::GetRandom to get a random variate from a function.
3422 
3423 void TH1::FillRandom(const char *fname, Int_t ntimes)
3424 {
3425  Int_t bin, binx, ibin, loop;
3426  Double_t r1, x;
3427  // - Search for fname in the list of ROOT defined functions
3428  TF1 *f1 = (TF1*)gROOT->GetFunction(fname);
3429  if (!f1) { Error("FillRandom", "Unknown function: %s",fname); return; }
3430 
3431  // - Allocate temporary space to store the integral and compute integral
3432 
3433  TAxis * xAxis = &fXaxis;
3434 
3435  // in case axis of histogram is not defined use the function axis
3436  if (fXaxis.GetXmax() <= fXaxis.GetXmin()) {
3437  Double_t xmin,xmax;
3438  f1->GetRange(xmin,xmax);
3439  Info("FillRandom","Using function axis and range [%g,%g]",xmin, xmax);
3440  xAxis = f1->GetHistogram()->GetXaxis();
3441  }
3442 
3443  Int_t first = xAxis->GetFirst();
3444  Int_t last = xAxis->GetLast();
3445  Int_t nbinsx = last-first+1;
3446 
3447  Double_t *integral = new Double_t[nbinsx+1];
3448  integral[0] = 0;
3449  for (binx=1;binx<=nbinsx;binx++) {
3450  Double_t fint = f1->Integral(xAxis->GetBinLowEdge(binx+first-1),xAxis->GetBinUpEdge(binx+first-1), 0.);
3451  integral[binx] = integral[binx-1] + fint;
3452  }
3453 
3454  // - Normalize integral to 1
3455  if (integral[nbinsx] == 0 ) {
3456  delete [] integral;
3457  Error("FillRandom", "Integral = zero"); return;
3458  }
3459  for (bin=1;bin<=nbinsx;bin++) integral[bin] /= integral[nbinsx];
3460 
3461  // --------------Start main loop ntimes
3462  for (loop=0;loop<ntimes;loop++) {
3463  r1 = gRandom->Rndm();
3464  ibin = TMath::BinarySearch(nbinsx,&integral[0],r1);
3465  //binx = 1 + ibin;
3466  //x = xAxis->GetBinCenter(binx); //this is not OK when SetBuffer is used
3467  x = xAxis->GetBinLowEdge(ibin+first)
3468  +xAxis->GetBinWidth(ibin+first)*(r1-integral[ibin])/(integral[ibin+1] - integral[ibin]);
3469  Fill(x);
3470  }
3471  delete [] integral;
3472 }
3473 
3474 ////////////////////////////////////////////////////////////////////////////////
3475 /// Fill histogram following distribution in histogram h.
3476 ///
3477 /// The distribution contained in the histogram h (TH1) is integrated
3478 /// over the channel contents for the bin range of this histogram.
3479 /// It is normalized to 1.
3480 ///
3481 /// Getting one random number implies:
3482 /// - Generating a random number between 0 and 1 (say r1)
3483 /// - Look in which bin in the normalized integral r1 corresponds to
3484 /// - Fill histogram channel ntimes random numbers are generated
3485 ///
3486 /// SPECIAL CASE when the target histogram has the same binning as the source.
3487 /// in this case we simply use a poisson distribution where
3488 /// the mean value per bin = bincontent/integral.
3489 
3490 void TH1::FillRandom(TH1 *h, Int_t ntimes)
3491 {
3492  if (!h) { Error("FillRandom", "Null histogram"); return; }
3493  if (fDimension != h->GetDimension()) {
3494  Error("FillRandom", "Histograms with different dimensions"); return;
3495  }
3496  if (std::isnan(h->ComputeIntegral(true))) {
3497  Error("FillRandom", "Histograms contains negative bins, does not represent probabilities");
3498  return;
3499  }
3500 
3501  //in case the target histogram has the same binning and ntimes much greater
3502  //than the number of bins we can use a fast method
3503  Int_t first = fXaxis.GetFirst();
3504  Int_t last = fXaxis.GetLast();
3505  Int_t nbins = last-first+1;
3506  if (ntimes > 10*nbins) {
3507  try {
3508  CheckConsistency(this,h);
3509  Double_t sumw = h->Integral(first,last);
3510  if (sumw == 0) return;
3511  Double_t sumgen = 0;
3512  for (Int_t bin=first;bin<=last;bin++) {
3513  Double_t mean = h->RetrieveBinContent(bin)*ntimes/sumw;
3514  Double_t cont = (Double_t)gRandom->Poisson(mean);
3515  sumgen += cont;
3516  AddBinContent(bin,cont);
3517  if (fSumw2.fN) fSumw2.fArray[bin] += cont;
3518  }
3519 
3520  // fix for the fluctuations in the total number n
3521  // since we use Poisson instead of multinomial
3522  // add a correction to have ntimes as generated entries
3523  Int_t i;
3524  if (sumgen < ntimes) {
3525  // add missing entries
3526  for (i = Int_t(sumgen+0.5); i < ntimes; ++i)
3527  {
3528  Double_t x = h->GetRandom();
3529  Fill(x);
3530  }
3531  }
3532  else if (sumgen > ntimes) {
3533  // remove extra entries
3534  i = Int_t(sumgen+0.5);
3535  while( i > ntimes) {
3536  Double_t x = h->GetRandom();
3537  Int_t ibin = fXaxis.FindBin(x);
3538  Double_t y = RetrieveBinContent(ibin);
3539  // skip in case bin is empty
3540  if (y > 0) {
3541  SetBinContent(ibin, y-1.);
3542  i--;
3543  }
3544  }
3545  }
3546 
3547  ResetStats();
3548  return;
3549  }
3550  catch(std::exception&) {} // do nothing
3551  }
3552  // case of different axis and not too large ntimes
3553 
3554  if (h->ComputeIntegral() ==0) return;
3555  Int_t loop;
3556  Double_t x;
3557  for (loop=0;loop<ntimes;loop++) {
3558  x = h->GetRandom();
3559  Fill(x);
3560  }
3561 }
3562 
3563 ////////////////////////////////////////////////////////////////////////////////
3564 /// Return Global bin number corresponding to x,y,z
3565 ///
3566 /// 2-D and 3-D histograms are represented with a one dimensional
3567 /// structure. This has the advantage that all existing functions, such as
3568 /// GetBinContent, GetBinError, GetBinFunction work for all dimensions.
3569 /// This function tries to extend the axis if the given point belongs to an
3570 /// under-/overflow bin AND if CanExtendAllAxes() is true.
3571 ///
3572 /// See also TH1::GetBin, TAxis::FindBin and TAxis::FindFixBin
3573 
3575 {
3576  if (GetDimension() < 2) {
3577  return fXaxis.FindBin(x);
3578  }
3579  if (GetDimension() < 3) {
3580  Int_t nx = fXaxis.GetNbins()+2;
3581  Int_t binx = fXaxis.FindBin(x);
3582  Int_t biny = fYaxis.FindBin(y);
3583  return binx + nx*biny;
3584  }
3585  if (GetDimension() < 4) {
3586  Int_t nx = fXaxis.GetNbins()+2;
3587  Int_t ny = fYaxis.GetNbins()+2;
3588  Int_t binx = fXaxis.FindBin(x);
3589  Int_t biny = fYaxis.FindBin(y);
3590  Int_t binz = fZaxis.FindBin(z);
3591  return binx + nx*(biny +ny*binz);
3592  }
3593  return -1;
3594 }
3595 
3596 ////////////////////////////////////////////////////////////////////////////////
3597 /// Return Global bin number corresponding to x,y,z.
3598 ///
3599 /// 2-D and 3-D histograms are represented with a one dimensional
3600 /// structure. This has the advantage that all existing functions, such as
3601 /// GetBinContent, GetBinError, GetBinFunction work for all dimensions.
3602 /// This function DOES NOT try to extend the axis if the given point belongs
3603 /// to an under-/overflow bin.
3604 ///
3605 /// See also TH1::GetBin, TAxis::FindBin and TAxis::FindFixBin
3606 
3608 {
3609  if (GetDimension() < 2) {
3610  return fXaxis.FindFixBin(x);
3611  }
3612  if (GetDimension() < 3) {
3613  Int_t nx = fXaxis.GetNbins()+2;
3614  Int_t binx = fXaxis.FindFixBin(x);
3615  Int_t biny = fYaxis.FindFixBin(y);
3616  return binx + nx*biny;
3617  }
3618  if (GetDimension() < 4) {
3619  Int_t nx = fXaxis.GetNbins()+2;
3620  Int_t ny = fYaxis.GetNbins()+2;
3621  Int_t binx = fXaxis.FindFixBin(x);
3622  Int_t biny = fYaxis.FindFixBin(y);
3623  Int_t binz = fZaxis.FindFixBin(z);
3624  return binx + nx*(biny +ny*binz);
3625  }
3626  return -1;
3627 }
3628 
3629 ////////////////////////////////////////////////////////////////////////////////
3630 /// Find first bin with content > threshold for axis (1=x, 2=y, 3=z)
3631 /// if no bins with content > threshold is found the function returns -1.
3632 
3633 Int_t TH1::FindFirstBinAbove(Double_t threshold, Int_t axis) const
3634 {
3635  if (fBuffer) ((TH1*)this)->BufferEmpty();
3636 
3637  if (axis != 1) {
3638  Warning("FindFirstBinAbove","Invalid axis number : %d, axis x assumed\n",axis);
3639  axis = 1;
3640  }
3641  Int_t nbins = fXaxis.GetNbins();
3642  for (Int_t bin=1;bin<=nbins;bin++) {
3643  if (RetrieveBinContent(bin) > threshold) return bin;
3644  }
3645  return -1;
3646 }
3647 
3648 ////////////////////////////////////////////////////////////////////////////////
3649 /// Find last bin with content > threshold for axis (1=x, 2=y, 3=z)
3650 /// if no bins with content > threshold is found the function returns -1.
3651 
3652 Int_t TH1::FindLastBinAbove(Double_t threshold, Int_t axis) const
3653 {
3654  if (fBuffer) ((TH1*)this)->BufferEmpty();
3655 
3656  if (axis != 1) {
3657  Warning("FindLastBinAbove","Invalid axis number : %d, axis x assumed\n",axis);
3658  axis = 1;
3659  }
3660  Int_t nbins = fXaxis.GetNbins();
3661  for (Int_t bin=nbins;bin>=1;bin--) {
3662  if (RetrieveBinContent(bin) > threshold) return bin;
3663  }
3664  return -1;
3665 }
3666 
3667 ////////////////////////////////////////////////////////////////////////////////
3668 /// Search object named name in the list of functions.
3669 
3670 TObject *TH1::FindObject(const char *name) const
3671 {
3672  if (fFunctions) return fFunctions->FindObject(name);
3673  return 0;
3674 }
3675 
3676 ////////////////////////////////////////////////////////////////////////////////
3677 /// Search object obj in the list of functions.
3678 
3679 TObject *TH1::FindObject(const TObject *obj) const
3680 {
3681  if (fFunctions) return fFunctions->FindObject(obj);
3682  return 0;
3683 }
3684 
3685 ////////////////////////////////////////////////////////////////////////////////
3686 /// Fit histogram with function fname.
3687 ///
3688 /// fname is the name of an already predefined function created by TF1 or TF2
3689 /// Predefined functions such as gaus, expo and poln are automatically
3690 /// created by ROOT.
3691 /// fname can also be a formula, accepted by the linear fitter (linear parts divided
3692 /// by "++" sign), for example "x++sin(x)" for fitting "[0]*x+[1]*sin(x)"
3693 ///
3694 /// This function finds a pointer to the TF1 object with name fname
3695 /// and calls TH1::Fit(TF1 *f1,...)
3696 
3697 TFitResultPtr TH1::Fit(const char *fname ,Option_t *option ,Option_t *goption, Double_t xxmin, Double_t xxmax)
3698 {
3699  char *linear;
3700  linear= (char*)strstr(fname, "++");
3701  TF1 *f1=0;
3702  TF2 *f2=0;
3703  TF3 *f3=0;
3704  Int_t ndim=GetDimension();
3705  if (linear){
3706  if (ndim<2){
3707  f1=new TF1(fname, fname, xxmin, xxmax);
3708  return Fit(f1,option,goption,xxmin,xxmax);
3709  }
3710  else if (ndim<3){
3711  f2=new TF2(fname, fname);
3712  return Fit(f2,option,goption,xxmin,xxmax);
3713  }
3714  else{
3715  f3=new TF3(fname, fname);
3716  return Fit(f3,option,goption,xxmin,xxmax);
3717  }
3718  }
3719 
3720  else{
3721  f1 = (TF1*)gROOT->GetFunction(fname);
3722  if (!f1) { Printf("Unknown function: %s",fname); return -1; }
3723  return Fit(f1,option,goption,xxmin,xxmax);
3724  }
3725 }
3726 
3727 ////////////////////////////////////////////////////////////////////////////////
3728 /// Fit histogram with function f1.
3729 ///
3730 /// \param[in] option fit options is given in parameter option.
3731 /// - "W" Set all weights to 1 for non empty bins; ignore error bars
3732 /// - "WW" Set all weights to 1 including empty bins; ignore error bars
3733 /// - "I" Use integral of function in bin, normalized by the bin volume,
3734 /// instead of value at bin center
3735 /// - "L" Use Loglikelihood method (default is chisquare method)
3736 /// - "WL" Use Loglikelihood method and bin contents are not integer,
3737 /// i.e. histogram is weighted (must have Sumw2() set)
3738 /// - "P" Use Pearson chi2 (using expected errors instead of observed errors)
3739 /// - "U" Use a User specified fitting algorithm (via SetFCN)
3740 /// - "Q" Quiet mode (minimum printing)
3741 /// - "V" Verbose mode (default is between Q and V)
3742 /// - "E" Perform better Errors estimation using Minos technique
3743 /// - "B" User defined parameter settings are used for predefined functions
3744 /// like "gaus", "expo", "poln", "landau".
3745 /// Use this option when you want to fix one or more parameters for these functions.
3746 /// - "M" More. Improve fit results.
3747 /// It uses the IMPROVE command of TMinuit (see TMinuit::mnimpr).
3748 /// This algorithm attempts to improve the found local minimum by searching for a
3749 /// better one.
3750 /// - "R" Use the Range specified in the function range
3751 /// - "N" Do not store the graphics function, do not draw
3752 /// - "0" Do not plot the result of the fit. By default the fitted function
3753 /// is drawn unless the option"N" above is specified.
3754 /// - "+" Add this new fitted function to the list of fitted functions
3755 /// (by default, any previous function is deleted)
3756 /// - "C" In case of linear fitting, don't calculate the chisquare
3757 /// (saves time)
3758 /// - "F" If fitting a polN, switch to minuit fitter
3759 /// - "S" The result of the fit is returned in the TFitResultPtr
3760 /// (see below Access to the Fit Result)
3761 /// \param[in] goption specify a list of graphics options. See TH1::Draw for a complete list of these options.
3762 /// \param[in] xxmin range
3763 /// \param[in] xxmax range
3764 ///
3765 /// In order to use the Range option, one must first create a function
3766 /// with the expression to be fitted. For example, if your histogram
3767 /// has a defined range between -4 and 4 and you want to fit a gaussian
3768 /// only in the interval 1 to 3, you can do:
3769 ///
3770 /// ~~~ {.cpp}
3771 /// TF1 *f1 = new TF1("f1", "gaus", 1, 3);
3772 /// histo->Fit("f1", "R");
3773 /// ~~~
3774 ///
3775 /// ## Setting initial conditions
3776 /// Parameters must be initialized before invoking the Fit function.
3777 /// The setting of the parameter initial values is automatic for the
3778 /// predefined functions : poln, expo, gaus, landau. One can however disable
3779 /// this automatic computation by specifying the option "B".
3780 /// Note that if a predefined function is defined with an argument,
3781 /// eg, gaus(0), expo(1), you must specify the initial values for
3782 /// the parameters.
3783 /// You can specify boundary limits for some or all parameters via
3784 ///
3785 /// ~~~ {.cpp}
3786 /// f1->SetParLimits(p_number, parmin, parmax);
3787 /// ~~~
3788 ///
3789 /// if parmin>=parmax, the parameter is fixed
3790 /// Note that you are not forced to fix the limits for all parameters.
3791 /// For example, if you fit a function with 6 parameters, you can do:
3792 ///
3793 /// ~~~ {.cpp}
3794 /// func->SetParameters(0, 3.1, 1.e-6, -8, 0, 100);
3795 /// func->SetParLimits(3, -10, -4);
3796 /// func->FixParameter(4, 0);
3797 /// func->SetParLimits(5, 1, 1);
3798 /// ~~~
3799 ///
3800 /// With this setup, parameters 0->2 can vary freely
3801 /// Parameter 3 has boundaries [-10,-4] with initial value -8
3802 /// Parameter 4 is fixed to 0
3803 /// Parameter 5 is fixed to 100.
3804 /// When the lower limit and upper limit are equal, the parameter is fixed.
3805 /// However to fix a parameter to 0, one must call the FixParameter function.
3806 ///
3807 /// Note that option "I" gives better results but is slower.
3808 ///
3809 /// #### Changing the fitting objective function
3810 ///
3811 /// By default a chi square function is used for fitting. When option "L" (or "LL") is used
3812 /// a Poisson likelihood function (see note below) is used.
3813 /// The functions are defined in the header Fit/Chi2Func.h or Fit/PoissonLikelihoodFCN and they
3814 /// are implemented using the routines FitUtil::EvaluateChi2 or FitUtil::EvaluatePoissonLogL in
3815 /// the file math/mathcore/src/FitUtil.cxx.
3816 /// To specify a User defined fitting function, specify option "U" and
3817 /// call the following functions:
3818 ///
3819 /// ~~~ {.cpp}
3820 /// TVirtualFitter::Fitter(myhist)->SetFCN(MyFittingFunction)
3821 /// ~~~
3822 ///
3823 /// where MyFittingFunction is of type:
3824 ///
3825 /// ~~~ {.cpp}
3826 /// extern void MyFittingFunction(Int_t &npar, Double_t *gin, Double_t &f, Double_t *u, Int_t flag);
3827 /// ~~~
3828 ///
3829 /// #### Chi2 Fits
3830 ///
3831 /// By default a chi2 (least-square) fit is performed on the histogram. The so-called modified least-square method
3832 /// is used where the residual for each bin is computed using as error the observed value (the bin error)
3833 ///
3834 /// \f[
3835 /// Chi2 = \sum{ \left(y(i) - \frac{f(x(i) | p )}{e(i)} \right)^2 }
3836 /// \f]
3837 ///
3838 /// where y(i) is the bin content for each bin i, x(i) is the bin center and e(i) is the bin error (sqrt(y(i) for
3839 /// an un-weighted histogram. Bins with zero errors are excluded from the fit. See also later the note on the treatment of empty bins.
3840 /// When using option "I" the residual is computed not using the function value at the bin center, f (x(i) | p), but the integral
3841 /// of the function in the bin, Integral{ f(x|p)dx } divided by the bin volume
3842 ///
3843 /// #### Likelihood Fits
3844 ///
3845 /// When using option "L" a likelihood fit is used instead of the default chi2 square fit.
3846 /// The likelihood is built assuming a Poisson probability density function for each bin.
3847 /// The negative log-likelihood to be minimized is
3848 ///
3849 /// \f[
3850 /// NLL = \sum{ log Poisson ( y(i) | f(x(i) | p ) ) }
3851 /// \f]
3852 ///
3853 /// The exact likelihood used is the Poisson likelihood described in this paper:
3854 /// S. Baker and R. D. Cousins, “Clarification of the use of chi-square and likelihood functions in fits to histograms,”
3855 /// Nucl. Instrum. Meth. 221 (1984) 437.
3856 ///
3857 /// This method can then be used only when the bin content represents counts (i.e. errors are sqrt(N) ).
3858 /// The likelihood method has the advantage of treating correctly bins with low statistics. In case of high
3859 /// statistics/bin the distribution of the bin content becomes a normal distribution and the likelihood and chi2 fit
3860 /// give the same result.
3861 ///
3862 /// The likelihood method, although a bit slower, it is therefore the recommended method in case of low
3863 /// bin statistics, where the chi2 method may give incorrect results, in particular when there are
3864 /// several empty bins (see also below).
3865 /// In case of a weighted histogram, it is possible to perform a likelihood fit by using the
3866 /// option "WL". Note a weighted histogram is an histogram which has been filled with weights and it
3867 /// contains the sum of the weight square ( TH1::Sumw2() has been called). The bin error for a weighted
3868 /// histogram is the square root of the sum of the weight square.
3869 ///
3870 /// #### Treatment of Empty Bins
3871 ///
3872 /// Empty bins, which have the content equal to zero AND error equal to zero,
3873 /// are excluded by default from the chisquare fit, but they are considered in the likelihood fit.
3874 /// since they affect the likelihood if the function value in these bins is not negligible.
3875 /// When using option "WW" these bins will be considered in the chi2 fit with an error of 1.
3876 /// Note that if the histogram is having bins with zero content and non zero-errors they are considered as
3877 /// any other bins in the fit. Instead bins with zero error and non-zero content are excluded in the chi2 fit.
3878 /// A likelihood fit should also not be performed on such an histogram, since we are assuming a wrong pdf for each bin.
3879 /// In general, one should not fit an histogram with non-empty bins and zero errors, apart if all the bins have zero errors.
3880 /// In this case one could use the option "w", which gives a weight=1 for each bin (unweighted least-square fit).
3881 ///
3882 /// #### Fitting a histogram of dimension N with a function of dimension N-1
3883 ///
3884 /// It is possible to fit a TH2 with a TF1 or a TH3 with a TF2.
3885 /// In this case the option "Integral" is not allowed and each cell has
3886 /// equal weight.
3887 ///
3888 /// #### Associated functions
3889 ///
3890 /// One or more object (typically a TF1*) can be added to the list
3891 /// of functions (fFunctions) associated to each histogram.
3892 /// When TH1::Fit is invoked, the fitted function is added to this list.
3893 /// Given an histogram h, one can retrieve an associated function
3894 /// with:
3895 ///
3896 /// ~~~ {.cpp}
3897 /// TF1 *myfunc = h->GetFunction("myfunc");
3898 /// ~~~
3899 ///
3900 /// #### Access to the fit result
3901 ///
3902 /// The function returns a TFitResultPtr which can hold a pointer to a TFitResult object.
3903 /// By default the TFitResultPtr contains only the status of the fit which is return by an
3904 /// automatic conversion of the TFitResultPtr to an integer. One can write in this case directly:
3905 ///
3906 /// ~~~ {.cpp}
3907 /// Int_t fitStatus = h->Fit(myFunc)
3908 /// ~~~
3909 ///
3910 /// If the option "S" is instead used, TFitResultPtr contains the TFitResult and behaves as a smart
3911 /// pointer to it. For example one can do:
3912 ///
3913 /// ~~~ {.cpp}
3914 /// TFitResultPtr r = h->Fit(myFunc,"S");
3915 /// TMatrixDSym cov = r->GetCovarianceMatrix(); // to access the covariance matrix
3916 /// Double_t chi2 = r->Chi2(); // to retrieve the fit chi2
3917 /// Double_t par0 = r->Parameter(0); // retrieve the value for the parameter 0
3918 /// Double_t err0 = r->ParError(0); // retrieve the error for the parameter 0
3919 /// r->Print("V"); // print full information of fit including covariance matrix
3920 /// r->Write(); // store the result in a file
3921 /// ~~~
3922 ///
3923 /// The fit parameters, error and chi2 (but not covariance matrix) can be retrieved also
3924 /// from the fitted function.
3925 /// If the histogram is made persistent, the list of
3926 /// associated functions is also persistent. Given a pointer (see above)
3927 /// to an associated function myfunc, one can retrieve the function/fit
3928 /// parameters with calls such as:
3929 ///
3930 /// ~~~ {.cpp}
3931 /// Double_t chi2 = myfunc->GetChisquare();
3932 /// Double_t par0 = myfunc->GetParameter(0); //value of 1st parameter
3933 /// Double_t err0 = myfunc->GetParError(0); //error on first parameter
3934 /// ~~~
3935 ///
3936 /// #### Access to the fit status
3937 ///
3938 /// The status of the fit can be obtained converting the TFitResultPtr to an integer
3939 /// independently if the fit option "S" is used or not:
3940 ///
3941 /// ~~~ {.cpp}
3942 /// TFitResultPtr r = h->Fit(myFunc,opt);
3943 /// Int_t fitStatus = r;
3944 /// ~~~
3945 ///
3946 /// The fitStatus is 0 if the fit is OK (i.e no error occurred).
3947 /// The value of the fit status code is negative in case of an error not connected with the
3948 /// minimization procedure, for example when a wrong function is used.
3949 /// Otherwise the return value is the one returned from the minimization procedure.
3950 /// When TMinuit (default case) or Minuit2 are used as minimizer the status returned is :
3951 /// `fitStatus = migradResult + 10*minosResult + 100*hesseResult + 1000*improveResult`.
3952 /// TMinuit will return 0 (for migrad, minos, hesse or improve) in case of success and 4 in
3953 /// case of error (see the documentation of TMinuit::mnexcm). So for example, for an error
3954 /// only in Minos but not in Migrad a fitStatus of 40 will be returned.
3955 /// Minuit2 will return also 0 in case of success and different values in migrad minos or
3956 /// hesse depending on the error. See in this case the documentation of
3957 /// Minuit2Minimizer::Minimize for the migradResult, Minuit2Minimizer::GetMinosError for the
3958 /// minosResult and Minuit2Minimizer::Hesse for the hesseResult.
3959 /// If other minimizers are used see their specific documentation for the status code returned.
3960 /// For example in the case of Fumili, for the status returned see TFumili::Minimize.
3961 ///
3962 /// #### Excluding points
3963 ///
3964 /// Use TF1::RejectPoint inside your fitting function to exclude points
3965 /// within a certain range from the fit. Example:
3966 ///
3967 /// ~~~ {.cpp}
3968 /// Double_t fline(Double_t *x, Double_t *par)
3969 /// {
3970 /// if (x[0] > 2.5 && x[0] < 3.5) {
3971 /// TF1::RejectPoint();
3972 /// return 0;
3973 /// }
3974 /// return par[0] + par[1]*x[0];
3975 /// }
3976 ///
3977 /// void exclude() {
3978 /// TF1 *f1 = new TF1("f1", "[0] +[1]*x +gaus(2)", 0, 5);
3979 /// f1->SetParameters(6, -1,5, 3, 0.2);
3980 /// TH1F *h = new TH1F("h", "background + signal", 100, 0, 5);
3981 /// h->FillRandom("f1", 2000);
3982 /// TF1 *fline = new TF1("fline", fline, 0, 5, 2);
3983 /// fline->SetParameters(2, -1);
3984 /// h->Fit("fline", "l");
3985 /// }
3986 /// ~~~
3987 ///
3988 /// #### Warning when using the option "0"
3989 ///
3990 /// When selecting the option "0", the fitted function is added to
3991 /// the list of functions of the histogram, but it is not drawn.
3992 /// You can undo what you disabled in the following way:
3993 ///
3994 /// ~~~ {.cpp}
3995 /// h.Fit("myFunction", "0"); // fit, store function but do not draw
3996 /// h.Draw(); function is not drawn
3997 /// const Int_t kNotDraw = 1<<9;
3998 /// h.GetFunction("myFunction")->ResetBit(kNotDraw);
3999 /// h.Draw(); // function is visible again
4000 /// ~~~
4001 ///
4002 /// #### Access to the Minimizer information during fitting
4003 ///
4004 /// This function calls, the ROOT::Fit::FitObject function implemented in HFitImpl.cxx
4005 /// which uses the ROOT::Fit::Fitter class. The Fitter class creates the objective function
4006 /// (e.g. chi2 or likelihood) and uses an implementation of the Minimizer interface for minimizing
4007 /// the function.
4008 /// The default minimizer is Minuit (class TMinuitMinimizer which calls TMinuit).
4009 /// The default can be set in the resource file in etc/system.rootrc. For example
4010 ///
4011 /// ~~~ {.cpp}
4012 /// Root.Fitter: Minuit2
4013 /// ~~~
4014 ///
4015 /// A different fitter can also be set via ROOT::Math::MinimizerOptions::SetDefaultMinimizer
4016 /// (or TVirtualFitter::SetDefaultFitter).
4017 /// For example ROOT::Math::MinimizerOptions::SetDefaultMinimizer("GSLMultiMin","BFGS");
4018 /// will set the usage of the BFGS algorithm of the GSL multi-dimensional minimization
4019 /// (implemented in libMathMore). ROOT::Math::MinimizerOptions can be used also to set other
4020 /// default options, like maximum number of function calls, minimization tolerance or print
4021 /// level. See the documentation of this class.
4022 ///
4023 /// For fitting linear functions (containing the "++" sign" and polN functions,
4024 /// the linear fitter is automatically initialized.
4025 
4026 TFitResultPtr TH1::Fit(TF1 *f1 ,Option_t *option ,Option_t *goption, Double_t xxmin, Double_t xxmax)
4027 {
4028  // implementation of Fit method is in file hist/src/HFitImpl.cxx
4029  Foption_t fitOption;
4031 
4032  // create range and minimizer options with default values
4033  ROOT::Fit::DataRange range(xxmin,xxmax);
4034  ROOT::Math::MinimizerOptions minOption;
4035 
4036  // need to empty the buffer before
4037  // (t.b.d. do a ML unbinned fit with buffer data)
4038  if (fBuffer) BufferEmpty();
4039 
4040  return ROOT::Fit::FitObject(this, f1 , fitOption , minOption, goption, range);
4041 }
4042 
4043 ////////////////////////////////////////////////////////////////////////////////
4044 /// Display a panel with all histogram fit options.
4045 ///
4046 /// See class TFitPanel for example
4047 
4048 void TH1::FitPanel()
4049 {
4050  if (!gPad)
4051  gROOT->MakeDefCanvas();
4052 
4053  if (!gPad) {
4054  Error("FitPanel", "Unable to create a default canvas");
4055  return;
4056  }
4057 
4058 
4059  // use plugin manager to create instance of TFitEditor
4060  TPluginHandler *handler = gROOT->GetPluginManager()->FindHandler("TFitEditor");
4061  if (handler && handler->LoadPlugin() != -1) {
4062  if (handler->ExecPlugin(2, gPad, this) == 0)
4063  Error("FitPanel", "Unable to create the FitPanel");
4064  }
4065  else
4066  Error("FitPanel", "Unable to find the FitPanel plug-in");
4067 }
4068 
4069 ////////////////////////////////////////////////////////////////////////////////
4070 /// Return an histogram containing the asymmetry of this histogram with h2,
4071 /// where the asymmetry is defined as:
4072 ///
4073 /// ~~~ {.cpp}
4074 /// Asymmetry = (h1 - h2)/(h1 + h2) where h1 = this
4075 /// ~~~
4076 ///
4077 /// works for 1D, 2D, etc. histograms
4078 /// c2 is an optional argument that gives a relative weight between the two
4079 /// histograms, and dc2 is the error on this weight. This is useful, for example,
4080 /// when forming an asymmetry between two histograms from 2 different data sets that
4081 /// need to be normalized to each other in some way. The function calculates
4082 /// the errors assuming Poisson statistics on h1 and h2 (that is, dh = sqrt(h)).
4083 ///
4084 /// example: assuming 'h1' and 'h2' are already filled
4085 ///
4086 /// ~~~ {.cpp}
4087 /// h3 = h1->GetAsymmetry(h2)
4088 /// ~~~
4089 ///
4090 /// then 'h3' is created and filled with the asymmetry between 'h1' and 'h2';
4091 /// h1 and h2 are left intact.
4092 ///
4093 /// Note that it is the user's responsibility to manage the created histogram.
4094 /// The name of the returned histogram will be `Asymmetry_nameOfh1-nameOfh2`
4095 ///
4096 /// code proposed by Jason Seely (seely@mit.edu) and adapted by R.Brun
4097 ///
4098 /// clone the histograms so top and bottom will have the
4099 /// correct dimensions:
4100 /// Sumw2 just makes sure the errors will be computed properly
4101 /// when we form sums and ratios below.
4102 
4104 {
4105  TH1 *h1 = this;
4106  TString name = TString::Format("Asymmetry_%s-%s",h1->GetName(),h2->GetName() );
4107  TH1 *asym = (TH1*)Clone(name);
4108 
4109  // set also the title
4110  TString title = TString::Format("(%s - %s)/(%s+%s)",h1->GetName(),h2->GetName(),h1->GetName(),h2->GetName() );
4111  asym->SetTitle(title);
4112 
4113  asym->Sumw2();
4114  Bool_t addStatus = TH1::AddDirectoryStatus();
4116  TH1 *top = (TH1*)asym->Clone();
4117  TH1 *bottom = (TH1*)asym->Clone();
4118  TH1::AddDirectory(addStatus);
4119 
4120  // form the top and bottom of the asymmetry, and then divide:
4121  top->Add(h1,h2,1,-c2);
4122  bottom->Add(h1,h2,1,c2);
4123  asym->Divide(top,bottom);
4124 
4125  Int_t xmax = asym->GetNbinsX();
4126  Int_t ymax = asym->GetNbinsY();
4127  Int_t zmax = asym->GetNbinsZ();
4128 
4129  if (h1->fBuffer) h1->BufferEmpty(1);
4130  if (h2->fBuffer) h2->BufferEmpty(1);
4131  if (bottom->fBuffer) bottom->BufferEmpty(1);
4132 
4133  // now loop over bins to calculate the correct errors
4134  // the reason this error calculation looks complex is because of c2
4135  for(Int_t i=1; i<= xmax; i++){
4136  for(Int_t j=1; j<= ymax; j++){
4137  for(Int_t k=1; k<= zmax; k++){
4138  Int_t bin = GetBin(i, j, k);
4139  // here some bin contents are written into variables to make the error
4140  // calculation a little more legible:
4141  Double_t a = h1->RetrieveBinContent(bin);
4142  Double_t b = h2->RetrieveBinContent(bin);
4143  Double_t bot = bottom->RetrieveBinContent(bin);
4144 
4145  // make sure there are some events, if not, then the errors are set = 0
4146  // automatically.
4147  //if(bot < 1){} was changed to the next line from recommendation of Jason Seely (28 Nov 2005)
4148  if(bot < 1e-6){}
4149  else{
4150  // computation of errors by Christos Leonidopoulos
4151  Double_t dasq = h1->GetBinErrorSqUnchecked(bin);
4152  Double_t dbsq = h2->GetBinErrorSqUnchecked(bin);
4153  Double_t error = 2*TMath::Sqrt(a*a*c2*c2*dbsq + c2*c2*b*b*dasq+a*a*b*b*dc2*dc2)/(bot*bot);
4154  asym->SetBinError(i,j,k,error);
4155  }
4156  }
4157  }
4158  }
4159  delete top;
4160  delete bottom;
4161 
4162  return asym;
4163 }
4164 
4165 ////////////////////////////////////////////////////////////////////////////////
4166 /// Static function
4167 /// return the default buffer size for automatic histograms
4168 /// the parameter fgBufferSize may be changed via SetDefaultBufferSize
4169 
4171 {
4172  return fgBufferSize;
4173 }
4174 
4175 ////////////////////////////////////////////////////////////////////////////////
4176 /// Return kTRUE if TH1::Sumw2 must be called when creating new histograms.
4177 /// see TH1::SetDefaultSumw2.
4178 
4180 {
4181  return fgDefaultSumw2;
4182 }
4183 
4184 ////////////////////////////////////////////////////////////////////////////////
4185 /// Return the current number of entries.
4186 
4187 Double_t TH1::GetEntries() const
4188 {
4189  if (fBuffer) {
4190  Int_t nentries = (Int_t) fBuffer[0];
4191  if (nentries > 0) return nentries;
4192  }
4193 
4194  return fEntries;
4195 }
4196 
4197 ////////////////////////////////////////////////////////////////////////////////
4198 /// Number of effective entries of the histogram.
4199 ///
4200 /// \f[
4201 /// neff = \frac{(\sum Weights )^2}{(\sum Weight^2 )}
4202 /// \f]
4203 ///
4204 /// In case of an unweighted histogram this number is equivalent to the
4205 /// number of entries of the histogram.
4206 /// For a weighted histogram, this number corresponds to the hypothetical number of unweighted entries
4207 /// a histogram would need to have the same statistical power as this weighted histogram.
4208 /// Note: The underflow/overflow are included if one has set the TH1::StatOverFlows flag
4209 /// and if the statistics has been computed at filling time.
4210 /// If a range is set in the histogram the number is computed from the given range.
4211 
4213 {
4214  Stat_t s[kNstat];
4215  this->GetStats(s);// s[1] sum of squares of weights, s[0] sum of weights
4216  return (s[1] ? s[0]*s[0]/s[1] : TMath::Abs(s[0]) );
4217 }
4218 
4219 ////////////////////////////////////////////////////////////////////////////////
4220 /// Redefines TObject::GetObjectInfo.
4221 /// Displays the histogram info (bin number, contents, integral up to bin
4222 /// corresponding to cursor position px,py
4223 
4224 char *TH1::GetObjectInfo(Int_t px, Int_t py) const
4225 {
4226  return ((TH1*)this)->GetPainter()->GetObjectInfo(px,py);
4227 }
4228 
4229 ////////////////////////////////////////////////////////////////////////////////
4230 /// Return pointer to painter.
4231 /// If painter does not exist, it is created
4232 
4234 {
4235  if (!fPainter) {
4236  TString opt = option;
4237  opt.ToLower();
4238  if (opt.Contains("gl") || gStyle->GetCanvasPreferGL()) {
4239  //try to create TGLHistPainter
4240  TPluginHandler *handler = gROOT->GetPluginManager()->FindHandler("TGLHistPainter");
4241 
4242  if (handler && handler->LoadPlugin() != -1)
4243  fPainter = reinterpret_cast<TVirtualHistPainter *>(handler->ExecPlugin(1, this));
4244  }
4245  }
4246 
4248 
4249  return fPainter;
4250 }
4251 
4252 ////////////////////////////////////////////////////////////////////////////////
4253 /// Compute Quantiles for this histogram
4254 /// Quantile x_q of a probability distribution Function F is defined as
4255 ///
4256 /// ~~~ {.cpp}
4257 /// F(x_q) = q with 0 <= q <= 1.
4258 /// ~~~
4259 ///
4260 /// For instance the median x_0.5 of a distribution is defined as that value
4261 /// of the random variable for which the distribution function equals 0.5:
4262 ///
4263 /// ~~~ {.cpp}
4264 /// F(x_0.5) = Probability(x < x_0.5) = 0.5
4265 /// ~~~
4266 ///
4267 /// code from Eddy Offermann, Renaissance
4268 ///
4269 /// \param[in] nprobSum maximum size of array q and size of array probSum (if given)
4270 /// \param[in] probSum array of positions where quantiles will be computed.
4271 /// - if probSum is null, probSum will be computed internally and will
4272 /// have a size = number of bins + 1 in h. it will correspond to the
4273 /// quantiles calculated at the lowest edge of the histogram (quantile=0) and
4274 /// all the upper edges of the bins.
4275 /// - if probSum is not null, it is assumed to contain at least nprobSum values.
4276 /// \param[out] q array q filled with nq quantiles
4277 /// \return value nq (<=nprobSum) with the number of quantiles computed
4278 ///
4279 /// Note that the Integral of the histogram is automatically recomputed
4280 /// if the number of entries is different of the number of entries when
4281 /// the integral was computed last time. In case you do not use the Fill
4282 /// functions to fill your histogram, but SetBinContent, you must call
4283 /// TH1::ComputeIntegral before calling this function.
4284 ///
4285 /// Getting quantiles q from two histograms and storing results in a TGraph,
4286 /// a so-called QQ-plot
4287 ///
4288 /// ~~~ {.cpp}
4289 /// TGraph *gr = new TGraph(nprob);
4290 /// h1->GetQuantiles(nprob,gr->GetX());
4291 /// h2->GetQuantiles(nprob,gr->GetY());
4292 /// gr->Draw("alp");
4293 /// ~~~
4294 ///
4295 /// Example:
4296 ///
4297 /// ~~~ {.cpp}
4298 /// void quantiles() {
4299 /// // demo for quantiles
4300 /// const Int_t nq = 20;
4301 /// TH1F *h = new TH1F("h","demo quantiles",100,-3,3);
4302 /// h->FillRandom("gaus",5000);
4303 ///
4304 /// Double_t xq[nq]; // position where to compute the quantiles in [0,1]
4305 /// Double_t yq[nq]; // array to contain the quantiles
4306 /// for (Int_t i=0;i<nq;i++) xq[i] = Float_t(i+1)/nq;
4307 /// h->GetQuantiles(nq,yq,xq);
4308 ///
4309 /// //show the original histogram in the top pad
4310 /// TCanvas *c1 = new TCanvas("c1","demo quantiles",10,10,700,900);
4311 /// c1->Divide(1,2);
4312 /// c1->cd(1);
4313 /// h->Draw();
4314 ///
4315 /// // show the quantiles in the bottom pad
4316 /// c1->cd(2);
4317 /// gPad->SetGrid();
4318 /// TGraph *gr = new TGraph(nq,xq,yq);
4319 /// gr->SetMarkerStyle(21);
4320 /// gr->Draw("alp");
4321 /// }
4322 /// ~~~
4323 
4324 Int_t TH1::GetQuantiles(Int_t nprobSum, Double_t *q, const Double_t *probSum)
4325 {
4326  if (GetDimension() > 1) {
4327  Error("GetQuantiles","Only available for 1-d histograms");
4328  return 0;
4329  }
4330 
4331  const Int_t nbins = GetXaxis()->GetNbins();
4332  if (!fIntegral) ComputeIntegral();
4333  if (fIntegral[nbins+1] != fEntries) ComputeIntegral();
4334 
4335  Int_t i, ibin;
4336  Double_t *prob = (Double_t*)probSum;
4337  Int_t nq = nprobSum;
4338  if (probSum == 0) {
4339  nq = nbins+1;
4340  prob = new Double_t[nq];
4341  prob[0] = 0;
4342  for (i=1;i<nq;i++) {
4343  prob[i] = fIntegral[i]/fIntegral[nbins];
4344  }
4345  }
4346 
4347  for (i = 0; i < nq; i++) {
4348  ibin = TMath::BinarySearch(nbins,fIntegral,prob[i]);
4349  while (ibin < nbins-1 && fIntegral[ibin+1] == prob[i]) {
4350  if (fIntegral[ibin+2] == prob[i]) ibin++;
4351  else break;
4352  }
4353  q[i] = GetBinLowEdge(ibin+1);
4354  const Double_t dint = fIntegral[ibin+1]-fIntegral[ibin];
4355  if (dint > 0) q[i] += GetBinWidth(ibin+1)*(prob[i]-fIntegral[ibin])/dint;
4356  }
4357 
4358  if (!probSum) delete [] prob;
4359  return nq;
4360 }
4361 
4362 ////////////////////////////////////////////////////////////////////////////////
4363 /// Decode string choptin and fill fitOption structure.
4364 
4365 Int_t TH1::FitOptionsMake(Option_t *choptin, Foption_t &fitOption)
4366 {
4368  return 1;
4369 }
4370 
4371 ////////////////////////////////////////////////////////////////////////////////
4372 /// Compute Initial values of parameters for a gaussian.
4373 
4374 void H1InitGaus()
4375 {
4376  Double_t allcha, sumx, sumx2, x, val, stddev, mean;
4377  Int_t bin;
4378  const Double_t sqrtpi = 2.506628;
4379 
4380  // - Compute mean value and StdDev of the histogram in the given range
4382  TH1 *curHist = (TH1*)hFitter->GetObjectFit();
4383  Int_t hxfirst = hFitter->GetXfirst();
4384  Int_t hxlast = hFitter->GetXlast();
4385  Double_t valmax = curHist->GetBinContent(hxfirst);
4386  Double_t binwidx = curHist->GetBinWidth(hxfirst);
4387  allcha = sumx = sumx2 = 0;
4388  for (bin=hxfirst;bin<=hxlast;bin++) {
4389  x = curHist->GetBinCenter(bin);
4390  val = TMath::Abs(curHist->GetBinContent(bin));
4391  if (val > valmax) valmax = val;
4392  sumx += val*x;
4393  sumx2 += val*x*x;
4394  allcha += val;
4395  }
4396  if (allcha == 0) return;
4397  mean = sumx/allcha;
4398  stddev = sumx2/allcha - mean*mean;
4399  if (stddev > 0) stddev = TMath::Sqrt(stddev);
4400  else stddev = 0;
4401  if (stddev == 0) stddev = binwidx*(hxlast-hxfirst+1)/4;
4402  //if the distribution is really gaussian, the best approximation
4403  //is binwidx*allcha/(sqrtpi*stddev)
4404  //However, in case of non-gaussian tails, this underestimates
4405  //the normalisation constant. In this case the maximum value
4406  //is a better approximation.
4407  //We take the average of both quantities
4408  Double_t constant = 0.5*(valmax+binwidx*allcha/(sqrtpi*stddev));
4409 
4410  //In case the mean value is outside the histo limits and
4411  //the StdDev is bigger than the range, we take
4412  // mean = center of bins
4413  // stddev = half range
4414  Double_t xmin = curHist->GetXaxis()->GetXmin();
4415  Double_t xmax = curHist->GetXaxis()->GetXmax();
4416  if ((mean < xmin || mean > xmax) && stddev > (xmax-xmin)) {
4417  mean = 0.5*(xmax+xmin);
4418  stddev = 0.5*(xmax-xmin);
4419  }
4420  TF1 *f1 = (TF1*)hFitter->GetUserFunc();
4421  f1->SetParameter(0,constant);
4422  f1->SetParameter(1,mean);
4423  f1->SetParameter(2,stddev);
4424  f1->SetParLimits(2,0,10*stddev);
4425 }
4426 
4427 ////////////////////////////////////////////////////////////////////////////////
4428 /// Compute Initial values of parameters for an exponential.
4429 
4430 void H1InitExpo()
4431 {
4432  Double_t constant, slope;
4433  Int_t ifail;
4435  Int_t hxfirst = hFitter->GetXfirst();
4436  Int_t hxlast = hFitter->GetXlast();
4437  Int_t nchanx = hxlast - hxfirst + 1;
4438 
4439  H1LeastSquareLinearFit(-nchanx, constant, slope, ifail);
4440 
4441  TF1 *f1 = (TF1*)hFitter->GetUserFunc();
4442  f1->SetParameter(0,constant);
4443  f1->SetParameter(1,slope);
4444 
4445 }
4446 
4447 ////////////////////////////////////////////////////////////////////////////////
4448 /// Compute Initial values of parameters for a polynom.
4449 
4450 void H1InitPolynom()
4451 {
4452  Double_t fitpar[25];
4453 
4455  TF1 *f1 = (TF1*)hFitter->GetUserFunc();
4456  Int_t hxfirst = hFitter->GetXfirst();
4457  Int_t hxlast = hFitter->GetXlast();
4458  Int_t nchanx = hxlast - hxfirst + 1;
4459  Int_t npar = f1->GetNpar();
4460 
4461  if (nchanx <=1 || npar == 1) {
4462  TH1 *curHist = (TH1*)hFitter->GetObjectFit();
4463  fitpar[0] = curHist->GetSumOfWeights()/Double_t(nchanx);
4464  } else {
4465  H1LeastSquareFit( nchanx, npar, fitpar);
4466  }
4467  for (Int_t i=0;i<npar;i++) f1->SetParameter(i, fitpar[i]);
4468 }
4469 
4470 ////////////////////////////////////////////////////////////////////////////////
4471 /// Least squares lpolynomial fitting without weights.
4472 ///
4473 /// \param[in] n number of points to fit
4474 /// \param[in] m number of parameters
4475 /// \param[in] a array of parameters
4476 ///
4477 /// based on CERNLIB routine LSQ: Translated to C++ by Rene Brun
4478 /// (E.Keil. revised by B.Schorr, 23.10.1981.)
4479 
4481 {
4482  const Double_t zero = 0.;
4483  const Double_t one = 1.;
4484  const Int_t idim = 20;
4485 
4486  Double_t b[400] /* was [20][20] */;
4487  Int_t i, k, l, ifail;
4488  Double_t power;
4489  Double_t da[20], xk, yk;
4490 
4491  if (m <= 2) {
4492  H1LeastSquareLinearFit(n, a[0], a[1], ifail);
4493  return;
4494  }
4495  if (m > idim || m > n) return;
4496  b[0] = Double_t(n);
4497  da[0] = zero;
4498  for (l = 2; l <= m; ++l) {
4499  b[l-1] = zero;
4500  b[m + l*20 - 21] = zero;
4501  da[l-1] = zero;
4502  }
4504  TH1 *curHist = (TH1*)hFitter->GetObjectFit();
4505  Int_t hxfirst = hFitter->GetXfirst();
4506  Int_t hxlast = hFitter->GetXlast();
4507  for (k = hxfirst; k <= hxlast; ++k) {
4508  xk = curHist->GetBinCenter(k);
4509  yk = curHist->GetBinContent(k);
4510  power = one;
4511  da[0] += yk;
4512  for (l = 2; l <= m; ++l) {
4513  power *= xk;
4514  b[l-1] += power;
4515  da[l-1] += power*yk;
4516  }
4517  for (l = 2; l <= m; ++l) {
4518  power *= xk;
4519  b[m + l*20 - 21] += power;
4520  }
4521  }
4522  for (i = 3; i <= m; ++i) {
4523  for (k = i; k <= m; ++k) {
4524  b[k - 1 + (i-1)*20 - 21] = b[k + (i-2)*20 - 21];
4525  }
4526  }
4527  H1LeastSquareSeqnd(m, b, idim, ifail, 1, da);
4528 
4529  for (i=0; i<m; ++i) a[i] = da[i];
4530 
4531 }
4532 
4533 ////////////////////////////////////////////////////////////////////////////////
4534 /// Least square linear fit without weights.
4535 ///
4536 /// extracted from CERNLIB LLSQ: Translated to C++ by Rene Brun
4537 /// (added to LSQ by B. Schorr, 15.02.1982.)
4538 
4539 void H1LeastSquareLinearFit(Int_t ndata, Double_t &a0, Double_t &a1, Int_t &ifail)
4540 {
4541  Double_t xbar, ybar, x2bar;
4542  Int_t i, n;
4543  Double_t xybar;
4544  Double_t fn, xk, yk;
4545  Double_t det;
4546 
4547  n = TMath::Abs(ndata);
4548  ifail = -2;
4549  xbar = ybar = x2bar = xybar = 0;
4551  TH1 *curHist = (TH1*)hFitter->GetObjectFit();
4552  Int_t hxfirst = hFitter->GetXfirst();
4553  Int_t hxlast = hFitter->GetXlast();
4554  for (i = hxfirst; i <= hxlast; ++i) {
4555  xk = curHist->GetBinCenter(i);
4556  yk = curHist->GetBinContent(i);
4557  if (ndata < 0) {
4558  if (yk <= 0) yk = 1e-9;
4559  yk = TMath::Log(yk);
4560  }
4561  xbar += xk;
4562  ybar += yk;
4563  x2bar += xk*xk;
4564  xybar += xk*yk;
4565  }
4566  fn = Double_t(n);
4567  det = fn*x2bar - xbar*xbar;
4568  ifail = -1;
4569  if (det <= 0) {
4570  a0 = ybar/fn;
4571  a1 = 0;
4572  return;
4573  }
4574  ifail = 0;
4575  a0 = (x2bar*ybar - xbar*xybar) / det;
4576  a1 = (fn*xybar - xbar*ybar) / det;
4577 
4578 }
4579 
4580 ////////////////////////////////////////////////////////////////////////////////
4581 /// Extracted from CERN Program library routine DSEQN.
4582 ///
4583 /// Translated to C++ by Rene Brun
4584 
4585 void H1LeastSquareSeqnd(Int_t n, Double_t *a, Int_t idim, Int_t &ifail, Int_t k, Double_t *b)
4586 {
4587  Int_t a_dim1, a_offset, b_dim1, b_offset;
4588  Int_t nmjp1, i, j, l;
4589  Int_t im1, jp1, nm1, nmi;
4590  Double_t s1, s21, s22;
4591  const Double_t one = 1.;
4592 
4593  /* Parameter adjustments */
4594  b_dim1 = idim;
4595  b_offset = b_dim1 + 1;
4596  b -= b_offset;
4597  a_dim1 = idim;
4598  a_offset = a_dim1 + 1;
4599  a -= a_offset;
4600 
4601  if (idim < n) return;
4602 
4603  ifail = 0;
4604  for (j = 1; j <= n; ++j) {
4605  if (a[j + j*a_dim1] <= 0) { ifail = -1; return; }
4606  a[j + j*a_dim1] = one / a[j + j*a_dim1];
4607  if (j == n) continue;
4608  jp1 = j + 1;
4609  for (l = jp1; l <= n; ++l) {
4610  a[j + l*a_dim1] = a[j + j*a_dim1] * a[l + j*a_dim1];
4611  s1 = -a[l + (j+1)*a_dim1];
4612  for (i = 1; i <= j; ++i) { s1 = a[l + i*a_dim1] * a[i + (j+1)*a_dim1] + s1; }
4613  a[l + (j+1)*a_dim1] = -s1;
4614  }
4615  }
4616  if (k <= 0) return;
4617 
4618  for (l = 1; l <= k; ++l) {
4619  b[l*b_dim1 + 1] = a[a_dim1 + 1]*b[l*b_dim1 + 1];
4620  }
4621  if (n == 1) return;
4622  for (l = 1; l <= k; ++l) {
4623  for (i = 2; i <= n; ++i) {
4624  im1 = i - 1;
4625  s21 = -b[i + l*b_dim1];
4626  for (j = 1; j <= im1; ++j) {
4627  s21 = a[i + j*a_dim1]*b[j + l*b_dim1] + s21;
4628  }
4629  b[i + l*b_dim1] = -a[i + i*a_dim1]*s21;
4630  }
4631  nm1 = n - 1;
4632  for (i = 1; i <= nm1; ++i) {
4633  nmi = n - i;
4634  s22 = -b[nmi + l*b_dim1];
4635  for (j = 1; j <= i; ++j) {
4636  nmjp1 = n - j + 1;
4637  s22 = a[nmi + nmjp1*a_dim1]*b[nmjp1 + l*b_dim1] + s22;
4638  }
4639  b[nmi + l*b_dim1] = -s22;
4640  }
4641  }
4642 }
4643 
4644 ////////////////////////////////////////////////////////////////////////////////
4645 /// Return Global bin number corresponding to binx,y,z.
4646 ///
4647 /// 2-D and 3-D histograms are represented with a one dimensional
4648 /// structure.
4649 /// This has the advantage that all existing functions, such as
4650 /// GetBinContent, GetBinError, GetBinFunction work for all dimensions.
4651 ///
4652 /// In case of a TH1x, returns binx directly.
4653 /// see TH1::GetBinXYZ for the inverse transformation.
4654 ///
4655 /// Convention for numbering bins
4656 ///
4657 /// For all histogram types: nbins, xlow, xup
4658 ///
4659 /// - bin = 0; underflow bin
4660 /// - bin = 1; first bin with low-edge xlow INCLUDED
4661 /// - bin = nbins; last bin with upper-edge xup EXCLUDED
4662 /// - bin = nbins+1; overflow bin
4663 ///
4664 /// In case of 2-D or 3-D histograms, a "global bin" number is defined.
4665 /// For example, assuming a 3-D histogram with binx,biny,binz, the function
4666 ///
4667 /// ~~~ {.cpp}
4668 /// Int_t bin = h->GetBin(binx,biny,binz);
4669 /// ~~~
4670 ///
4671 /// returns a global/linearized bin number. This global bin is useful
4672 /// to access the bin information independently of the dimension.
4673 
4674 Int_t TH1::GetBin(Int_t binx, Int_t, Int_t) const
4675 {
4676  Int_t ofx = fXaxis.GetNbins() + 1; // overflow bin
4677  if (binx < 0) binx = 0;
4678  if (binx > ofx) binx = ofx;
4679 
4680  return binx;
4681 }
4682 
4683 ////////////////////////////////////////////////////////////////////////////////
4684 /// Return binx, biny, binz corresponding to the global bin number globalbin
4685 /// see TH1::GetBin function above
4686 
4687 void TH1::GetBinXYZ(Int_t binglobal, Int_t &binx, Int_t &biny, Int_t &binz) const
4688 {
4689  Int_t nx = fXaxis.GetNbins()+2;
4690  Int_t ny = fYaxis.GetNbins()+2;
4691 
4692  if (GetDimension() == 1) {
4693  binx = binglobal%nx;
4694  biny = 0;
4695  binz = 0;
4696  return;
4697  }
4698  if (GetDimension() == 2) {
4699  binx = binglobal%nx;
4700  biny = ((binglobal-binx)/nx)%ny;
4701  binz = 0;
4702  return;
4703  }
4704  if (GetDimension() == 3) {
4705  binx = binglobal%nx;
4706  biny = ((binglobal-binx)/nx)%ny;
4707  binz = ((binglobal-binx)/nx -biny)/ny;
4708  }
4709 }
4710 
4711 ////////////////////////////////////////////////////////////////////////////////
4712 /// Return a random number distributed according the histogram bin contents.
4713 /// This function checks if the bins integral exists. If not, the integral
4714 /// is evaluated, normalized to one.
4715 ///
4716 /// The integral is automatically recomputed if the number of entries
4717 /// is not the same then when the integral was computed.
4718 /// NB Only valid for 1-d histograms. Use GetRandom2 or 3 otherwise.
4719 /// If the histogram has a bin with negative content a NaN is returned
4720 
4721 Double_t TH1::GetRandom() const
4722 {
4723  if (fDimension > 1) {
4724  Error("GetRandom","Function only valid for 1-d histograms");
4725  return 0;
4726  }
4727  Int_t nbinsx = GetNbinsX();
4728  Double_t integral = 0;
4729  // compute integral checking that all bins have positive content (see ROOT-5894)
4730  if (fIntegral) {
4731  if (fIntegral[nbinsx+1] != fEntries) integral = ((TH1*)this)->ComputeIntegral(true);
4732  else integral = fIntegral[nbinsx];
4733  } else {
4734  integral = ((TH1*)this)->ComputeIntegral(true);
4735  }
4736  if (integral == 0) return 0;
4737  // return a NaN in case some bins have negative content
4738  if (integral == TMath::QuietNaN() ) return TMath::QuietNaN();
4739 
4740  Double_t r1 = gRandom->Rndm();
4741  Int_t ibin = TMath::BinarySearch(nbinsx,fIntegral,r1);
4742  Double_t x = GetBinLowEdge(ibin+1);
4743  if (r1 > fIntegral[ibin]) x +=
4744  GetBinWidth(ibin+1)*(r1-fIntegral[ibin])/(fIntegral[ibin+1] - fIntegral[ibin]);
4745  return x;
4746 }
4747 
4748 ////////////////////////////////////////////////////////////////////////////////
4749 /// Return content of bin number bin.
4750 ///
4751 /// Implemented in TH1C,S,F,D
4752 ///
4753 /// Convention for numbering bins
4754 ///
4755 /// For all histogram types: nbins, xlow, xup
4756 ///
4757 /// - bin = 0; underflow bin
4758 /// - bin = 1; first bin with low-edge xlow INCLUDED
4759 /// - bin = nbins; last bin with upper-edge xup EXCLUDED
4760 /// - bin = nbins+1; overflow bin
4761 ///
4762 /// In case of 2-D or 3-D histograms, a "global bin" number is defined.
4763 /// For example, assuming a 3-D histogram with binx,biny,binz, the function
4764 ///
4765 /// ~~~ {.cpp}
4766 /// Int_t bin = h->GetBin(binx,biny,binz);
4767 /// ~~~
4768 ///
4769 /// returns a global/linearized bin number. This global bin is useful
4770 /// to access the bin information independently of the dimension.
4771 
4773 {
4774  if (fBuffer) const_cast<TH1*>(this)->BufferEmpty();
4775  if (bin < 0) bin = 0;
4776  if (bin >= fNcells) bin = fNcells-1;
4777 
4778  return RetrieveBinContent(bin);
4779 }
4780 
4781 ////////////////////////////////////////////////////////////////////////////////
4782 /// Compute first binx in the range [firstx,lastx] for which
4783 /// diff = abs(bin_content-c) <= maxdiff
4784 ///
4785 /// In case several bins in the specified range with diff=0 are found
4786 /// the first bin found is returned in binx.
4787 /// In case several bins in the specified range satisfy diff <=maxdiff
4788 /// the bin with the smallest difference is returned in binx.
4789 /// In all cases the function returns the smallest difference.
4790 ///
4791 /// NOTE1: if firstx <= 0, firstx is set to bin 1
4792 /// if (lastx < firstx then firstx is set to the number of bins
4793 /// ie if firstx=0 and lastx=0 (default) the search is on all bins.
4794 ///
4795 /// NOTE2: if maxdiff=0 (default), the first bin with content=c is returned.
4796 
4797 Double_t TH1::GetBinWithContent(Double_t c, Int_t &binx, Int_t firstx, Int_t lastx,Double_t maxdiff) const
4798 {
4799  if (fDimension > 1) {
4800  binx = 0;
4801  Error("GetBinWithContent","function is only valid for 1-D histograms");
4802  return 0;
4803  }
4804 
4805  if (fBuffer) ((TH1*)this)->BufferEmpty();
4806 
4807  if (firstx <= 0) firstx = 1;
4808  if (lastx < firstx) lastx = fXaxis.GetNbins();
4809  Int_t binminx = 0;
4810  Double_t diff, curmax = 1.e240;
4811  for (Int_t i=firstx;i<=lastx;i++) {
4812  diff = TMath::Abs(RetrieveBinContent(i)-c);
4813  if (diff <= 0) {binx = i; return diff;}
4814  if (diff < curmax && diff <= maxdiff) {curmax = diff, binminx=i;}
4815  }
4816  binx = binminx;
4817  return curmax;
4818 }
4819 
4820 ////////////////////////////////////////////////////////////////////////////////
4821 /// Given a point x, approximates the value via linear interpolation
4822 /// based on the two nearest bin centers
4823 ///
4824 /// Andy Mastbaum 10/21/08
4825 
4827 {
4828  if (fBuffer) ((TH1*)this)->BufferEmpty();
4829 
4830  Int_t xbin = FindBin(x);
4831  Double_t x0,x1,y0,y1;
4832 
4833  if(x<=GetBinCenter(1)) {
4834  return RetrieveBinContent(1);
4835  } else if(x>=GetBinCenter(GetNbinsX())) {
4836  return RetrieveBinContent(GetNbinsX());
4837  } else {
4838  if(x<=GetBinCenter(xbin)) {
4839  y0 = RetrieveBinContent(xbin-1);
4840  x0 = GetBinCenter(xbin-1);
4841  y1 = RetrieveBinContent(xbin);
4842  x1 = GetBinCenter(xbin);
4843  } else {
4844  y0 = RetrieveBinContent(xbin);
4845  x0 = GetBinCenter(xbin);
4846  y1 = RetrieveBinContent(xbin+1);
4847  x1 = GetBinCenter(xbin+1);
4848  }
4849  return y0 + (x-x0)*((y1-y0)/(x1-x0));
4850  }
4851 }
4852 
4853 ////////////////////////////////////////////////////////////////////////////////
4854 /// Interpolate. Not yet implemented.
4855 
4857 {
4858  Error("Interpolate","This function must be called with 1 argument for a TH1");
4859  return 0;
4860 }
4861 
4862 ////////////////////////////////////////////////////////////////////////////////
4863 /// Interpolate. Not yet implemented.
4864 
4866 {
4867  Error("Interpolate","This function must be called with 1 argument for a TH1");
4868  return 0;
4869 }
4870 
4871 ///////////////////////////////////////////////////////////////////////////////
4872 /// Check if an histogram is empty
4873 /// (this a protected method used mainly by TH1Merger )
4874 
4875 Bool_t TH1::IsEmpty() const
4876 {
4877  // if fTsumw or fentries are not zero histogram is not empty
4878  // need to use GetEntries() instead of fEntries in case of bugger histograms
4879  // so we will flash the buffer
4880  if (fTsumw != 0) return kFALSE;
4881  if (GetEntries() != 0) return kFALSE;
4882  // case fTSumw == 0 amd entries are also zero
4883  // this should not really happening, but if one sets content by hand
4884  // it can happen. a call to ResetStats() should be done in such cases
4885  double sumw = 0;
4886  for (int i = 0; i< GetNcells(); ++i) sumw += RetrieveBinContent(i);
4887  return (sumw != 0) ? kFALSE : kTRUE;
4888 }
4889 
4890 ////////////////////////////////////////////////////////////////////////////////
4891 /// Return true if the bin is overflow.
4892 
4893 Bool_t TH1::IsBinOverflow(Int_t bin, Int_t iaxis) const
4894 {
4895  Int_t binx, biny, binz;
4896  GetBinXYZ(bin, binx, biny, binz);
4897 
4898  if (iaxis == 0) {
4899  if ( fDimension == 1 )
4900  return binx >= GetNbinsX() + 1;
4901  if ( fDimension == 2 )
4902  return (binx >= GetNbinsX() + 1) ||
4903  (biny >= GetNbinsY() + 1);
4904  if ( fDimension == 3 )
4905  return (binx >= GetNbinsX() + 1) ||
4906  (biny >= GetNbinsY() + 1) ||
4907  (binz >= GetNbinsZ() + 1);
4908  return kFALSE;
4909  }
4910  if (iaxis == 1)
4911  return binx >= GetNbinsX() + 1;
4912  if (iaxis == 2)
4913  return biny >= GetNbinsY() + 1;
4914  if (iaxis == 3)
4915  return binz >= GetNbinsZ() + 1;
4916 
4917  Error("IsBinOverflow","Invalid axis value");
4918  return kFALSE;
4919 }
4920 
4921 ////////////////////////////////////////////////////////////////////////////////
4922 /// Return true if the bin is underflow.
4923 /// If iaxis = 0 make OR with all axes otherwise check only for the given axis
4924 
4925 Bool_t TH1::IsBinUnderflow(Int_t bin, Int_t iaxis) const
4926 {
4927  Int_t binx, biny, binz;
4928  GetBinXYZ(bin, binx, biny, binz);
4929 
4930  if (iaxis == 0) {
4931  if ( fDimension == 1 )
4932  return (binx <= 0);
4933  else if ( fDimension == 2 )
4934  return (binx <= 0 || biny <= 0);
4935  else if ( fDimension == 3 )
4936  return (binx <= 0 || biny <= 0 || binz <= 0);
4937  else
4938  return kFALSE;
4939  }
4940  if (iaxis == 1)
4941  return (binx <= 0);
4942  if (iaxis == 2)
4943  return (biny <= 0);
4944  if (iaxis == 3)
4945  return (binz <= 0);
4946 
4947  Error("IsBinUnderflow","Invalid axis value");
4948  return kFALSE;
4949 }
4950 
4951 ////////////////////////////////////////////////////////////////////////////////
4952 /// Reduce the number of bins for the axis passed in the option to the number of bins having a label.
4953 /// The method will remove only the extra bins existing after the last "labeled" bin.
4954 /// Note that if there are "un-labeled" bins present between "labeled" bins they will not be removed
4955 
4956 void TH1::LabelsDeflate(Option_t *ax)
4957 {
4958  Int_t iaxis = AxisChoice(ax);
4959  TAxis *axis = 0;
4960  if (iaxis == 1) axis = GetXaxis();
4961  if (iaxis == 2) axis = GetYaxis();
4962  if (iaxis == 3) axis = GetZaxis();
4963  if (!axis) {
4964  Error("LabelsDeflate","Invalid axis option %s",ax);
4965  return;
4966  }
4967  if (!axis->GetLabels()) return;
4968 
4969  // find bin with last labels
4970  // bin number is object ID in list of labels
4971  // therefore max bin number is number of bins of the deflated histograms
4972  TIter next(axis->GetLabels());
4973  TObject *obj;
4974  Int_t nbins = 0;
4975  while ((obj = next())) {
4976  Int_t ibin = obj->GetUniqueID();
4977  if (ibin > nbins) nbins = ibin;
4978  }
4979  if (nbins < 1) nbins = 1;
4980 
4981  // Do nothing in case it was the last bin
4982  if (nbins==axis->GetNbins()) return;
4983 
4984  TH1 *hold = (TH1*)IsA()->New();
4985  R__ASSERT(hold);
4986  hold->SetDirectory(0);
4987  Copy(*hold);
4988 
4989  Bool_t timedisp = axis->GetTimeDisplay();
4990  Double_t xmin = axis->GetXmin();
4991  Double_t xmax = axis->GetBinUpEdge(nbins);
4992  if (xmax <= xmin) xmax = xmin +nbins;
4993  axis->SetRange(0,0);
4994  axis->Set(nbins,xmin,xmax);
4995  SetBinsLength(-1); // reset the number of cells
4996  Int_t errors = fSumw2.fN;
4997  if (errors) fSumw2.Set(fNcells);
4998  axis->SetTimeDisplay(timedisp);
4999  // reset histogram content
5000  Reset("ICE");
5001 
5002  //now loop on all bins and refill
5003  // NOTE that if the bins without labels have content
5004  // it will be put in the underflow/overflow.
5005  // For this reason we use AddBinContent method
5006  Double_t oldEntries = fEntries;
5007  Int_t bin,binx,biny,binz;
5008  for (bin=0; bin < hold->fNcells; ++bin) {
5009  hold->GetBinXYZ(bin,binx,biny,binz);
5010  Int_t ibin = GetBin(binx,biny,binz);
5011  Double_t cu = hold->RetrieveBinContent(bin);
5012  AddBinContent(ibin,cu);
5013  if (errors) {
5014  fSumw2.fArray[ibin] += hold->fSumw2.fArray[bin];
5015  }
5016  }
5017  fEntries = oldEntries;
5018  delete hold;
5019 }
5020 
5021 ////////////////////////////////////////////////////////////////////////////////
5022 /// Double the number of bins for axis.
5023 /// Refill histogram
5024 /// This function is called by TAxis::FindBin(const char *label)
5025 
5026 void TH1::LabelsInflate(Option_t *ax)
5027 {
5028  Int_t iaxis = AxisChoice(ax);
5029  TAxis *axis = 0;
5030  if (iaxis == 1) axis = GetXaxis();
5031  if (iaxis == 2) axis = GetYaxis();
5032  if (iaxis == 3) axis = GetZaxis();
5033  if (!axis) return;
5034 
5035  TH1 *hold = (TH1*)IsA()->New();;
5036  hold->SetDirectory(0);
5037  Copy(*hold);
5038 
5039  Bool_t timedisp = axis->GetTimeDisplay();
5040  Int_t nbins = axis->GetNbins();
5041  Double_t xmin = axis->GetXmin();
5042  Double_t xmax = axis->GetXmax();
5043  xmax = xmin + 2*(xmax-xmin);
5044  axis->SetRange(0,0);
5045  // double the bins and recompute ncells
5046  axis->Set(2*nbins,xmin,xmax);
5047  SetBinsLength(-1);
5048  Int_t errors = fSumw2.fN;
5049  if (errors) fSumw2.Set(fNcells);
5050  axis->SetTimeDisplay(timedisp);
5051 
5052  Reset("ICE"); // reset content and error
5053 
5054  //now loop on all bins and refill
5055  Double_t oldEntries = fEntries;
5056  Int_t bin,ibin,binx,biny,binz;
5057  for (ibin =0; ibin < hold->fNcells; ibin++) {
5058  // get the binx,y,z values . The x-y-z (axis) bin values will stay the same between new-old after the expanding
5059  hold->GetBinXYZ(ibin,binx,biny,binz);
5060  bin = GetBin(binx,biny,binz);
5061 
5062  // underflow and overflow will be cleaned up because their meaning has been altered
5063  if (hold->IsBinUnderflow(ibin,iaxis) || hold->IsBinOverflow(ibin,iaxis)) {
5064  continue;
5065  }
5066  else {
5067  AddBinContent(bin, hold->RetrieveBinContent(ibin));
5068  if (errors) fSumw2.fArray[bin] += hold->fSumw2.fArray[ibin];
5069  }
5070  }
5071  fEntries = oldEntries;
5072  delete hold;
5073 }
5074 
5075 ////////////////////////////////////////////////////////////////////////////////
5076 /// Set option(s) to draw axis with labels
5077 /// \param[in] option
5078 /// - "a" sort by alphabetic order
5079 /// - ">" sort by decreasing values
5080 /// - "<" sort by increasing values
5081 /// - "h" draw labels horizontal
5082 /// - "v" draw labels vertical
5083 /// - "u" draw labels up (end of label right adjusted)
5084 /// - "d" draw labels down (start of label left adjusted)
5085 /// \param[in] ax axis
5086 
5087 void TH1::LabelsOption(Option_t *option, Option_t *ax)
5088 {
5089  Int_t iaxis = AxisChoice(ax);
5090  TAxis *axis = 0;
5091  if (iaxis == 1) axis = GetXaxis();
5092  if (iaxis == 2) axis = GetYaxis();
5093  if (iaxis == 3) axis = GetZaxis();
5094  if (!axis) return;
5095  THashList *labels = axis->GetLabels();
5096  if (!labels) {
5097  Warning("LabelsOption","Cannot sort. No labels");
5098  return;
5099  }
5100  TString opt = option;
5101  opt.ToLower();
5102  if (opt.Contains("h")) {
5103  axis->SetBit(TAxis::kLabelsHori);
5106  axis->ResetBit(TAxis::kLabelsUp);
5107  }
5108  if (opt.Contains("v")) {
5109  axis->SetBit(TAxis::kLabelsVert);
5112  axis->ResetBit(TAxis::kLabelsUp);
5113  }
5114  if (opt.Contains("u")) {
5115  axis->SetBit(TAxis::kLabelsUp);
5119  }
5120  if (opt.Contains("d")) {
5121  axis->SetBit(TAxis::kLabelsDown);
5124  axis->ResetBit(TAxis::kLabelsUp);
5125  }
5126  Int_t sort = -1;
5127  if (opt.Contains("a")) sort = 0;
5128  if (opt.Contains(">")) sort = 1;
5129  if (opt.Contains("<")) sort = 2;
5130  if (sort < 0) return;
5131  if (sort > 0 && GetDimension() > 2) {
5132  Error("LabelsOption","Sorting by value not implemented for 3-D histograms");
5133  return;
5134  }
5135 
5136  Double_t entries = fEntries;
5137  Int_t n = TMath::Min(axis->GetNbins(), labels->GetSize());
5138  std::vector<Int_t> a(n+2);
5139 
5140  Int_t i,j,k;
5141  std::vector<Double_t> cont;
5142  std::vector<Double_t> errors;
5143  THashList *labold = new THashList(labels->GetSize(),1);
5144  TIter nextold(labels);
5145  TObject *obj;
5146  while ((obj=nextold())) {
5147  labold->Add(obj);
5148  }
5149  labels->Clear();
5150  if (sort > 0) {
5151  //---sort by values of bins
5152  if (GetDimension() == 1) {
5153  cont.resize(n);
5154  if (fSumw2.fN) errors.resize(n);
5155  for (i=1;i<=n;i++) {
5156  cont[i-1] = GetBinContent(i);
5157  if (!errors.empty()) errors[i-1] = GetBinError(i);
5158  }
5159  if (sort ==1) TMath::Sort(n,cont.data(),a.data(),kTRUE); //sort by decreasing values
5160  else TMath::Sort(n,cont.data(),a.data(),kFALSE); //sort by increasing values
5161  for (i=1;i<=n;i++) {
5162  SetBinContent(i,cont[a[i-1]]);
5163  if (!errors.empty()) SetBinError(i,errors[a[i-1]]);
5164  }
5165  for (i=1;i<=n;i++) {
5166  obj = labold->At(a[i-1]);
5167  labels->Add(obj);
5168  obj->SetUniqueID(i);
5169  }
5170  } else if (GetDimension()== 2) {
5171  std::vector<Double_t> pcont(n+2);
5172  Int_t nx = fXaxis.GetNbins();
5173  Int_t ny = fYaxis.GetNbins();
5174  cont.resize( (nx+2)*(ny+2));
5175  if (fSumw2.fN) errors.resize( (nx+2)*(ny+2));
5176  for (i=1;i<=nx;i++) {
5177  for (j=1;j<=ny;j++) {
5178  cont[i+nx*j] = GetBinContent(i,j);
5179  if (!errors.empty()) errors[i+nx*j] = GetBinError(i,j);
5180  if (axis == GetXaxis()) k = i;
5181  else k = j;
5182  pcont[k-1] += cont[i+nx*j];
5183  }
5184  }
5185  if (sort ==1) TMath::Sort(n,pcont.data(),a.data(),kTRUE); //sort by decreasing values
5186  else TMath::Sort(n,pcont.data(),a.data(),kFALSE); //sort by increasing values
5187  for (i=0;i<n;i++) {
5188  obj = labold->At(a[i]);
5189  labels->Add(obj);
5190  obj->SetUniqueID(i+1);
5191  }
5192  if (axis == GetXaxis()) {
5193  for (i=1;i<=n;i++) {
5194  for (j=1;j<=ny;j++) {
5195  SetBinContent(i,j,cont[a[i-1]+1+nx*j]);
5196  if (!errors.empty()) SetBinError(i,j,errors[a[i-1]+1+nx*j]);
5197  }
5198  }
5199  }
5200  else {
5201  // using y axis
5202  for (i=1;i<=nx;i++) {
5203  for (j=1;j<=n;j++) {
5204  SetBinContent(i,j,cont[i+nx*(a[j-1]+1)]);
5205  if (!errors.empty()) SetBinError(i,j,errors[i+nx*(a[j-1]+1)]);
5206  }
5207  }
5208  }
5209  } else {
5210  //to be implemented for 3d
5211  }
5212  } else {
5213  //---alphabetic sort
5214  const UInt_t kUsed = 1<<18;
5215  TObject *objk=0;
5216  a[0] = 0;
5217  a[n+1] = n+1;
5218  for (i=1;i<=n;i++) {
5219  const char *label = "zzzzzzzzzzzz";
5220  for (j=1;j<=n;j++) {
5221  obj = labold->At(j-1);
5222  if (!obj) continue;
5223  if (obj->TestBit(kUsed)) continue;
5224  //use strcasecmp for case non-sensitive sort (may be an option)
5225  if (strcmp(label,obj->GetName()) < 0) continue;
5226  objk = obj;
5227  a[i] = j;
5228  label = obj->GetName();
5229  }
5230  if (objk) {
5231  objk->SetUniqueID(i);
5232  labels->Add(objk);
5233  objk->SetBit(kUsed);
5234  }
5235  }
5236  for (i=1;i<=n;i++) {
5237  obj = labels->At(i-1);
5238  if (!obj) continue;
5239  obj->ResetBit(kUsed);
5240  }
5241 
5242  if (GetDimension() == 1) {
5243  cont.resize(n+2);
5244  if (fSumw2.fN) errors.resize(n+2);
5245  for (i=1;i<=n;i++) {
5246  cont[i] = GetBinContent(a[i]);
5247  if (!errors.empty()) errors[i] = GetBinError(a[i]);
5248  }
5249  for (i=1;i<=n;i++) {
5250  SetBinContent(i,cont[i]);
5251  if (!errors.empty()) SetBinError(i,errors[i]);
5252  }
5253  } else if (GetDimension()== 2) {
5254  Int_t nx = fXaxis.GetNbins()+2;
5255  Int_t ny = fYaxis.GetNbins()+2;
5256  cont.resize(nx*ny);
5257  if (fSumw2.fN) errors.resize(nx*ny);
5258  for (i=0;i<nx;i++) {
5259  for (j=0;j<ny;j++) {
5260  cont[i+nx*j] = GetBinContent(i,j);
5261  if (!errors.empty()) errors[i+nx*j] = GetBinError(i,j);
5262  }
5263  }
5264  if (axis == GetXaxis()) {
5265  for (i=1;i<=n;i++) {
5266  for (j=0;j<ny;j++) {
5267  SetBinContent(i,j,cont[a[i]+nx*j]);
5268  if (!errors.empty()) SetBinError(i,j,errors[a[i]+nx*j]);
5269  }
5270  }
5271  } else {
5272  for (i=0;i<nx;i++) {
5273  for (j=1;j<=n;j++) {
5274  SetBinContent(i,j,cont[i+nx*a[j]]);
5275  if (!errors.empty()) SetBinError(i,j,errors[i+nx*a[j]]);
5276  }
5277  }
5278  }
5279  } else {
5280  Int_t nx = fXaxis.GetNbins()+2;
5281  Int_t ny = fYaxis.GetNbins()+2;
5282  Int_t nz = fZaxis.GetNbins()+2;
5283  cont.resize(nx*ny*nz);
5284  if (fSumw2.fN) errors.resize(nx*ny*nz);
5285  for (i=0;i<nx;i++) {
5286  for (j=0;j<ny;j++) {
5287  for (k=0;k<nz;k++) {
5288  cont[i+nx*(j+ny*k)] = GetBinContent(i,j,k);
5289  if (!errors.empty()) errors[i+nx*(j+ny*k)] = GetBinError(i,j,k);
5290  }
5291  }
5292  }
5293  if (axis == GetXaxis()) {
5294  // labels on x axis
5295  for (i=1;i<=n;i++) {
5296  for (j=0;j<ny;j++) {
5297  for (k=0;k<nz;k++) {
5298  SetBinContent(i,j,k,cont[a[i]+nx*(j+ny*k)]);
5299  if (!errors.empty()) SetBinError(i,j,k,errors[a[i]+nx*(j+ny*k)]);
5300  }
5301  }
5302  }
5303  }
5304  else if (axis == GetYaxis()) {
5305  // labels on y axis
5306  for (i=0;i<nx;i++) {
5307  for (j=1;j<=n;j++) {
5308  for (k=0;k<nz;k++) {
5309  SetBinContent(i,j,k,cont[i+nx*(a[j]+ny*k)]);
5310  if (!errors.empty()) SetBinError(i,j,k,errors[i+nx*(a[j]+ny*k)]);
5311  }
5312  }
5313  }
5314  }
5315  else {
5316  // labels on z axis
5317  for (i=0;i<nx;i++) {
5318  for (j=0;j<ny;j++) {
5319  for (k=1;k<=n;k++) {
5320  SetBinContent(i,j,k,cont[i+nx*(j+ny*a[k])]);
5321  if (!errors.empty()) SetBinError(i,j,k,errors[i+nx*(j+ny*a[k])]);
5322  }
5323  }
5324  }
5325  }
5326  }
5327  }
5328  fEntries = entries;
5329  delete labold;
5330 }
5331 
5332 ////////////////////////////////////////////////////////////////////////////////
5333 /// Test if two double are almost equal.
5334 
5335 static inline Bool_t AlmostEqual(Double_t a, Double_t b, Double_t epsilon = 0.00000001)
5336 {
5337  return TMath::Abs(a - b) < epsilon;
5338 }
5339 
5340 ////////////////////////////////////////////////////////////////////////////////
5341 /// Test if a double is almost an integer.
5342 
5343 static inline Bool_t AlmostInteger(Double_t a, Double_t epsilon = 0.00000001)
5344 {
5345  return AlmostEqual(a - TMath::Floor(a), 0, epsilon) ||
5346  AlmostEqual(a - TMath::Floor(a), 1, epsilon);
5347 }
5348 
5349 ////////////////////////////////////////////////////////////////////////////////
5350 /// Test if the binning is equidistant.
5351 
5352 static inline bool IsEquidistantBinning(const TAxis& axis)
5353 {
5354  // check if axis bin are equals
5355  if (!axis.GetXbins()->fN) return true; //
5356  // not able to check if there is only one axis entry
5357  bool isEquidistant = true;
5358  const Double_t firstBinWidth = axis.GetBinWidth(1);
5359  for (int i = 1; i < axis.GetNbins(); ++i) {
5360  const Double_t binWidth = axis.GetBinWidth(i);
5361  const bool match = TMath::AreEqualRel(firstBinWidth, binWidth, TMath::Limits<Double_t>::Epsilon());
5362  isEquidistant &= match;
5363  if (!match)
5364  break;
5365  }
5366  return isEquidistant;
5367 }
5368 
5369 ////////////////////////////////////////////////////////////////////////////////
5370 /// Same limits and bins.
5371 
5372 Bool_t TH1::SameLimitsAndNBins(const TAxis& axis1, const TAxis& axis2)
5373 {
5374  return axis1.GetNbins() == axis2.GetNbins()
5375  && axis1.GetXmin() == axis2.GetXmin()
5376  && axis1.GetXmax() == axis2.GetXmax();
5377 }
5378 
5379 ////////////////////////////////////////////////////////////////////////////////
5380 /// Finds new limits for the axis for the Merge function.
5381 /// returns false if the limits are incompatible
5382 
5383 Bool_t TH1::RecomputeAxisLimits(TAxis& destAxis, const TAxis& anAxis)
5384 {
5385  if (SameLimitsAndNBins(destAxis, anAxis))
5386  return kTRUE;
5387 
5388  if (!IsEquidistantBinning(destAxis) || !IsEquidistantBinning(anAxis))
5389  return kFALSE; // not equidistant user binning not supported
5390 
5391  Double_t width1 = destAxis.GetBinWidth(0);
5392  Double_t width2 = anAxis.GetBinWidth(0);
5393  if (width1 == 0 || width2 == 0)
5394  return kFALSE; // no binning not supported
5395 
5396  Double_t xmin = TMath::Min(destAxis.GetXmin(), anAxis.GetXmin());
5397  Double_t xmax = TMath::Max(destAxis.GetXmax(), anAxis.GetXmax());
5398  Double_t width = TMath::Max(width1, width2);
5399 
5400  // check the bin size
5401  if (!AlmostInteger(width/width1) || !AlmostInteger(width/width2))
5402  return kFALSE;
5403 
5404  // std::cout << "Find new limit using given axis " << anAxis.GetXmin() << " , " << anAxis.GetXmax() << " bin width " << width2 << std::endl;
5405  // std::cout << " and destination axis " << destAxis.GetXmin() << " , " << destAxis.GetXmax() << " bin width " << width1 << std::endl;
5406 
5407 
5408  // check the limits
5409  Double_t delta;
5410  delta = (destAxis.GetXmin() - xmin)/width1;
5411  if (!AlmostInteger(delta))
5412  xmin -= (TMath::Ceil(delta) - delta)*width1;
5413 
5414  delta = (anAxis.GetXmin() - xmin)/width2;
5415  if (!AlmostInteger(delta))
5416  xmin -= (TMath::Ceil(delta) - delta)*width2;
5417 
5418 
5419  delta = (destAxis.GetXmin() - xmin)/width1;
5420  if (!AlmostInteger(delta))
5421  return kFALSE;
5422 
5423 
5424  delta = (xmax - destAxis.GetXmax())/width1;
5425  if (!AlmostInteger(delta))
5426  xmax += (TMath::Ceil(delta) - delta)*width1;
5427 
5428 
5429  delta = (xmax - anAxis.GetXmax())/width2;
5430  if (!AlmostInteger(delta))
5431  xmax += (TMath::Ceil(delta) - delta)*width2;
5432 
5433 
5434  delta = (xmax - destAxis.GetXmax())/width1;
5435  if (!AlmostInteger(delta))
5436  return kFALSE;
5437 #ifdef DEBUG
5438  if (!AlmostInteger((xmax - xmin) / width)) { // unnecessary check
5439  printf("TH1::RecomputeAxisLimits - Impossible\n");
5440  return kFALSE;
5441  }
5442 #endif
5443 
5444 
5445  destAxis.Set(TMath::Nint((xmax - xmin)/width), xmin, xmax);
5446 
5447  //std::cout << "New re-computed axis : [ " << xmin << " , " << xmax << " ] width = " << width << " nbins " << destAxis.GetNbins() << std::endl;
5448 
5449  return kTRUE;
5450 }
5451 
5452 ////////////////////////////////////////////////////////////////////////////////
5453 /// Add all histograms in the collection to this histogram.
5454 /// This function computes the min/max for the x axis,
5455 /// compute a new number of bins, if necessary,
5456 /// add bin contents, errors and statistics.
5457 /// If all histograms have bin labels, bins with identical labels
5458 /// will be merged, no matter what their order is.
5459 /// If overflows are present and limits are different the function will fail.
5460 /// The function returns the total number of entries in the result histogram
5461 /// if the merge is successful, -1 otherwise.
5462 ///
5463 /// IMPORTANT remark. The axis x may have different number
5464 /// of bins and different limits, BUT the largest bin width must be
5465 /// a multiple of the smallest bin width and the upper limit must also
5466 /// be a multiple of the bin width.
5467 /// Example:
5468 ///
5469 /// ~~~ {.cpp}
5470 /// void atest() {
5471 /// TH1F *h1 = new TH1F("h1","h1",110,-110,0);
5472 /// TH1F *h2 = new TH1F("h2","h2",220,0,110);
5473 /// TH1F *h3 = new TH1F("h3","h3",330,-55,55);
5474 /// TRandom r;
5475 /// for (Int_t i=0;i<10000;i++) {
5476 /// h1->Fill(r.Gaus(-55,10));
5477 /// h2->Fill(r.Gaus(55,10));
5478 /// h3->Fill(r.Gaus(0,10));
5479 /// }
5480 ///
5481 /// TList *list = new TList;
5482 /// list->Add(h1);
5483 /// list->Add(h2);
5484 /// list->Add(h3);
5485 /// TH1F *h = (TH1F*)h1->Clone("h");
5486 /// h->Reset();
5487 /// h->Merge(list);
5488 /// h->Draw();
5489 /// }
5490 /// ~~~
5491 
5493 {
5494  if (!li) return 0;
5495  if (li->IsEmpty()) return (Long64_t) GetEntries();
5496 
5497  // use TH1Merger class
5498  TH1Merger merger(*this,*li);
5499  Bool_t ret = merger();
5500 
5501  return (ret) ? GetEntries() : -1;
5502 }
5503 
5504 
5505 ////////////////////////////////////////////////////////////////////////////////
5506 /// Performs the operation:
5507 ///
5508 /// `this = this*c1*f1`
5509 ///
5510 /// If errors are defined (see TH1::Sumw2), errors are also recalculated.
5511 ///
5512 /// Only bins inside the function range are recomputed.
5513 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
5514 /// you should call Sumw2 before making this operation.
5515 /// This is particularly important if you fit the histogram after TH1::Multiply
5516 ///
5517 /// The function return kFALSE if the Multiply operation failed
5518 
5520 {
5521  if (!f1) {
5522  Error("Multiply","Attempt to multiply by a non-existing function");
5523  return kFALSE;
5524  }
5525 
5526  // delete buffer if it is there since it will become invalid
5527  if (fBuffer) BufferEmpty(1);
5528 
5529  Int_t nx = GetNbinsX() + 2; // normal bins + uf / of (cells)
5530  Int_t ny = GetNbinsY() + 2;
5531  Int_t nz = GetNbinsZ() + 2;
5532  if (fDimension < 2) ny = 1;
5533  if (fDimension < 3) nz = 1;
5534 
5535  // reset min-maximum
5536  SetMinimum();
5537  SetMaximum();
5538 
5539  // - Loop on bins (including underflows/overflows)
5540  Double_t xx[3];
5541  Double_t *params = 0;
5542  f1->InitArgs(xx,params);
5543 
5544  for (Int_t binz = 0; binz < nz; ++binz) {
5545  xx[2] = fZaxis.GetBinCenter(binz);
5546  for (Int_t biny = 0; biny < ny; ++biny) {
5547  xx[1] = fYaxis.GetBinCenter(biny);
5548  for (Int_t binx = 0; binx < nx; ++binx) {
5549  xx[0] = fXaxis.GetBinCenter(binx);
5550  if (!f1->IsInside(xx)) continue;
5552  Int_t bin = binx + nx * (biny + ny *binz);
5553  Double_t cu = c1*f1->EvalPar(xx);
5554  if (TF1::RejectedPoint()) continue;
5555  UpdateBinContent(bin, RetrieveBinContent(bin) * cu);
5556  if (fSumw2.fN) {
5557  fSumw2.fArray[bin] = cu * cu * GetBinErrorSqUnchecked(bin);
5558  }
5559  }
5560  }
5561  }
5562  ResetStats();
5563  return kTRUE;
5564 }
5565 
5566 ////////////////////////////////////////////////////////////////////////////////
5567 /// Multiply this histogram by h1.
5568 ///
5569 /// `this = this*h1`
5570 ///
5571 /// If errors of this are available (TH1::Sumw2), errors are recalculated.
5572 /// Note that if h1 has Sumw2 set, Sumw2 is automatically called for this
5573 /// if not already set.
5574 ///
5575 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
5576 /// you should call Sumw2 before making this operation.
5577 /// This is particularly important if you fit the histogram after TH1::Multiply
5578 ///
5579 /// The function return kFALSE if the Multiply operation failed
5580 
5581 Bool_t TH1::Multiply(const TH1 *h1)
5582 {
5583  if (!h1) {
5584  Error("Multiply","Attempt to multiply by a non-existing histogram");
5585  return kFALSE;
5586  }
5587 
5588  // delete buffer if it is there since it will become invalid
5589  if (fBuffer) BufferEmpty(1);
5590 
5591  try {
5592  CheckConsistency(this,h1);
5593  } catch(DifferentNumberOfBins&) {
5594  Error("Multiply","Attempt to multiply histograms with different number of bins");
5595  return kFALSE;
5596  } catch(DifferentAxisLimits&) {
5597  Warning("Multiply","Attempt to multiply histograms with different axis limits");
5598  } catch(DifferentBinLimits&) {
5599  Warning("Multiply","Attempt to multiply histograms with different bin limits");
5600  } catch(DifferentLabels&) {
5601  Warning("Multiply","Attempt to multiply histograms with different labels");
5602  }
5603 
5604  // Create Sumw2 if h1 has Sumw2 set
5605  if (fSumw2.fN == 0 && h1->GetSumw2N() != 0) Sumw2();
5606 
5607  // - Reset min- maximum
5608  SetMinimum();
5609  SetMaximum();
5610 
5611  // - Loop on bins (including underflows/overflows)
5612  for (Int_t i = 0; i < fNcells; ++i) {
5613  Double_t c0 = RetrieveBinContent(i);
5614  Double_t c1 = h1->RetrieveBinContent(i);
5615  UpdateBinContent(i, c0 * c1);
5616  if (fSumw2.fN) {
5617  fSumw2.fArray[i] = GetBinErrorSqUnchecked(i) * c1 * c1 + h1->GetBinErrorSqUnchecked(i) * c0 * c0;
5618  }
5619  }
5620  ResetStats();
5621  return kTRUE;
5622 }
5623 
5624 ////////////////////////////////////////////////////////////////////////////////
5625 /// Replace contents of this histogram by multiplication of h1 by h2.
5626 ///
5627 /// `this = (c1*h1)*(c2*h2)`
5628 ///
5629 /// If errors of this are available (TH1::Sumw2), errors are recalculated.
5630 /// Note that if h1 or h2 have Sumw2 set, Sumw2 is automatically called for this
5631 /// if not already set.
5632 ///
5633 /// IMPORTANT NOTE: If you intend to use the errors of this histogram later
5634 /// you should call Sumw2 before making this operation.
5635 /// This is particularly important if you fit the histogram after TH1::Multiply
5636 ///
5637 /// The function return kFALSE if the Multiply operation failed
5638 
5639 Bool_t TH1::Multiply(const TH1 *h1, const TH1 *h2, Double_t c1, Double_t c2, Option_t *option)
5640 {
5641  TString opt = option;
5642  opt.ToLower();
5643  // Bool_t binomial = kFALSE;
5644  // if (opt.Contains("b")) binomial = kTRUE;
5645  if (!h1 || !h2) {
5646  Error("Multiply","Attempt to multiply by a non-existing histogram");
5647  return kFALSE;
5648  }
5649 
5650  // delete buffer if it is there since it will become invalid
5651  if (fBuffer) BufferEmpty(1);
5652 
5653  try {
5654  CheckConsistency(h1,h2);
5655  CheckConsistency(this,h1);
5656  } catch(DifferentNumberOfBins&) {
5657  Error("Multiply","Attempt to multiply histograms with different number of bins");
5658  return kFALSE;
5659  } catch(DifferentAxisLimits&) {
5660  Warning("Multiply","Attempt to multiply histograms with different axis limits");
5661  } catch(DifferentBinLimits&) {
5662  Warning("Multiply","Attempt to multiply histograms with different bin limits");
5663  } catch(DifferentLabels&) {
5664  Warning("Multiply","Attempt to multiply histograms with different labels");
5665  }
5666 
5667  // Create Sumw2 if h1 or h2 have Sumw2 set
5668  if (fSumw2.fN == 0 && (h1->GetSumw2N() != 0 || h2->GetSumw2N() != 0)) Sumw2();
5669 
5670  // - Reset min - maximum
5671  SetMinimum();
5672  SetMaximum();
5673 
5674  // - Loop on bins (including underflows/overflows)
5675  Double_t c1sq = c1 * c1; Double_t c2sq = c2 * c2;
5676  for (Int_t i = 0; i < fNcells; ++i) {
5677  Double_t b1 = h1->RetrieveBinContent(i);
5678  Double_t b2 = h2->RetrieveBinContent(i);
5679  UpdateBinContent(i, c1 * b1 * c2 * b2);
5680  if (fSumw2.fN) {
5681  fSumw2.fArray[i] = c1sq * c2sq * (h1->GetBinErrorSqUnchecked(i) * b2 * b2 + h2->GetBinErrorSqUnchecked(i) * b1 * b1);
5682  }
5683  }
5684  ResetStats();
5685  return kTRUE;
5686 }
5687 
5688 ////////////////////////////////////////////////////////////////////////////////
5689 /// Control routine to paint any kind of histograms.
5690 ///
5691 /// This function is automatically called by TCanvas::Update.
5692 /// (see TH1::Draw for the list of options)
5693 
5694 void TH1::Paint(Option_t *option)
5695 {
5696  GetPainter(option);
5697 
5698  if (fPainter) {
5699  if (strlen(option) > 0) fPainter->Paint(option);
5700  else fPainter->Paint(fOption.Data());
5701  }
5702 }
5703 
5704 ////////////////////////////////////////////////////////////////////////////////
5705 /// Rebin this histogram
5706 ///
5707 /// #### case 1 xbins=0
5708 ///
5709 /// If newname is blank (default), the current histogram is modified and
5710 /// a pointer to it is returned.
5711 ///
5712 /// If newname is not blank, the current histogram is not modified, and a
5713 /// new histogram is returned which is a Clone of the current histogram
5714 /// with its name set to newname.
5715 ///
5716 /// The parameter ngroup indicates how many bins of this have to be merged
5717 /// into one bin of the result.
5718 ///
5719 /// If the original histogram has errors stored (via Sumw2), the resulting
5720 /// histograms has new errors correctly calculated.
5721 ///
5722 /// examples: if h1 is an existing TH1F histogram with 100 bins
5723 ///
5724 /// ~~~ {.cpp}
5725 /// h1->Rebin(); //merges two bins in one in h1: previous contents of h1 are lost
5726 /// h1->Rebin(5); //merges five bins in one in h1
5727 /// TH1F *hnew = dynamic_cast<TH1F*>(h1->Rebin(5,"hnew")); // creates a new histogram hnew
5728 /// // merging 5 bins of h1 in one bin
5729 /// ~~~
5730 ///
5731 /// NOTE: If ngroup is not an exact divider of the number of bins,
5732 /// the top limit of the rebinned histogram is reduced
5733 /// to the upper edge of the last bin that can make a complete
5734 /// group. The remaining bins are added to the overflow bin.
5735 /// Statistics will be recomputed from the new bin contents.
5736 ///
5737 /// #### case 2 xbins!=0
5738 ///
5739 /// A new histogram is created (you should specify newname).
5740 /// The parameter ngroup is the number of variable size bins in the created histogram.
5741 /// The array xbins must contain ngroup+1 elements that represent the low-edges
5742 /// of the bins.
5743 /// If the original histogram has errors stored (via Sumw2), the resulting
5744 /// histograms has new errors correctly calculated.
5745 ///
5746 /// NOTE: The bin edges specified in xbins should correspond to bin edges
5747 /// in the original histogram. If a bin edge in the new histogram is
5748 /// in the middle of a bin in the original histogram, all entries in
5749 /// the split bin in the original histogram will be transfered to the
5750 /// lower of the two possible bins in the new histogram. This is
5751 /// probably not what you want. A warning message is emitted in this
5752 /// case
5753 ///
5754 /// examples: if h1 is an existing TH1F histogram with 100 bins
5755 ///
5756 /// ~~~ {.cpp}
5757 /// Double_t xbins[25] = {...} array of low-edges (xbins[25] is the upper edge of last bin
5758 /// h1->Rebin(24,"hnew",xbins); //creates a new variable bin size histogram hnew
5759 /// ~~~
5760 
5761 TH1 *TH1::Rebin(Int_t ngroup, const char*newname, const Double_t *xbins)
5762 {
5763  Int_t nbins = fXaxis.GetNbins();
5766  if ((ngroup <= 0) || (ngroup > nbins)) {
5767  Error("Rebin", "Illegal value of ngroup=%d",ngroup);
5768  return 0;
5769  }
5770 
5771  if (fDimension > 1 || InheritsFrom(TProfile::Class())) {
5772  Error("Rebin", "Operation valid on 1-D histograms only");
5773  return 0;
5774  }
5775  if (!newname && xbins) {
5776  Error("Rebin","if xbins is specified, newname must be given");
5777  return 0;
5778  }
5779 
5780  Int_t newbins = nbins/ngroup;
5781  if (!xbins) {
5782  Int_t nbg = nbins/ngroup;
5783  if (nbg*ngroup != nbins) {
5784  Warning("Rebin", "ngroup=%d is not an exact divider of nbins=%d.",ngroup,nbins);
5785  }
5786  }
5787  else {
5788  // in the case that xbins is given (rebinning in variable bins), ngroup is
5789  // the new number of bins and number of grouped bins is not constant.
5790  // when looping for setting the contents for the new histogram we
5791  // need to loop on all bins of original histogram. Then set ngroup=nbins
5792  newbins = ngroup;
5793  ngroup = nbins;
5794  }
5795 
5796  // Save old bin contents into a new array
5797  Double_t entries = fEntries;
5798  Double_t *oldBins = new Double_t[nbins+2];
5799  Int_t bin, i;
5800  for (bin=0;bin<nbins+2;bin++) oldBins[bin] = RetrieveBinContent(bin);
5801  Double_t *oldErrors = 0;
5802  if (fSumw2.fN != 0) {
5803  oldErrors = new Double_t[nbins+2];
5804  for (bin=0;bin<nbins+2;bin++) oldErrors[bin] = GetBinError(bin);
5805  }
5806  // rebin will not include underflow/overflow if new axis range is larger than old axis range
5807  if (xbins) {
5808  if (xbins[0] < fXaxis.GetXmin() && oldBins[0] != 0 )
5809  Warning("Rebin","underflow entries will not be used when rebinning");
5810  if (xbins[newbins] > fXaxis.GetXmax() && oldBins[nbins+1] != 0 )
5811  Warning("Rebin","overflow entries will not be used when rebinning");
5812  }
5813 
5814 
5815  // create a clone of the old histogram if newname is specified
5816  TH1 *hnew = this;
5817  if ((newname && strlen(newname) > 0) || xbins) {
5818  hnew = (TH1*)Clone(newname);
5819  }
5820 
5821  //reset can extend bit to avoid an axis extension in SetBinContent
5822  UInt_t oldExtendBitMask = hnew->SetCanExtend(kNoAxis);
5823 
5824  // save original statistics
5825  Double_t stat[kNstat];
5826  GetStats(stat);
5827  bool resetStat = false;
5828  // change axis specs and rebuild bin contents array::RebinAx
5829  if(!xbins && (newbins*ngroup != nbins)) {
5830  xmax = fXaxis.GetBinUpEdge(newbins*ngroup);
5831  resetStat = true; //stats must be reset because top bins will be moved to overflow bin
5832  }
5833  // save the TAttAxis members (reset by SetBins)
5834  Int_t nDivisions = fXaxis.GetNdivisions();
5835  Color_t axisColor = fXaxis.GetAxisColor();
5836  Color_t labelColor = fXaxis.GetLabelColor();
5837  Style_t labelFont = fXaxis.GetLabelFont();
5838  Float_t labelOffset = fXaxis.GetLabelOffset();
5839  Float_t labelSize = fXaxis.GetLabelSize();
5840  Float_t tickLength = fXaxis.GetTickLength();
5841  Float_t titleOffset = fXaxis.GetTitleOffset();
5842  Float_t titleSize = fXaxis.GetTitleSize();
5843  Color_t titleColor = fXaxis.GetTitleColor();
5844  Style_t titleFont = fXaxis.GetTitleFont();
5845 
5846  if(!xbins && (fXaxis.GetXbins()->GetSize() > 0)){ // variable bin sizes
5847  Double_t *bins = new Double_t[newbins+1];
5848  for(i = 0; i <= newbins; ++i) bins[i] = fXaxis.GetBinLowEdge(1+i*ngroup);
5849  hnew->SetBins(newbins,bins); //this also changes errors array (if any)
5850  delete [] bins;
5851  } else if (xbins) {
5852  hnew->SetBins(newbins,xbins);
5853  } else {
5854  hnew->SetBins(newbins,xmin,xmax);
5855  }
5856 
5857  // Restore axis attributes
5858  fXaxis.SetNdivisions(nDivisions);
5859  fXaxis.SetAxisColor(axisColor);
5860  fXaxis.SetLabelColor(labelColor);
5861  fXaxis.SetLabelFont(labelFont);
5862  fXaxis.SetLabelOffset(labelOffset);
5863  fXaxis.SetLabelSize(labelSize);
5864  fXaxis.SetTickLength(tickLength);
5865  fXaxis.SetTitleOffset(titleOffset);
5866  fXaxis.SetTitleSize(titleSize);
5867  fXaxis.SetTitleColor(titleColor);
5868  fXaxis.SetTitleFont(titleFont);
5869 
5870  // copy merged bin contents (ignore under/overflows)
5871  // Start merging only once the new lowest edge is reached
5872  Int_t startbin = 1;
5873  const Double_t newxmin = hnew->GetXaxis()->GetBinLowEdge(1);
5874  while( fXaxis.GetBinCenter(startbin) < newxmin && startbin <= nbins ) {
5875  startbin++;
5876  }
5877  Int_t oldbin = startbin;
5878  Double_t binContent, binError;
5879  for (bin = 1;bin<=newbins;bin++) {
5880  binContent = 0;
5881  binError = 0;
5882  Int_t imax = ngroup;
5883  Double_t xbinmax = hnew->GetXaxis()->GetBinUpEdge(bin);
5884  // check bin edges for the cases when we provide an array of bins
5885  // be careful in case bins can have zero width
5886  if (xbins && !TMath::AreEqualAbs(fXaxis.GetBinLowEdge(oldbin),
5887  hnew->GetXaxis()->GetBinLowEdge(bin),
5888  TMath::Max(1.E-8 * fXaxis.GetBinWidth(oldbin), 1.E-16 )) )
5889  {
5890  Warning("Rebin","Bin edge %d of rebinned histogram does not much any bin edges of the old histogram. Result can be inconsistent",bin);
5891  }
5892  for (i=0;i<ngroup;i++) {
5893  if( (oldbin+i > nbins) ||
5894  ( hnew != this && (fXaxis.GetBinCenter(oldbin+i) > xbinmax)) ) {
5895  imax = i;
5896  break;
5897  }
5898  binContent += oldBins[oldbin+i];
5899  if (oldErrors) binError += oldErrors[oldbin+i]*oldErrors[oldbin+i];
5900  }
5901  hnew->SetBinContent(bin,binContent);
5902  if (oldErrors) hnew->SetBinError(bin,TMath::Sqrt(binError));
5903  oldbin += imax;
5904  }
5905 
5906  // sum underflow and overflow contents until startbin
5907  binContent = 0;
5908  binError = 0;
5909  for (i = 0; i < startbin; ++i) {
5910  binContent += oldBins[i];
5911  if (oldErrors) binError += oldErrors[i]*oldErrors[i];
5912  }
5913  hnew->SetBinContent(0,binContent);
5914  if (oldErrors) hnew->SetBinError(0,TMath::Sqrt(binError));
5915  // sum overflow
5916  binContent = 0;
5917  binError = 0;
5918  for (i = oldbin; i <= nbins+1; ++i) {
5919  binContent += oldBins[i];
5920  if (oldErrors) binError += oldErrors[i]*oldErrors[i];
5921  }
5922  hnew->SetBinContent(newbins+1,binContent);
5923  if (oldErrors) hnew->SetBinError(newbins+1,TMath::Sqrt(binError));
5924 
5925  hnew->SetCanExtend(oldExtendBitMask); // restore previous state
5926 
5927  // restore statistics and entries modified by SetBinContent
5928  hnew->SetEntries(entries);
5929  if (!resetStat) hnew->PutStats(stat);
5930  delete [] oldBins;
5931  if (oldErrors) delete [] oldErrors;
5932  return hnew;
5933 }
5934 
5935 ////////////////////////////////////////////////////////////////////////////////
5936 /// finds new limits for the axis so that *point* is within the range and
5937 /// the limits are compatible with the previous ones (see TH1::Merge).
5938 /// new limits are put into *newMin* and *newMax* variables.
5939 /// axis - axis whose limits are to be recomputed
5940 /// point - point that should fit within the new axis limits
5941 /// newMin - new minimum will be stored here
5942 /// newMax - new maximum will be stored here.
5943 /// false if failed (e.g. if the initial axis limits are wrong
5944 /// or the new range is more than \f$ 2^{64} \f$ times the old one).
5945 
5946 Bool_t TH1::FindNewAxisLimits(const TAxis* axis, const Double_t point, Double_t& newMin, Double_t &newMax)
5947 {
5948  Double_t xmin = axis->GetXmin();
5949  Double_t xmax = axis->GetXmax();
5950  if (xmin >= xmax) return kFALSE;
5951  Double_t range = xmax-xmin;
5952  Double_t binsize = range / axis->GetNbins();
5953 
5954  //recompute new axis limits by doubling the current range
5955  Int_t ntimes = 0;
5956  while (point < xmin) {
5957  if (ntimes++ > 64)
5958  return kFALSE;
5959  xmin = xmin - range;
5960  range *= 2;
5961  binsize *= 2;
5962  // // make sure that the merging will be correct
5963  // if ( xmin / binsize - TMath::Floor(xmin / binsize) >= 0.5) {
5964  // xmin += 0.5 * binsize;
5965  // xmax += 0.5 * binsize; // won't work with a histogram with only one bin, but I don't care
5966  // }
5967  }
5968  while (point >= xmax) {
5969  if (ntimes++ > 64)
5970  return kFALSE;
5971  xmax = xmax + range;
5972  range *= 2;
5973  binsize *= 2;
5974  // // make sure that the merging will be correct
5975  // if ( xmin / binsize - TMath::Floor(xmin / binsize) >= 0.5) {
5976  // xmin -= 0.5 * binsize;
5977  // xmax -= 0.5 * binsize; // won't work with a histogram with only one bin, but I don't care
5978  // }
5979  }
5980  newMin = xmin;
5981  newMax = xmax;
5982  // Info("FindNewAxisLimits", "OldAxis: (%lf, %lf), new: (%lf, %lf), point: %lf",
5983  // axis->GetXmin(), axis->GetXmax(), xmin, xmax, point);
5984 
5985  return kTRUE;
5986 }
5987 
5988 ////////////////////////////////////////////////////////////////////////////////
5989 /// Histogram is resized along axis such that x is in the axis range.
5990 /// The new axis limits are recomputed by doubling iteratively
5991 /// the current axis range until the specified value x is within the limits.
5992 /// The algorithm makes a copy of the histogram, then loops on all bins
5993 /// of the old histogram to fill the extended histogram.
5994 /// Takes into account errors (Sumw2) if any.
5995 /// The algorithm works for 1-d, 2-D and 3-D histograms.
5996 /// The axis must be extendable before invoking this function.
5997 /// Ex:
5998 ///
5999 /// ~~~ {.cpp}
6000 /// h->GetXaxis()->SetCanExtend(kTRUE);
6001 /// ~~~
6002 
6003 void TH1::ExtendAxis(Double_t x, TAxis *axis)
6004 {
6005  if (!axis->CanExtend()) return;
6006  if (TMath::IsNaN(x)) { // x may be a NaN
6008  return;
6009  }
6010 
6011  if (axis->GetXmin() >= axis->GetXmax()) return;
6012  if (axis->GetNbins() <= 0) return;
6013 
6014  Double_t xmin, xmax;
6015  if (!FindNewAxisLimits(axis, x, xmin, xmax))
6016  return;
6017 
6018  //save a copy of this histogram
6019  TH1 *hold = (TH1*)IsA()->New();
6020  hold->SetDirectory(0);
6021  Copy(*hold);
6022  //set new axis limits
6023  axis->SetLimits(xmin,xmax);
6024 
6025 
6026  //now loop on all bins and refill
6027  Int_t errors = GetSumw2N();
6028 
6029  Reset("ICE"); //reset only Integral, contents and Errors
6030 
6031  int iaxis = 0;
6032  if (axis == &fXaxis) iaxis = 1;
6033  if (axis == &fYaxis) iaxis = 2;
6034  if (axis == &fZaxis) iaxis = 3;
6035  bool firstw = kTRUE;
6036  Int_t binx,biny, binz = 0;
6037  Int_t ix = 0,iy = 0,iz = 0;
6038  Double_t bx,by,bz;
6039  Int_t ncells = hold->GetNcells();
6040  for (Int_t bin = 0; bin < ncells; ++bin) {
6041  hold->GetBinXYZ(bin,binx,biny,binz);
6042  bx = hold->GetXaxis()->GetBinCenter(binx);
6043  ix = fXaxis.FindFixBin(bx);
6044  if (fDimension > 1) {
6045  by = hold->GetYaxis()->GetBinCenter(biny);
6046  iy = fYaxis.FindFixBin(by);
6047  if (fDimension > 2) {
6048  bz = hold->GetZaxis()->GetBinCenter(binz);
6049  iz = fZaxis.FindFixBin(bz);
6050  }
6051  }
6052  // exclude underflow/overflow
6053  double content = hold->RetrieveBinContent(bin);
6054  if (content == 0) continue;
6055  if (IsBinUnderflow(bin,iaxis) || IsBinOverflow(bin,iaxis) ) {
6056  if (firstw) {
6057  Warning("ExtendAxis","Histogram %s has underflow or overflow in the axis that is extendable"
6058  " their content will be lost",GetName() );
6059  firstw= kFALSE;
6060  }
6061  continue;
6062  }
6063  Int_t ibin= GetBin(ix,iy,iz);
6064  AddBinContent(ibin, content);
6065  if (errors) {
6066  fSumw2.fArray[ibin] += hold->GetBinErrorSqUnchecked(bin);
6067  }
6068  }
6069  delete hold;
6070 }
6071 
6072 ////////////////////////////////////////////////////////////////////////////////
6073 /// Recursively remove object from the list of functions
6074 
6075 void TH1::RecursiveRemove(TObject *obj)
6076 {
6077  // Rely on TROOT::RecursiveRemove to take the readlock.
6078 
6079  if (fFunctions) {
6081  }
6082 }
6083 
6084 ////////////////////////////////////////////////////////////////////////////////
6085 /// Multiply this histogram by a constant c1.
6086 ///
6087 /// `this = c1*this`
6088 ///
6089 /// Note that both contents and errors(if any) are scaled.
6090 /// This function uses the services of TH1::Add
6091 ///
6092 /// IMPORTANT NOTE: Sumw2() is called automatically when scaling
6093 /// If you are not interested in the histogram statistics you can call
6094 /// Sumw2(off) or use the option "nosw2"
6095 ///
6096 /// One can scale an histogram such that the bins integral is equal to
6097 /// the normalization parameter via TH1::Scale(Double_t norm), where norm
6098 /// is the desired normalization divided by the integral of the histogram.
6099 ///
6100 /// If option contains "width" the bin contents and errors are divided
6101 /// by the bin width.
6102 
6103 void TH1::Scale(Double_t c1, Option_t *option)
6104 {
6105 
6106  TString opt = option; opt.ToLower();
6107  // store bin errors when scaling since cannot anymore be computed as sqrt(N)
6108  if (!opt.Contains("nosw2") && GetSumw2N() == 0) Sumw2();
6109  if (opt.Contains("width")) Add(this, this, c1, -1);
6110  else {
6111  if (fBuffer) BufferEmpty(1);
6112  for(Int_t i = 0; i < fNcells; ++i) UpdateBinContent(i, c1 * RetrieveBinContent(i));
6113  if (fSumw2.fN) for(Int_t i = 0; i < fNcells; ++i) fSumw2.fArray[i] *= (c1 * c1); // update errors
6114  SetMinimum(); SetMaximum(); // minimum and maximum value will be recalculated the next time
6115  }
6116 
6117  // if contours set, must also scale contours
6118  Int_t ncontours = GetContour();
6119  if (ncontours == 0) return;
6120  Double_t* levels = fContour.GetArray();
6121  for (Int_t i = 0; i < ncontours; ++i) levels[i] *= c1;
6122 }
6123 
6124 ////////////////////////////////////////////////////////////////////////////////
6125 /// Returns true if all axes are extendable.
6126 
6128 {
6129  Bool_t canExtend = fXaxis.CanExtend();
6130  if (GetDimension() > 1) canExtend &= fYaxis.CanExtend();
6131  if (GetDimension() > 2) canExtend &= fZaxis.CanExtend();
6132 
6133  return canExtend;
6134 }
6135 
6136 ////////////////////////////////////////////////////////////////////////////////
6137 /// Make the histogram axes extendable / not extendable according to the bit mask
6138 /// returns the previous bit mask specifying which axes are extendable
6139 
6140 UInt_t TH1::SetCanExtend(UInt_t extendBitMask)
6141 {
6142  UInt_t oldExtendBitMask = kNoAxis;
6143 
6144  if (fXaxis.CanExtend()) oldExtendBitMask |= kXaxis;
6145  if (extendBitMask & kXaxis) fXaxis.SetCanExtend(kTRUE);
6146  else fXaxis.SetCanExtend(kFALSE);
6147 
6148  if (GetDimension() > 1) {
6149  if (fYaxis.CanExtend()) oldExtendBitMask |= kYaxis;
6150  if (extendBitMask & kYaxis) fYaxis.SetCanExtend(kTRUE);
6151  else fYaxis.SetCanExtend(kFALSE);
6152  }
6153 
6154  if (GetDimension() > 2) {
6155  if (fZaxis.CanExtend()) oldExtendBitMask |= kZaxis;
6156  if (extendBitMask & kZaxis) fZaxis.SetCanExtend(kTRUE);
6157  else fZaxis.SetCanExtend(kFALSE);
6158  }
6159 
6160  return oldExtendBitMask;
6161 }
6162 
6163 ////////////////////////////////////////////////////////////////////////////////
6164 /// Static function to set the default buffer size for automatic histograms.
6165 /// When an histogram is created with one of its axis lower limit greater
6166 /// or equal to its upper limit, the function SetBuffer is automatically
6167 /// called with the default buffer size.
6168 
6169 void TH1::SetDefaultBufferSize(Int_t buffersize)
6170 {
6171  fgBufferSize = buffersize > 0 ? buffersize : 0;
6172 }
6173 
6174 ////////////////////////////////////////////////////////////////////////////////
6175 /// When this static function is called with `sumw2=kTRUE`, all new
6176 /// histograms will automatically activate the storage
6177 /// of the sum of squares of errors, ie TH1::Sumw2 is automatically called.
6178 
6179 void TH1::SetDefaultSumw2(Bool_t sumw2)
6180 {
6181  fgDefaultSumw2 = sumw2;
6182 }
6183 
6184 ////////////////////////////////////////////////////////////////////////////////
6185 /// Change (i.e. set) the title
6186 ///
6187 /// if title is in the form `stringt;stringx;stringy;stringz`
6188 /// the histogram title is set to `stringt`, the x axis title to `stringx`,
6189 /// the y axis title to `stringy`, and the z axis title to `stringz`.
6190 ///
6191 /// To insert the character `;` in one of the titles, one should use `#;`
6192 /// or `#semicolon`.
6193 
6194 void TH1::SetTitle(const char *title)
6195 {
6196  fTitle = title;
6197  fTitle.ReplaceAll("#;",2,"#semicolon",10);
6198 
6199  // Decode fTitle. It may contain X, Y and Z titles
6200  TString str1 = fTitle, str2;
6201  Int_t isc = str1.Index(";");
6202  Int_t lns = str1.Length();
6203 
6204  if (isc >=0 ) {
6205  fTitle = str1(0,isc);
6206  str1 = str1(isc+1, lns);
6207  isc = str1.Index(";");
6208  if (isc >=0 ) {
6209  str2 = str1(0,isc);
6210  str2.ReplaceAll("#semicolon",10,";",1);
6211  fXaxis.SetTitle(str2.Data());
6212  lns = str1.Length();
6213  str1 = str1(isc+1, lns);
6214  isc = str1.Index(";");
6215  if (isc >=0 ) {
6216  str2 = str1(0,isc);
6217  str2.ReplaceAll("#semicolon",10,";",1);
6218  fYaxis.SetTitle(str2.Data());
6219  lns = str1.Length();
6220  str1 = str1(isc+1, lns);
6221  str1.ReplaceAll("#semicolon",10,";",1);
6222  fZaxis.SetTitle(str1.Data());
6223  } else {
6224  str1.ReplaceAll("#semicolon",10,";",1);
6225  fYaxis.SetTitle(str1.Data());
6226  }
6227  } else {
6228  str1.ReplaceAll("#semicolon",10,";",1);
6229  fXaxis.SetTitle(str1.Data());
6230  }
6231  }
6232 
6233  fTitle.ReplaceAll("#semicolon",10,";",1);
6234 
6235  if (gPad && TestBit(kMustCleanup)) gPad->Modified();
6236 }
6237 
6238 ////////////////////////////////////////////////////////////////////////////////
6239 /// Smooth array xx, translation of Hbook routine hsmoof.F
6240 /// based on algorithm 353QH twice presented by J. Friedman
6241 /// in Proc.of the 1974 CERN School of Computing, Norway, 11-24 August, 1974.
6242 
6243 void TH1::SmoothArray(Int_t nn, Double_t *xx, Int_t ntimes)
6244 {
6245  if (nn < 3 ) {
6246  ::Error("SmoothArray","Need at least 3 points for smoothing: n = %d",nn);
6247  return;
6248  }
6249 
6250  Int_t ii;
6251  Double_t hh[6] = {0,0,0,0,0,0};
6252 
6253  std::vector<double> yy(nn);
6254  std::vector<double> zz(nn);
6255  std::vector<double> rr(nn);
6256 
6257  for (Int_t pass=0;pass<ntimes;pass++) {
6258  // first copy original data into temp array
6259  std::copy(xx, xx+nn, zz.begin() );
6260 
6261  for (int noent = 0; noent < 2; ++noent) { // run algorithm two times
6262 
6263  // do 353 i.e. running median 3, 5, and 3 in a single loop
6264  for (int kk = 0; kk < 3; kk++) {
6265  std::copy(zz.begin(), zz.end(), yy.begin());
6266  int medianType = (kk != 1) ? 3 : 5;
6267  int ifirst = (kk != 1 ) ? 1 : 2;
6268  int ilast = (kk != 1 ) ? nn-1 : nn -2;
6269  //nn2 = nn - ik - 1;
6270  // do all elements beside the first and last point for median 3
6271  // and first two and last 2 for median 5
6272  for ( ii = ifirst; ii < ilast; ii++) {
6273  assert(ii - ifirst >= 0);
6274  for (int jj = 0; jj < medianType; jj++) {
6275  hh[jj] = yy[ii - ifirst + jj ];
6276  }
6277  zz[ii] = TMath::Median(medianType, hh);
6278  }
6279 
6280  if (kk == 0) { // first median 3
6281  // first point
6282  hh[0] = zz[1];
6283  hh[1] = zz[0];
6284  hh[2] = 3*zz[1] - 2*zz[2];
6285  zz[0] = TMath::Median(3, hh);
6286  // last point
6287  hh[0] = zz[nn - 2];
6288  hh[1] = zz[nn - 1];
6289  hh[2] = 3*zz[nn - 2] - 2*zz[nn - 3];
6290  zz[nn - 1] = TMath::Median(3, hh);
6291  }
6292 
6293  if (kk == 1) { // median 5
6294  for (ii = 0; ii < 3; ii++) {
6295  hh[ii] = yy[ii];
6296  }
6297  zz[1] = TMath::Median(3, hh);
6298  // last two points
6299  for (ii = 0; ii < 3; ii++) {
6300  hh[ii] = yy[nn - 3 + ii];
6301  }
6302  zz[nn - 2] = TMath::Median(3, hh);
6303  }
6304 
6305  }
6306 
6307  std::copy ( zz.begin(), zz.end(), yy.begin() );
6308 
6309  // quadratic interpolation for flat segments
6310  for (ii = 2; ii < (nn - 2); ii++) {
6311  if (zz[ii - 1] != zz[ii]) continue;
6312  if (zz[ii] != zz[ii + 1]) continue;
6313  hh[0] = zz[ii - 2] - zz[ii];
6314  hh[1] = zz[ii + 2] - zz[ii];
6315  if (hh[0] * hh[1] <= 0) continue;
6316  int jk = 1;
6317  if ( TMath::Abs(hh[1]) > TMath::Abs(hh[0]) ) jk = -1;
6318  yy[ii] = -0.5*zz[ii - 2*jk] + zz[ii]/0.75 + zz[ii + 2*jk] /6.;
6319  yy[ii + jk] = 0.5*(zz[ii + 2*jk] - zz[ii - 2*jk]) + zz[ii];
6320  }
6321 
6322  // running means
6323  //std::copy(zz.begin(), zz.end(), yy.begin());
6324  for (ii = 1; ii < nn - 1; ii++) {
6325  zz[ii] = 0.25*yy[ii - 1] + 0.5*yy[ii] + 0.25*yy[ii + 1];
6326  }
6327  zz[0] = yy[0];
6328  zz[nn - 1] = yy[nn - 1];
6329 
6330  if (noent == 0) {
6331 
6332  // save computed values
6333  std::copy(zz.begin(), zz.end(), rr.begin());
6334 
6335  // COMPUTE residuals
6336  for (ii = 0; ii < nn; ii++) {
6337  zz[ii] = xx[ii] - zz[ii];
6338  }
6339  }
6340 
6341  } // end loop on noent
6342 
6343 
6344  double xmin = TMath::MinElement(nn,xx);
6345  for (ii = 0; ii < nn; ii++) {
6346  if (xmin < 0) xx[ii] = rr[ii] + zz[ii];
6347  // make smoothing defined positive - not better using 0 ?
6348  else xx[ii] = TMath::Max((rr[ii] + zz[ii]),0.0 );
6349  }
6350  }
6351 }
6352 
6353 ////////////////////////////////////////////////////////////////////////////////
6354 /// Smooth bin contents of this histogram.
6355 /// if option contains "R" smoothing is applied only to the bins
6356 /// defined in the X axis range (default is to smooth all bins)
6357 /// Bin contents are replaced by their smooth values.
6358 /// Errors (if any) are not modified.
6359 /// the smoothing procedure is repeated ntimes (default=1)
6360 
6361 void TH1::Smooth(Int_t ntimes, Option_t *option)
6362 {
6363  if (fDimension != 1) {
6364  Error("Smooth","Smooth only supported for 1-d histograms");
6365  return;
6366  }
6367  Int_t nbins = fXaxis.GetNbins();
6368  if (nbins < 3) {
6369  Error("Smooth","Smooth only supported for histograms with >= 3 bins. Nbins = %d",nbins);
6370  return;
6371  }
6372 
6373  // delete buffer if it is there since it will become invalid
6374  if (fBuffer) BufferEmpty(1);
6375 
6376  Int_t firstbin = 1, lastbin = nbins;
6377  TString opt = option;
6378  opt.ToLower();
6379  if (opt.Contains("r")) {
6380  firstbin= fXaxis.GetFirst();
6381  lastbin = fXaxis.GetLast();
6382  }
6383  nbins = lastbin - firstbin + 1;
6384  Double_t *xx = new Double_t[nbins];
6385  Double_t nent = fEntries;
6386  Int_t i;
6387  for (i=0;i<nbins;i++) {
6388  xx[i] = RetrieveBinContent(i+firstbin);
6389  }
6390 
6391  TH1::SmoothArray(nbins,xx,ntimes);
6392 
6393  for (i=0;i<nbins;i++) {
6394  UpdateBinContent(i+firstbin,xx[i]);
6395  }
6396  fEntries = nent;
6397  delete [] xx;
6398 
6399  if (gPad) gPad->Modified();
6400 }
6401 
6402 ////////////////////////////////////////////////////////////////////////////////
6403 /// if flag=kTRUE, underflows and overflows are used by the Fill functions
6404 /// in the computation of statistics (mean value, StdDev).
6405 /// By default, underflows or overflows are not used.
6406 
6407 void TH1::StatOverflows(Bool_t flag)
6408 {
6409  fgStatOverflows = flag;
6410 }
6411 
6412 ////////////////////////////////////////////////////////////////////////////////
6413 /// Stream a class object.
6414 
6415 void TH1::Streamer(TBuffer &b)
6416 {
6417  if (b.IsReading()) {
6418  UInt_t R__s, R__c;
6419  Version_t R__v = b.ReadVersion(&R__s, &R__c);
6420  if (fDirectory) fDirectory->Remove(this);
6421  fDirectory = 0;
6422  if (R__v > 2) {
6423  b.ReadClassBuffer(TH1::Class(), this, R__v, R__s, R__c);
6424 
6426  fXaxis.SetParent(this);
6427  fYaxis.SetParent(this);
6428  fZaxis.SetParent(this);
6429  TIter next(fFunctions);
6430  TObject *obj;
6431  while ((obj=next())) {
6432  if (obj->InheritsFrom(TF1::Class())) ((TF1*)obj)->SetParent(this);
6433  }
6434  return;
6435  }
6436  //process old versions before automatic schema evolution
6437  TNamed::Streamer(b);
6438  TAttLine::Streamer(b);
6439  TAttFill::Streamer(b);
6440  TAttMarker::Streamer(b);
6441  b >> fNcells;
6442  fXaxis.Streamer(b);
6443  fYaxis.Streamer(b);
6444  fZaxis.Streamer(b);
6445  fXaxis.SetParent(this);
6446  fYaxis.SetParent(this);
6447  fZaxis.SetParent(this);
6448  b >> fBarOffset;
6449  b >> fBarWidth;
6450  b >> fEntries;
6451  b >> fTsumw;
6452  b >> fTsumw2;
6453  b >> fTsumwx;
6454  b >> fTsumwx2;
6455  if (R__v < 2) {
6456  Float_t maximum, minimum, norm;
6457  Float_t *contour=0;
6458  b >> maximum; fMaximum = maximum;
6459  b >> minimum; fMinimum = minimum;
6460  b >> norm; fNormFactor = norm;
6461  Int_t n = b.ReadArray(contour);
6462  fContour.Set(n);
6463  for (Int_t i=0;i<n;i++) fContour.fArray[i] = contour[i];
6464  delete [] contour;
6465  } else {
6466  b >> fMaximum;
6467  b >> fMinimum;
6468  b >> fNormFactor;
6469  fContour.Streamer(b);
6470  }
6471  fSumw2.Streamer(b);
6472  fOption.Streamer(b);
6473  fFunctions->Delete();
6474  fFunctions->Streamer(b);
6475  b.CheckByteCount(R__s, R__c, TH1::IsA());
6476 
6477  } else {
6478  b.WriteClassBuffer(TH1::Class(),this);
6479  }
6480 }
6481 
6482 ////////////////////////////////////////////////////////////////////////////////
6483 /// Print some global quantities for this histogram.
6484 /// \param[in] option
6485 /// - "base" is given, number of bins and ranges are also printed
6486 /// - "range" is given, bin contents and errors are also printed
6487 /// for all bins in the current range (default 1-->nbins)
6488 /// - "all" is given, bin contents and errors are also printed
6489 /// for all bins including under and overflows.
6490 
6491 void TH1::Print(Option_t *option) const
6492 {
6493  if (fBuffer) const_cast<TH1*>(this)->BufferEmpty();
6494  printf( "TH1.Print Name = %s, Entries= %d, Total sum= %g\n",GetName(),Int_t(fEntries),GetSumOfWeights());
6495  TString opt = option;
6496  opt.ToLower();
6497  Int_t all;
6498  if (opt.Contains("all")) all = 0;
6499  else if (opt.Contains("range")) all = 1;
6500  else if (opt.Contains("base")) all = 2;
6501  else return;
6502 
6503  Int_t bin, binx, biny, binz;
6504  Int_t firstx=0,lastx=0,firsty=0,lasty=0,firstz=0,lastz=0;
6505  if (all == 0) {
6506  lastx = fXaxis.GetNbins()+1;
6507  if (fDimension > 1) lasty = fYaxis.GetNbins()+1;
6508  if (fDimension > 2) lastz = fZaxis.GetNbins()+1;
6509  } else {
6510  firstx = fXaxis.GetFirst(); lastx = fXaxis.GetLast();
6511  if (fDimension > 1) {firsty = fYaxis.GetFirst(); lasty = fYaxis.GetLast();}
6512  if (fDimension > 2) {firstz = fZaxis.GetFirst(); lastz = fZaxis.GetLast();}
6513  }
6514 
6515  if (all== 2) {
6516  printf(" Title = %s\n", GetTitle());
6517  printf(" NbinsX= %d, xmin= %g, xmax=%g", fXaxis.GetNbins(), fXaxis.GetXmin(), fXaxis.GetXmax());
6518  if( fDimension > 1) printf(", NbinsY= %d, ymin= %g, ymax=%g", fYaxis.GetNbins(), fYaxis.GetXmin(), fYaxis.GetXmax());
6519  if( fDimension > 2) printf(", NbinsZ= %d, zmin= %g, zmax=%g", fZaxis.GetNbins(), fZaxis.GetXmin(), fZaxis.GetXmax());
6520  printf("\n");
6521  return;
6522  }
6523 
6524  Double_t w,e;
6525  Double_t x,y,z;
6526  if (fDimension == 1) {
6527  for (binx=firstx;binx<=lastx;binx++) {
6528  x = fXaxis.GetBinCenter(binx);
6529  w = RetrieveBinContent(binx);
6530  e = GetBinError(binx);
6531  if(fSumw2.fN) printf(" fSumw[%d]=%g, x=%g, error=%g\n",binx,w,x,e);
6532  else printf(" fSumw[%d]=%g, x=%g\n",binx,w,x);
6533  }
6534  }
6535  if (fDimension == 2) {
6536  for (biny=firsty;biny<=lasty;biny++) {
6537  y = fYaxis.GetBinCenter(biny);
6538  for (binx=firstx;binx<=lastx;binx++) {
6539  bin = GetBin(binx,biny);
6540  x = fXaxis.GetBinCenter(binx);
6541  w = RetrieveBinContent(bin);
6542  e = GetBinError(bin);
6543  if(fSumw2.fN) printf(" fSumw[%d][%d]=%g, x=%g, y=%g, error=%g\n",binx,biny,w,x,y,e);
6544  else printf(" fSumw[%d][%d]=%g, x=%g, y=%g\n",binx,biny,w,x,y);
6545  }
6546  }
6547  }
6548  if (fDimension == 3) {
6549  for (binz=firstz;binz<=lastz;binz++) {
6550  z = fZaxis.GetBinCenter(binz);
6551  for (biny=firsty;biny<=lasty;biny++) {
6552  y = fYaxis.GetBinCenter(biny);
6553  for (binx=firstx;binx<=lastx;binx++) {
6554  bin = GetBin(binx,biny,binz);
6555  x = fXaxis.GetBinCenter(binx);
6556  w = RetrieveBinContent(bin);
6557  e = GetBinError(bin);
6558  if(fSumw2.fN) printf(" fSumw[%d][%d][%d]=%g, x=%g, y=%g, z=%g, error=%g\n",binx,biny,binz,w,x,y,z,e);
6559  else printf(" fSumw[%d][%d][%d]=%g, x=%g, y=%g, z=%g\n",binx,biny,binz,w,x,y,z);
6560  }
6561  }
6562  }
6563  }
6564 }
6565 
6566 ////////////////////////////////////////////////////////////////////////////////
6567 /// Using the current bin info, recompute the arrays for contents and errors
6568 
6569 void TH1::Rebuild(Option_t *)
6570 {
6571  SetBinsLength();
6572  if (fSumw2.fN) {
6573  fSumw2.Set(fNcells);
6574  }
6575 }
6576 
6577 ////////////////////////////////////////////////////////////////////////////////
6578 /// Reset this histogram: contents, errors, etc.
6579 /// \param[in] option
6580 /// - if "ICE" is specified, resets only Integral, Contents and Errors.
6581 /// - if "ICES" is specified, resets only Integral, Contents, Errors and Statistics
6582 /// This option is used
6583 /// - if "M" is specified, resets also Minimum and Maximum
6584 
6585 void TH1::Reset(Option_t *option)
6586 {
6587  // The option "ICE" is used when extending the histogram (in ExtendAxis, LabelInflate, etc..)
6588  // The option "ICES is used in combination with the buffer (see BufferEmpty and BufferFill)
6589 
6590  TString opt = option;
6591  opt.ToUpper();
6592  fSumw2.Reset();
6593  if (fIntegral) {delete [] fIntegral; fIntegral = 0;}
6594 
6595  if (opt.Contains("M")) {
6596  SetMinimum();
6597  SetMaximum();
6598  }
6599 
6600  if (opt.Contains("ICE") && !opt.Contains("S")) return;
6601 
6602  // Setting fBuffer[0] = 0 is like resetting the buffer but not deleting it
6603  // But what is the sense of calling BufferEmpty() ? For making the axes ?
6604  // BufferEmpty will update contents that later will be
6605  // reset in calling TH1D::Reset. For this we need to reset the stats afterwards
6606  // It may be needed for computing the axis limits....
6607  if (fBuffer) {BufferEmpty(); fBuffer[0] = 0;}
6608 
6609  // need to reset also the statistics
6610  // (needs to be done after calling BufferEmpty() )
6611  fTsumw = 0;
6612  fTsumw2 = 0;
6613  fTsumwx = 0;
6614  fTsumwx2 = 0;
6615  fEntries = 0;
6616 
6617  if (opt == "ICES") return;
6618 
6619 
6620  TObject *stats = fFunctions->FindObject("stats");
6621  fFunctions->Remove(stats);
6622  //special logic to support the case where the same object is
6623  //added multiple times in fFunctions.
6624  //This case happens when the same object is added with different
6625  //drawing modes
6626  TObject *obj;
6627  while ((obj = fFunctions->First())) {
6628  while(fFunctions->Remove(obj)) { }
6629  delete obj;
6630  }
6631  if(stats) fFunctions->Add(stats);
6632  fContour.Set(0);
6633 }
6634 
6635 ////////////////////////////////////////////////////////////////////////////////
6636 /// Save primitive as a C++ statement(s) on output stream out
6637 
6638 void TH1::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
6639 {
6640  // empty the buffer before if it exists
6641  if (fBuffer) BufferEmpty();
6642 
6643  Bool_t nonEqiX = kFALSE;
6644  Bool_t nonEqiY = kFALSE;
6645  Bool_t nonEqiZ = kFALSE;
6646  Int_t i;
6647  static Int_t nxaxis = 0;
6648  static Int_t nyaxis = 0;
6649  static Int_t nzaxis = 0;
6650  TString sxaxis="xAxis",syaxis="yAxis",szaxis="zAxis";
6651 
6652  // Check if the histogram has equidistant X bins or not. If not, we
6653  // create an array holding the bins.
6654  if (GetXaxis()->GetXbins()->fN && GetXaxis()->GetXbins()->fArray) {
6655  nonEqiX = kTRUE;
6656  nxaxis++;
6657  sxaxis += nxaxis;
6658  out << " Double_t "<<sxaxis<<"[" << GetXaxis()->GetXbins()->fN
6659  << "] = {";
6660  for (i = 0; i < GetXaxis()->GetXbins()->fN; i++) {
6661  if (i != 0) out << ", ";
6662  out << GetXaxis()->GetXbins()->fArray[i];
6663  }
6664  out << "}; " << std::endl;
6665  }
6666  // If the histogram is 2 or 3 dimensional, check if the histogram
6667  // has equidistant Y bins or not. If not, we create an array
6668  // holding the bins.
6669  if (fDimension > 1 && GetYaxis()->GetXbins()->fN &&
6670  GetYaxis()->GetXbins()->fArray) {
6671  nonEqiY = kTRUE;
6672  nyaxis++;
6673  syaxis += nyaxis;
6674  out << " Double_t "<<syaxis<<"[" << GetYaxis()->GetXbins()->fN
6675  << "] = {";
6676  for (i = 0; i < GetYaxis()->GetXbins()->fN; i++) {
6677  if (i != 0) out << ", ";
6678  out << GetYaxis()->GetXbins()->fArray[i];
6679  }
6680  out << "}; " << std::endl;
6681  }
6682  // IF the histogram is 3 dimensional, check if the histogram
6683  // has equidistant Z bins or not. If not, we create an array
6684  // holding the bins.
6685  if (fDimension > 2 && GetZaxis()->GetXbins()->fN &&
6686  GetZaxis()->GetXbins()->fArray) {
6687  nonEqiZ = kTRUE;
6688  nzaxis++;
6689  szaxis += nzaxis;
6690  out << " Double_t "<<szaxis<<"[" << GetZaxis()->GetXbins()->fN
6691  << "] = {";
6692  for (i = 0; i < GetZaxis()->GetXbins()->fN; i++) {
6693  if (i != 0) out << ", ";
6694  out << GetZaxis()->GetXbins()->fArray[i];
6695  }
6696  out << "}; " << std::endl;
6697  }
6698 
6699  char quote = '"';
6700  out <<" "<<std::endl;
6701  out <<" "<< ClassName() <<" *";
6702 
6703  // Histogram pointer has by default the histogram name with an incremental suffix.
6704  // If the histogram belongs to a graph or a stack the suffix is not added because
6705  // the graph and stack objects are not aware of this new name. Same thing if
6706  // the histogram is drawn with the option COLZ because the TPaletteAxis drawn
6707  // when this option is selected, does not know this new name either.
6708  TString opt = option;
6709  opt.ToLower();
6710  static Int_t hcounter = 0;
6711  TString histName = GetName();
6712  if ( !histName.Contains("Graph")
6713  && !histName.Contains("_stack_")
6714  && !opt.Contains("colz")) {
6715  hcounter++;
6716  histName += "__";
6717  histName += hcounter;
6718  }
6719  histName = gInterpreter-> MapCppName(histName);
6720  const char *hname = histName.Data();
6721  if (!strlen(hname)) hname = "unnamed";
6722  TString savedName = GetName();
6723  this->SetName(hname);
6724  TString t(GetTitle());
6725  t.ReplaceAll("\\","\\\\");
6726  t.ReplaceAll("\"","\\\"");
6727  out << hname << " = new " << ClassName() << "(" << quote
6728  << hname << quote << "," << quote<< t.Data() << quote
6729  << "," << GetXaxis()->GetNbins();
6730  if (nonEqiX)
6731  out << ", "<<sxaxis;
6732  else
6733  out << "," << GetXaxis()->GetXmin()
6734  << "," << GetXaxis()->GetXmax();
6735  if (fDimension > 1) {
6736  out << "," << GetYaxis()->GetNbins();
6737  if (nonEqiY)
6738  out << ", "<<syaxis;
6739  else
6740  out << "," << GetYaxis()->GetXmin()
6741  << "," << GetYaxis()->GetXmax();
6742  }
6743  if (fDimension > 2) {
6744  out << "," << GetZaxis()->GetNbins();
6745  if (nonEqiZ)
6746  out << ", "<<szaxis;
6747  else
6748  out << "," << GetZaxis()->GetXmin()
6749  << "," << GetZaxis()->GetXmax();
6750  }
6751  out << ");" << std::endl;
6752 
6753  // save bin contents
6754  Int_t bin;
6755  for (bin=0;bin<fNcells;bin++) {
6756  Double_t bc = RetrieveBinContent(bin);
6757  if (bc) {
6758  out<<" "<<hname<<"->SetBinContent("<<bin<<","<<bc<<");"<<std::endl;
6759  }
6760  }
6761 
6762  // save bin errors
6763  if (fSumw2.fN) {
6764  for (bin=0;bin<fNcells;bin++) {
6765  Double_t be = GetBinError(bin);
6766  if (be) {
6767  out<<" "<<hname<<"->SetBinError("<<bin<<","<<be<<");"<<std::endl;
6768  }
6769  }
6770  }
6771 
6772  TH1::SavePrimitiveHelp(out, hname, option);
6773  this->SetName(savedName.Data());
6774 }
6775 
6776 ////////////////////////////////////////////////////////////////////////////////
6777 /// Helper function for the SavePrimitive functions from TH1
6778 /// or classes derived from TH1, eg TProfile, TProfile2D.
6779 
6780 void TH1::SavePrimitiveHelp(std::ostream &out, const char *hname, Option_t *option /*= ""*/)
6781 {
6782  char quote = '"';
6783  if (TMath::Abs(GetBarOffset()) > 1e-5) {
6784  out<<" "<<hname<<"->SetBarOffset("<<GetBarOffset()<<");"<<std::endl;
6785  }
6786  if (TMath::Abs(GetBarWidth()-1) > 1e-5) {
6787  out<<" "<<hname<<"->SetBarWidth("<<GetBarWidth()<<");"<<std::endl;
6788  }
6789  if (fMinimum != -1111) {
6790  out<<" "<<hname<<"->SetMinimum("<<fMinimum<<");"<<std::endl;
6791  }
6792  if (fMaximum != -1111) {
6793  out<<" "<<hname<<"->SetMaximum("<<fMaximum<<");"<<std::endl;
6794  }
6795  if (fNormFactor != 0) {
6796  out<<" "<<hname<<"->SetNormFactor("<<fNormFactor<<");"<<std::endl;
6797  }
6798  if (fEntries != 0) {
6799  out<<" "<<hname<<"->SetEntries("<<fEntries<<");"<<std::endl;
6800  }
6801  if (fDirectory == 0) {
6802  out<<" "<<hname<<"->SetDirectory(0);"<<std::endl;
6803  }
6804  if (TestBit(kNoStats)) {
6805  out<<" "<<hname<<"->SetStats(0);"<<std::endl;
6806  }
6807  if (fOption.Length() != 0) {
6808  out<<" "<<hname<<"->SetOption("<<quote<<fOption.Data()<<quote<<");"<<std::endl;
6809  }
6810 
6811  // save contour levels
6812  Int_t ncontours = GetContour();
6813  if (ncontours > 0) {
6814  out<<" "<<hname<<"->SetContour("<<ncontours<<");"<<std::endl;
6815  Double_t zlevel;
6816  for (Int_t bin=0;bin<ncontours;bin++) {
6817  if (gPad->GetLogz()) {
6818  zlevel = TMath::Power(10,GetContourLevel(bin));
6819  } else {
6820  zlevel = GetContourLevel(bin);
6821  }
6822  out<<" "<<hname<<"->SetContourLevel("<<bin<<","<<zlevel<<");"<<std::endl;
6823  }
6824  }
6825 
6826  // save list of functions
6828  TObject *obj;
6829  static Int_t funcNumber = 0;
6830  while (lnk) {
6831  obj = lnk->GetObject();
6832  obj->SavePrimitive(out,Form("nodraw #%d\n",++funcNumber));
6833  if (obj->InheritsFrom(TF1::Class())) {
6834  TString fname;
6835  fname.Form("%s%d",obj->GetName(),funcNumber);
6836  out << " " << fname << "->SetParent(" << hname << ");\n";
6837  out<<" "<<hname<<"->GetListOfFunctions()->Add("
6838  << fname <<");"<<std::endl;
6839  } else if (obj->InheritsFrom("TPaveStats")) {
6840  out<<" "<<hname<<"->GetListOfFunctions()->Add(ptstats);"<<std::endl;
6841  out<<" ptstats->SetParent("<<hname<<");"<<std::endl;
6842  } else {
6843  out<<" "<<hname<<"->GetListOfFunctions()->Add("
6844  <<obj->GetName()
6845  <<","<<quote<<lnk->GetOption()<<quote<<");"<<std::endl;
6846  }
6847  lnk = (TObjOptLink*)lnk->Next();
6848  }
6849 
6850  // save attributes
6851  SaveFillAttributes(out,hname,0,1001);
6852  SaveLineAttributes(out,hname,1,1,1);
6853  SaveMarkerAttributes(out,hname,1,1,1);
6854  fXaxis.SaveAttributes(out,hname,"->GetXaxis()");
6855  fYaxis.SaveAttributes(out,hname,"->GetYaxis()");
6856  fZaxis.SaveAttributes(out,hname,"->GetZaxis()");
6857  TString opt = option;
6858  opt.ToLower();
6859  if (!opt.Contains("nodraw")) {
6860  out<<" "<<hname<<"->Draw("
6861  <<quote<<option<<quote<<");"<<std::endl;
6862  }
6863 }
6864 
6865 ////////////////////////////////////////////////////////////////////////////////
6866 /// Copy current attributes from/to current style
6867 
6868 void TH1::UseCurrentStyle()
6869 {
6870  if (!gStyle) return;
6871  if (gStyle->IsReading()) {
6872  fXaxis.ResetAttAxis("X");
6873  fYaxis.ResetAttAxis("Y");
6874  fZaxis.ResetAttAxis("Z");
6885  Int_t dostat = gStyle->GetOptStat();
6886  if (gStyle->GetOptFit() && !dostat) dostat = 1000000001;
6887  SetStats(dostat);
6888  } else {
6900  }
6901  TIter next(GetListOfFunctions());
6902  TObject *obj;
6903 
6904  while ((obj = next())) {
6905  obj->UseCurrentStyle();
6906  }
6907 }
6908 
6909 ////////////////////////////////////////////////////////////////////////////////
6910 /// For axis = 1,2 or 3 returns the mean value of the histogram along
6911 /// X,Y or Z axis.
6912 ///
6913 /// For axis = 11, 12, 13 returns the standard error of the mean value
6914 /// of the histogram along X, Y or Z axis
6915 ///
6916 /// Note that the mean value/StdDev is computed using the bins in the currently
6917 /// defined range (see TAxis::SetRange). By default the range includes
6918 /// all bins from 1 to nbins included, excluding underflows and overflows.
6919 /// To force the underflows and overflows in the computation, one must
6920 /// call the static function TH1::StatOverflows(kTRUE) before filling
6921 /// the histogram.
6922 ///
6923 /// Return mean value of this histogram along the X axis.
6924 ///
6925 /// Note that the mean value/StdDev is computed using the bins in the currently
6926 /// defined range (see TAxis::SetRange). By default the range includes
6927 /// all bins from 1 to nbins included, excluding underflows and overflows.
6928 /// To force the underflows and overflows in the computation, one must
6929 /// call the static function TH1::StatOverflows(kTRUE) before filling
6930 /// the histogram.
6931 
6932 Double_t TH1::GetMean(Int_t axis) const
6933 {
6934  if (axis<1 || (axis>3 && axis<11) || axis>13) return 0;
6935  Double_t stats[kNstat];
6936  for (Int_t i=4;i<kNstat;i++) stats[i] = 0;
6937  GetStats(stats);
6938  if (stats[0] == 0) return 0;
6939  if (axis<4){
6940  Int_t ax[3] = {2,4,7};
6941  return stats[ax[axis-1]]/stats[0];
6942  } else {
6943  // mean error = StdDev / sqrt( Neff )
6944  Double_t stddev = GetStdDev(axis-10);
6945  Double_t neff = GetEffectiveEntries();
6946  return ( neff > 0 ? stddev/TMath::Sqrt(neff) : 0. );
6947  }
6948 }
6949 
6950 ////////////////////////////////////////////////////////////////////////////////
6951 /// Return standard error of mean of this histogram along the X axis.
6952 ///
6953 /// Note that the mean value/StdDev is computed using the bins in the currently
6954 /// defined range (see TAxis::SetRange). By default the range includes
6955 /// all bins from 1 to nbins included, excluding underflows and overflows.
6956 /// To force the underflows and overflows in the computation, one must
6957 /// call the static function TH1::StatOverflows(kTRUE) before filling
6958 /// the histogram.
6959 ///
6960 /// Also note, that although the definition of standard error doesn't include the
6961 /// assumption of normality, many uses of this feature implicitly assume it.
6962 
6963 Double_t TH1::GetMeanError(Int_t axis) const
6964 {
6965  return GetMean(axis+10);
6966 }
6967 
6968 ////////////////////////////////////////////////////////////////////////////////
6969 /// Returns the Standard Deviation (Sigma).
6970 /// The Sigma estimate is computed as
6971 /// \f[
6972 /// \sqrt{\frac{1}{N}(\sum(x_i-x_{mean})^2)}
6973 /// \f]
6974 /// For axis = 1,2 or 3 returns the Sigma value of the histogram along
6975 /// X, Y or Z axis
6976 /// For axis = 11, 12 or 13 returns the error of StdDev estimation along
6977 /// X, Y or Z axis for Normal distribution
6978 ///
6979 /// Note that the mean value/sigma is computed using the bins in the currently
6980 /// defined range (see TAxis::SetRange). By default the range includes
6981 /// all bins from 1 to nbins included, excluding underflows and overflows.
6982 /// To force the underflows and overflows in the computation, one must
6983 /// call the static function TH1::StatOverflows(kTRUE) before filling
6984 /// the histogram.
6985 
6986 Double_t TH1::GetStdDev(Int_t axis) const
6987 {
6988  if (axis<1 || (axis>3 && axis<11) || axis>13) return 0;
6989 
6990  Double_t x, stddev2, stats[kNstat];
6991  for (Int_t i=4;i<kNstat;i++) stats[i] = 0;
6992  GetStats(stats);
6993  if (stats[0] == 0) return 0;
6994  Int_t ax[3] = {2,4,7};
6995  Int_t axm = ax[axis%10 - 1];
6996  x = stats[axm]/stats[0];
6997  stddev2 = TMath::Abs(stats[axm+1]/stats[0] -x*x);
6998  if (axis<10)
6999  return TMath::Sqrt(stddev2);
7000  else {
7001  // The right formula for StdDev error depends on 4th momentum (see Kendall-Stuart Vol 1 pag 243)
7002  // formula valid for only gaussian distribution ( 4-th momentum = 3 * sigma^4 )
7003  Double_t neff = GetEffectiveEntries();
7004  return ( neff > 0 ? TMath::Sqrt(stddev2/(2*neff) ) : 0. );
7005  }
7006 }
7007 
7008 ////////////////////////////////////////////////////////////////////////////////
7009 /// Return error of standard deviation estimation for Normal distribution
7010 ///
7011 /// Note that the mean value/StdDev is computed using the bins in the currently
7012 /// defined range (see TAxis::SetRange). By default the range includes
7013 /// all bins from 1 to nbins included, excluding underflows and overflows.
7014 /// To force the underflows and overflows in the computation, one must
7015 /// call the static function TH1::StatOverflows(kTRUE) before filling
7016 /// the histogram.
7017 ///
7018 /// Value returned is standard deviation of sample standard deviation.
7019 /// Note that it is an approximated value which is valid only in the case that the
7020 /// original data distribution is Normal. The correct one would require
7021 /// the 4-th momentum value, which cannot be accurately estimated from an histogram since
7022 /// the x-information for all entries is not kept.
7023 
7025 {
7026  return GetStdDev(axis+10);
7027 }
7028 
7029 ////////////////////////////////////////////////////////////////////////////////
7030 /// - For axis = 1, 2 or 3 returns skewness of the histogram along x, y or z axis.
7031 /// - For axis = 11, 12 or 13 returns the approximate standard error of skewness
7032 /// of the histogram along x, y or z axis
7033 ///
7034 ///Note, that since third and fourth moment are not calculated
7035 ///at the fill time, skewness and its standard error are computed bin by bin
7036 
7037 Double_t TH1::GetSkewness(Int_t axis) const
7038 {
7039 
7040  if (axis > 0 && axis <= 3){
7041 
7042  Double_t mean = GetMean(axis);
7043  Double_t stddev = GetStdDev(axis);
7044  Double_t stddev3 = stddev*stddev*stddev;
7045 
7046  Int_t firstBinX = fXaxis.GetFirst();
7047  Int_t lastBinX = fXaxis.GetLast();
7048  Int_t firstBinY = fYaxis.GetFirst();
7049  Int_t lastBinY = fYaxis.GetLast();
7050  Int_t firstBinZ = fZaxis.GetFirst();
7051  Int_t lastBinZ = fZaxis.GetLast();
7052  // include underflow/overflow if TH1::StatOverflows(kTRUE) in case no range is set on the axis
7053  if (GetStatOverflowsBehaviour()) {
7054  if ( !fXaxis.TestBit(TAxis::kAxisRange) ) {
7055  if (firstBinX == 1) firstBinX = 0;
7056  if (lastBinX == fXaxis.GetNbins() ) lastBinX += 1;
7057  }
7058  if ( !fYaxis.TestBit(TAxis::kAxisRange) ) {
7059  if (firstBinY == 1) firstBinY = 0;
7060  if (lastBinY == fYaxis.GetNbins() ) lastBinY += 1;
7061  }
7062  if ( !fZaxis.TestBit(TAxis::kAxisRange) ) {
7063  if (firstBinZ == 1) firstBinZ = 0;
7064  if (lastBinZ == fZaxis.GetNbins() ) lastBinZ += 1;
7065  }
7066  }
7067 
7068  Double_t x = 0;
7069  Double_t sum=0;
7070  Double_t np=0;
7071  for (Int_t binx = firstBinX; binx <= lastBinX; binx++) {
7072  for (Int_t biny = firstBinY; biny <= lastBinY; biny++) {
7073  for (Int_t binz = firstBinZ; binz <= lastBinZ; binz++) {
7074  if (axis==1 ) x = fXaxis.GetBinCenter(binx);
7075  else if (axis==2 ) x = fYaxis.GetBinCenter(biny);
7076  else if (axis==3 ) x = fZaxis.GetBinCenter(binz);
7077  Double_t w = GetBinContent(binx,biny,binz);
7078  np+=w;
7079  sum+=w*(x-mean)*(x-mean)*(x-mean);
7080  }
7081  }
7082  }
7083  sum/=np*stddev3;
7084  return sum;
7085  }
7086  else if (axis > 10 && axis <= 13) {
7087  //compute standard error of skewness
7088  // assume parent normal distribution use formula from Kendall-Stuart, Vol 1 pag 243, second edition
7089  Double_t neff = GetEffectiveEntries();
7090  return ( neff > 0 ? TMath::Sqrt(6./neff ) : 0. );
7091  }
7092  else {
7093  Error("GetSkewness", "illegal value of parameter");
7094  return 0;
7095  }
7096 }
7097 
7098 ////////////////////////////////////////////////////////////////////////////////
7099 /// - For axis =1, 2 or 3 returns kurtosis of the histogram along x, y or z axis.
7100 /// Kurtosis(gaussian(0, 1)) = 0.
7101 /// - For axis =11, 12 or 13 returns the approximate standard error of kurtosis
7102 /// of the histogram along x, y or z axis
7103 ////
7104 /// Note, that since third and fourth moment are not calculated
7105 /// at the fill time, kurtosis and its standard error are computed bin by bin
7106 
7107 Double_t TH1::GetKurtosis(Int_t axis) const
7108 {
7109  if (axis > 0 && axis <= 3){
7110 
7111  Double_t mean = GetMean(axis);
7112  Double_t stddev = GetStdDev(axis);
7113  Double_t stddev4 = stddev*stddev*stddev*stddev;
7114 
7115  Int_t firstBinX = fXaxis.GetFirst();
7116  Int_t lastBinX = fXaxis.GetLast();
7117  Int_t firstBinY = fYaxis.GetFirst();
7118  Int_t lastBinY = fYaxis.GetLast();
7119  Int_t firstBinZ = fZaxis.GetFirst();
7120  Int_t lastBinZ = fZaxis.GetLast();
7121  // include underflow/overflow if TH1::StatOverflows(kTRUE) in case no range is set on the axis
7122  if (GetStatOverflowsBehaviour()) {
7123  if ( !fXaxis.TestBit(TAxis::kAxisRange) ) {
7124  if (firstBinX == 1) firstBinX = 0;
7125  if (lastBinX == fXaxis.GetNbins() ) lastBinX += 1;
7126  }
7127  if ( !fYaxis.TestBit(TAxis::kAxisRange) ) {
7128  if (firstBinY == 1) firstBinY = 0;
7129  if (lastBinY == fYaxis.GetNbins() ) lastBinY += 1;
7130  }
7131  if ( !fZaxis.TestBit(TAxis::kAxisRange) ) {
7132  if (firstBinZ == 1) firstBinZ = 0;
7133  if (lastBinZ == fZaxis.GetNbins() ) lastBinZ += 1;
7134  }
7135  }
7136 
7137  Double_t x = 0;
7138  Double_t sum=0;
7139  Double_t np=0;
7140  for (Int_t binx = firstBinX; binx <= lastBinX; binx++) {
7141  for (Int_t biny = firstBinY; biny <= lastBinY; biny++) {
7142  for (Int_t binz = firstBinZ; binz <= lastBinZ; binz++) {
7143  if (axis==1 ) x = fXaxis.GetBinCenter(binx);
7144  else if (axis==2 ) x = fYaxis.GetBinCenter(biny);
7145  else if (axis==3 ) x = fZaxis.GetBinCenter(binz);
7146  Double_t w = GetBinContent(binx,biny,binz);
7147  np+=w;
7148  sum+=w*(x-mean)*(x-mean)*(x-mean)*(x-mean);
7149  }
7150  }
7151  }
7152  sum/=(np*stddev4);
7153  return sum-3;
7154 
7155  } else if (axis > 10 && axis <= 13) {
7156  //compute standard error of skewness
7157  // assume parent normal distribution use formula from Kendall-Stuart, Vol 1 pag 243, second edition
7158  Double_t neff = GetEffectiveEntries();
7159  return ( neff > 0 ? TMath::Sqrt(24./neff ) : 0. );
7160  }
7161  else {
7162  Error("GetKurtosis", "illegal value of parameter");
7163  return 0;
7164  }
7165 }
7166 
7167 ////////////////////////////////////////////////////////////////////////////////
7168 /// fill the array stats from the contents of this histogram
7169 /// The array stats must be correctly dimensioned in the calling program.
7170 ///
7171 /// ~~~ {.cpp}
7172 /// stats[0] = sumw
7173 /// stats[1] = sumw2
7174 /// stats[2] = sumwx
7175 /// stats[3] = sumwx2
7176 /// ~~~
7177 ///
7178 /// If no axis-subrange is specified (via TAxis::SetRange), the array stats
7179 /// is simply a copy of the statistics quantities computed at filling time.
7180 /// If a sub-range is specified, the function recomputes these quantities
7181 /// from the bin contents in the current axis range.
7182 ///
7183 /// Note that the mean value/StdDev is computed using the bins in the currently
7184 /// defined range (see TAxis::SetRange). By default the range includes
7185 /// all bins from 1 to nbins included, excluding underflows and overflows.
7186 /// To force the underflows and overflows in the computation, one must
7187 /// call the static function TH1::StatOverflows(kTRUE) before filling
7188 /// the histogram.
7189 
7190 void TH1::GetStats(Double_t *stats) const
7191 {
7192  if (fBuffer) ((TH1*)this)->BufferEmpty();
7193 
7194  // Loop on bins (possibly including underflows/overflows)
7195  Int_t bin, binx;
7196  Double_t w,err;
7197  Double_t x;
7198  // identify the case of labels with extension of axis range
7199  // in this case the statistics in x does not make any sense
7200  Bool_t labelHist = ((const_cast<TAxis&>(fXaxis)).GetLabels() && CanExtendAllAxes() );
7201  // fTsumw == 0 && fEntries > 0 is a special case when uses SetBinContent or calls ResetStats before
7202  if ((fTsumw == 0 && fEntries > 0) || ( fXaxis.TestBit(TAxis::kAxisRange) && !labelHist) ) {
7203  for (bin=0;bin<4;bin++) stats[bin] = 0;
7204 
7205  Int_t firstBinX = fXaxis.GetFirst();
7206  Int_t lastBinX = fXaxis.GetLast();
7207  // include underflow/overflow if TH1::StatOverflows(kTRUE) in case no range is set on the axis
7209  if (firstBinX == 1) firstBinX = 0;
7210  if (lastBinX == fXaxis.GetNbins() ) lastBinX += 1;
7211  }
7212  for (binx = firstBinX; binx <= lastBinX; binx++) {
7213  x = fXaxis.GetBinCenter(binx);
7214  //w = TMath::Abs(RetrieveBinContent(binx));
7215  // not sure what to do here if w < 0
7216  w = RetrieveBinContent(binx);
7217  err = TMath::Abs(GetBinError(binx));
7218  stats[0] += w;
7219  stats[1] += err*err;
7220  // statistics in x makes sense only for not labels histograms
7221  if (!labelHist) {
7222  stats[2] += w*x;
7223  stats[3] += w*x*x;
7224  }
7225  }
7226  // if (stats[0] < 0) {
7227  // // in case total is negative do something ??
7228  // stats[0] = 0;
7229  // }
7230  } else {
7231  stats[0] = fTsumw;
7232  stats[1] = fTsumw2;
7233  stats[2] = fTsumwx;
7234  stats[3] = fTsumwx2;
7235  }
7236 }
7237 
7238 ////////////////////////////////////////////////////////////////////////////////
7239 /// Replace current statistics with the values in array stats
7240 
7241 void TH1::PutStats(Double_t *stats)
7242 {
7243  fTsumw = stats[0];
7244  fTsumw2 = stats[1];
7245  fTsumwx = stats[2];
7246  fTsumwx2 = stats[3];
7247 }
7248 
7249 ////////////////////////////////////////////////////////////////////////////////
7250 /// Reset the statistics including the number of entries
7251 /// and replace with values calculates from bin content
7252 ///
7253 /// The number of entries is set to the total bin content or (in case of weighted histogram)
7254 /// to number of effective entries
7255 
7256 void TH1::ResetStats()
7257 {
7258  Double_t stats[kNstat] = {0};
7259  fTsumw = 0;
7260  fEntries = 1; // to force re-calculation of the statistics in TH1::GetStats
7261  GetStats(stats);
7262  PutStats(stats);
7264  // use effective entries for weighted histograms: (sum_w) ^2 / sum_w2
7265  if (fSumw2.fN > 0 && fTsumw > 0 && stats[1] > 0 ) fEntries = stats[0]*stats[0]/ stats[1];
7266 }
7267 
7268 ////////////////////////////////////////////////////////////////////////////////
7269 /// Return the sum of weights excluding under/overflows.
7270 
7272 {
7273  if (fBuffer) const_cast<TH1*>(this)->BufferEmpty();
7274 
7275  Int_t bin,binx,biny,binz;
7276  Double_t sum =0;
7277  for(binz=1; binz<=fZaxis.GetNbins(); binz++) {
7278  for(biny=1; biny<=fYaxis.GetNbins(); biny++) {
7279  for(binx=1; binx<=fXaxis.GetNbins(); binx++) {
7280  bin = GetBin(binx,biny,binz);
7281  sum += RetrieveBinContent(bin);
7282  }
7283  }
7284  }
7285  return sum;
7286 }
7287 
7288 ////////////////////////////////////////////////////////////////////////////////
7289 ///Return integral of bin contents. Only bins in the bins range are considered.
7290 ///
7291 /// By default the integral is computed as the sum of bin contents in the range.
7292 /// if option "width" is specified, the integral is the sum of
7293 /// the bin contents multiplied by the bin width in x.
7294 
7295 Double_t TH1::Integral(Option_t *option) const
7296 {
7297  return Integral(fXaxis.GetFirst(),fXaxis.GetLast(),option);
7298 }
7299 
7300 ////////////////////////////////////////////////////////////////////////////////
7301 /// Return integral of bin contents in range [binx1,binx2].
7302 ///
7303 /// By default the integral is computed as the sum of bin contents in the range.
7304 /// if option "width" is specified, the integral is the sum of
7305 /// the bin contents multiplied by the bin width in x.
7306 
7307 Double_t TH1::Integral(Int_t binx1, Int_t binx2, Option_t *option) const
7308 {
7309  double err = 0;
7310  return DoIntegral(binx1,binx2,0,-1,0,-1,err,option);
7311 }
7312 
7313 ////////////////////////////////////////////////////////////////////////////////
7314 /// Return integral of bin contents in range [binx1,binx2] and its error.
7315 ///
7316 /// By default the integral is computed as the sum of bin contents in the range.
7317 /// if option "width" is specified, the integral is the sum of
7318 /// the bin contents multiplied by the bin width in x.
7319 /// the error is computed using error propagation from the bin errors assuming that
7320 /// all the bins are uncorrelated
7321 
7322 Double_t TH1::IntegralAndError(Int_t binx1, Int_t binx2, Double_t & error, Option_t *option) const
7323 {
7324  return DoIntegral(binx1,binx2,0,-1,0,-1,error,option,kTRUE);
7325 }
7326 
7327 ////////////////////////////////////////////////////////////////////////////////
7328 /// Internal function compute integral and optionally the error between the limits
7329 /// specified by the bin number values working for all histograms (1D, 2D and 3D)
7330 
7331 Double_t TH1::DoIntegral(Int_t binx1, Int_t binx2, Int_t biny1, Int_t biny2, Int_t binz1, Int_t binz2, Double_t & error ,
7332  Option_t *option, Bool_t doError) const
7333 {
7334  if (fBuffer) ((TH1*)this)->BufferEmpty();
7335 
7336  Int_t nx = GetNbinsX() + 2;
7337  if (binx1 < 0) binx1 = 0;
7338  if (binx2 >= nx || binx2 < binx1) binx2 = nx - 1;
7339 
7340  if (GetDimension() > 1) {
7341  Int_t ny = GetNbinsY() + 2;
7342  if (biny1 < 0) biny1 = 0;
7343  if (biny2 >= ny || biny2 < biny1) biny2 = ny - 1;
7344  } else {
7345  biny1 = 0; biny2 = 0;
7346  }
7347 
7348  if (GetDimension() > 2) {
7349  Int_t nz = GetNbinsZ() + 2;
7350  if (binz1 < 0) binz1 = 0;
7351  if (binz2 >= nz || binz2 < binz1) binz2 = nz - 1;
7352  } else {
7353  binz1 = 0; binz2 = 0;
7354  }
7355 
7356  // - Loop on bins in specified range
7357  TString opt = option;
7358  opt.ToLower();
7359  Bool_t width = kFALSE;
7360  if (opt.Contains("width")) width = kTRUE;
7361 
7362 
7363  Double_t dx = 1., dy = .1, dz =.1;
7364  Double_t integral = 0;
7365  Double_t igerr2 = 0;
7366  for (Int_t binx = binx1; binx <= binx2; ++binx) {
7367  if (width) dx = fXaxis.GetBinWidth(binx);
7368  for (Int_t biny = biny1; biny <= biny2; ++biny) {
7369  if (width) dy = fYaxis.GetBinWidth(biny);
7370  for (Int_t binz = binz1; binz <= binz2; ++binz) {
7371  Int_t bin = GetBin(binx, biny, binz);
7372  Double_t dv = 0.0;
7373  if (width) {
7374  dz = fZaxis.GetBinWidth(binz);
7375  dv = dx * dy * dz;
7376  integral += RetrieveBinContent(bin) * dv;
7377  } else {
7378  integral += RetrieveBinContent(bin);
7379  }
7380  if (doError) {
7381  if (width) igerr2 += GetBinErrorSqUnchecked(bin) * dv * dv;
7382  else igerr2 += GetBinErrorSqUnchecked(bin);
7383  }
7384  }
7385  }
7386  }
7387 
7388  if (doError) error = TMath::Sqrt(igerr2);
7389  return integral;
7390 }
7391 
7392 ////////////////////////////////////////////////////////////////////////////////
7393 /// Statistical test of compatibility in shape between
7394 /// this histogram and h2, using the Anderson-Darling 2 sample test.
7395 ///
7396 /// The AD 2 sample test formula are derived from the paper
7397 /// F.W Scholz, M.A. Stephens "k-Sample Anderson-Darling Test".
7398 ///
7399 /// The test is implemented in root in the ROOT::Math::GoFTest class
7400 /// It is the same formula ( (6) in the paper), and also shown in
7401 /// [this preprint](http://arxiv.org/pdf/0804.0380v1.pdf)
7402 ///
7403 /// Binned data are considered as un-binned data
7404 /// with identical observation happening in the bin center.
7405 ///
7406 /// \param[in] option is a character string to specify options
7407 /// - "D" Put out a line of "Debug" printout
7408 /// - "T" Return the normalized A-D test statistic
7409 ///
7410 /// - Note1: Underflow and overflow are not considered in the test
7411 /// - Note2: The test works only for un-weighted histogram (i.e. representing counts)
7412 /// - Note3: The histograms are not required to have the same X axis
7413 /// - Note4: The test works only for 1-dimensional histograms
7414 
7415 Double_t TH1::AndersonDarlingTest(const TH1 *h2, Option_t *option) const
7416 {
7417  Double_t advalue = 0;
7418  Double_t pvalue = AndersonDarlingTest(h2, advalue);
7419 
7420  TString opt = option;
7421  opt.ToUpper();
7422  if (opt.Contains("D") ) {
7423  printf(" AndersonDarlingTest Prob = %g, AD TestStatistic = %g\n",pvalue,advalue);
7424  }
7425  if (opt.Contains("T") ) return advalue;
7426 
7427  return pvalue;
7428 }
7429 
7430 ////////////////////////////////////////////////////////////////////////////////
7431 /// Same function as above but returning also the test statistic value
7432 
7433 Double_t TH1::AndersonDarlingTest(const TH1 *h2, Double_t & advalue) const
7434 {
7435  if (GetDimension() != 1 || h2->GetDimension() != 1) {
7436  Error("AndersonDarlingTest","Histograms must be 1-D");
7437  return -1;
7438  }
7439 
7440  // empty the buffer. Probably we could add as an unbinned test
7441  if (fBuffer) ((TH1*)this)->BufferEmpty();
7442 
7443  // use the BinData class
7444  ROOT::Fit::BinData data1;
7445  ROOT::Fit::BinData data2;
7446 
7447  ROOT::Fit::FillData(data1, this, 0);
7448  ROOT::Fit::FillData(data2, h2, 0);
7449 
7450  double pvalue;
7451  ROOT::Math::GoFTest::AndersonDarling2SamplesTest(data1,data2, pvalue,advalue);
7452 
7453  return pvalue;
7454 }
7455 
7456 ////////////////////////////////////////////////////////////////////////////////
7457 /// Statistical test of compatibility in shape between
7458 /// this histogram and h2, using Kolmogorov test.
7459 /// Note that the KolmogorovTest (KS) test should in theory be used only for unbinned data
7460 /// and not for binned data as in the case of the histogram (see NOTE 3 below).
7461 /// So, before using this method blindly, read the NOTE 3.
7462 ///
7463 /// Default: Ignore under- and overflow bins in comparison
7464 ///
7465 /// \param[in] h2 histogram
7466 /// \param[in] option is a character string to specify options
7467 /// - "U" include Underflows in test (also for 2-dim)
7468 /// - "O" include Overflows (also valid for 2-dim)
7469 /// - "N" include comparison of normalizations
7470 /// - "D" Put out a line of "Debug" printout
7471 /// - "M" Return the Maximum Kolmogorov distance instead of prob
7472 /// - "X" Run the pseudo experiments post-processor with the following procedure:
7473 /// make pseudoexperiments based on random values from the parent distribution,
7474 /// compare the KS distance of the pseudoexperiment to the parent
7475 /// distribution, and count all the KS values above the value
7476 /// obtained from the original data to Monte Carlo distribution.
7477 /// The number of pseudo-experiments nEXPT is currently fixed at 1000.
7478 /// The function returns the probability.
7479 /// (thanks to Ben Kilminster to submit this procedure). Note that
7480 /// this option "X" is much slower.
7481 ///
7482 /// The returned function value is the probability of test
7483 /// (much less than one means NOT compatible)
7484 ///
7485 /// Code adapted by Rene Brun from original HBOOK routine HDIFF
7486 ///
7487 /// NOTE1
7488 /// A good description of the Kolmogorov test can be seen at:
7489 /// http://www.itl.nist.gov/div898/handbook/eda/section3/eda35g.htm
7490 ///
7491 /// NOTE2
7492 /// see also alternative function TH1::Chi2Test
7493 /// The Kolmogorov test is assumed to give better results than Chi2Test
7494 /// in case of histograms with low statistics.
7495 ///
7496 /// NOTE3 (Jan Conrad, Fred James)
7497 /// "The returned value PROB is calculated such that it will be
7498 /// uniformly distributed between zero and one for compatible histograms,
7499 /// provided the data are not binned (or the number of bins is very large
7500 /// compared with the number of events). Users who have access to unbinned
7501 /// data and wish exact confidence levels should therefore not put their data
7502 /// into histograms, but should call directly TMath::KolmogorovTest. On
7503 /// the other hand, since TH1 is a convenient way of collecting data and
7504 /// saving space, this function has been provided. However, the values of
7505 /// PROB for binned data will be shifted slightly higher than expected,
7506 /// depending on the effects of the binning. For example, when comparing two
7507 /// uniform distributions of 500 events in 100 bins, the values of PROB,
7508 /// instead of being exactly uniformly distributed between zero and one, have
7509 /// a mean value of about 0.56. We can apply a useful
7510 /// rule: As long as the bin width is small compared with any significant
7511 /// physical effect (for example the experimental resolution) then the binning
7512 /// cannot have an important effect. Therefore, we believe that for all
7513 /// practical purposes, the probability value PROB is calculated correctly
7514 /// provided the user is aware that:
7515 ///
7516 /// 1. The value of PROB should not be expected to have exactly the correct
7517 /// distribution for binned data.
7518 /// 2. The user is responsible for seeing to it that the bin widths are
7519 /// small compared with any physical phenomena of interest.
7520 /// 3. The effect of binning (if any) is always to make the value of PROB
7521 /// slightly too big. That is, setting an acceptance criterion of (PROB>0.05
7522 /// will assure that at most 5% of truly compatible histograms are rejected,
7523 /// and usually somewhat less."
7524 ///
7525 /// Note also that for GoF test of unbinned data ROOT provides also the class
7526 /// ROOT::Math::GoFTest. The class has also method for doing one sample tests
7527 /// (i.e. comparing the data with a given distribution).
7528 
7529 Double_t TH1::KolmogorovTest(const TH1 *h2, Option_t *option) const
7530 {
7531  TString opt = option;
7532  opt.ToUpper();
7533 
7534  Double_t prob = 0;
7535  TH1 *h1 = (TH1*)this;
7536  if (h2 == 0) return 0;
7537  const TAxis *axis1 = h1->GetXaxis();
7538  const TAxis *axis2 = h2->GetXaxis();
7539  Int_t ncx1 = axis1->GetNbins();
7540  Int_t ncx2 = axis2->GetNbins();
7541 
7542  // Check consistency of dimensions
7543  if (h1->GetDimension() != 1 || h2->GetDimension() != 1) {
7544  Error("KolmogorovTest","Histograms must be 1-D\n");
7545  return 0;
7546  }
7547 
7548  // Check consistency in number of channels
7549  if (ncx1 != ncx2) {
7550  Error("KolmogorovTest","Histograms have different number of bins, %d and %d\n",ncx1,ncx2);
7551  return 0;
7552  }
7553 
7554  // empty the buffer. Probably we could add as an unbinned test
7555  if (fBuffer) ((TH1*)this)->BufferEmpty();
7556 
7557  // Check consistency in bin edges
7558  for(Int_t i = 1; i <= axis1->GetNbins() + 1; ++i) {
7559  if(!TMath::AreEqualRel(axis1->GetBinLowEdge(i), axis2->GetBinLowEdge(i), 1.E-15)) {
7560  Error("KolmogorovTest","Histograms are not consistent: they have different bin edges");
7561  return 0;
7562  }
7563  }
7564 
7565  Bool_t afunc1 = kFALSE;
7566  Bool_t afunc2 = kFALSE;
7567  Double_t sum1 = 0, sum2 = 0;
7568  Double_t ew1, ew2, w1 = 0, w2 = 0;
7569  Int_t bin;
7570  Int_t ifirst = 1;
7571  Int_t ilast = ncx1;
7572  // integral of all bins (use underflow/overflow if option)
7573  if (opt.Contains("U")) ifirst = 0;
7574  if (opt.Contains("O")) ilast = ncx1 +1;
7575  for (bin = ifirst; bin <= ilast; bin++) {
7576  sum1 += h1->RetrieveBinContent(bin);
7577  sum2 += h2->RetrieveBinContent(bin);
7578  ew1 = h1->GetBinError(bin);
7579  ew2 = h2->GetBinError(bin);
7580  w1 += ew1*ew1;
7581  w2 += ew2*ew2;
7582  }
7583  if (sum1 == 0) {
7584  Error("KolmogorovTest","Histogram1 %s integral is zero\n",h1->GetName());
7585  return 0;
7586  }
7587  if (sum2 == 0) {
7588  Error("KolmogorovTest","Histogram2 %s integral is zero\n",h2->GetName());
7589  return 0;
7590  }
7591 
7592  // calculate the effective entries.
7593  // the case when errors are zero (w1 == 0 or w2 ==0) are equivalent to
7594  // compare to a function. In that case the rescaling is done only on sqrt(esum2) or sqrt(esum1)
7595  Double_t esum1 = 0, esum2 = 0;
7596  if (w1 > 0)
7597  esum1 = sum1 * sum1 / w1;
7598  else
7599  afunc1 = kTRUE; // use later for calculating z
7600 
7601  if (w2 > 0)
7602  esum2 = sum2 * sum2 / w2;
7603  else
7604  afunc2 = kTRUE; // use later for calculating z
7605 
7606  if (afunc2 && afunc1) {
7607  Error("KolmogorovTest","Errors are zero for both histograms\n");
7608  return 0;
7609  }
7610 
7611 
7612  Double_t s1 = 1/sum1;
7613  Double_t s2 = 1/sum2;
7614 
7615  // Find largest difference for Kolmogorov Test
7616  Double_t dfmax =0, rsum1 = 0, rsum2 = 0;
7617 
7618  for (bin=ifirst;bin<=ilast;bin++) {
7619  rsum1 += s1*h1->RetrieveBinContent(bin);
7620  rsum2 += s2*h2->RetrieveBinContent(bin);
7621  dfmax = TMath::Max(dfmax,TMath::Abs(rsum1-rsum2));
7622  }
7623 
7624  // Get Kolmogorov probability
7625  Double_t z, prb1=0, prb2=0, prb3=0;
7626 
7627  // case h1 is exact (has zero errors)
7628  if (afunc1)
7629  z = dfmax*TMath::Sqrt(esum2);
7630  // case h2 has zero errors
7631  else if (afunc2)
7632  z = dfmax*TMath::Sqrt(esum1);
7633  else
7634  // for comparison between two data sets
7635  z = dfmax*TMath::Sqrt(esum1*esum2/(esum1+esum2));
7636 
7637  prob = TMath::KolmogorovProb(z);
7638 
7639  // option N to combine normalization makes sense if both afunc1 and afunc2 are false
7640  if (opt.Contains("N") && !(afunc1 || afunc2 ) ) {
7641  // Combine probabilities for shape and normalization,
7642  prb1 = prob;
7643  Double_t d12 = esum1-esum2;
7644  Double_t chi2 = d12*d12/(esum1+esum2);
7645  prb2 = TMath::Prob(chi2,1);
7646  // see Eadie et al., section 11.6.2
7647  if (prob > 0 && prb2 > 0) prob *= prb2*(1-TMath::Log(prob*prb2));
7648  else prob = 0;
7649  }
7650  // X option. Pseudo-experiments post-processor to determine KS probability
7651  const Int_t nEXPT = 1000;
7652  if (opt.Contains("X") && !(afunc1 || afunc2 ) ) {
7653  Double_t dSEXPT;
7654  TH1 *h1_cpy = (TH1 *)(gDirectory ? gDirectory->CloneObject(this, kFALSE) : gROOT->CloneObject(this, kFALSE));
7655  TH1 *hExpt = (TH1*)(gDirectory ? gDirectory->CloneObject(this,kFALSE) : gROOT->CloneObject(this,kFALSE));
7656 
7657  if (h1_cpy->GetMinimum() < 0.0) {
7658  // With negative bins we can't draw random samples in a meaningful way.
7659  Warning("KolmogorovTest", "Detected bins with negative weights, these have been ignored and output might be "
7660  "skewed. Reduce number of bins for histogram?");
7661  while (h1_cpy->GetMinimum() < 0.0) {
7662  Int_t idx = h1_cpy->GetMinimumBin();
7663  h1_cpy->SetBinContent(idx, 0.0);
7664  }
7665  }
7666 
7667  // make nEXPT experiments (this should be a parameter)
7668  prb3 = 0;
7669  for (Int_t i=0; i < nEXPT; i++) {
7670  hExpt->Reset();
7671  hExpt->FillRandom(h1_cpy, (Int_t)esum2);
7672  dSEXPT = KolmogorovTest(hExpt,"M");
7673  if (dSEXPT>dfmax) prb3 += 1.0;
7674  }
7675  prb3 /= (Double_t)nEXPT;
7676  delete h1_cpy;
7677  delete hExpt;
7678  }
7679 
7680  // debug printout
7681  if (opt.Contains("D")) {
7682  printf(" Kolmo Prob h1 = %s, sum bin content =%g effective entries =%g\n",h1->GetName(),sum1,esum1);
7683  printf(" Kolmo Prob h2 = %s, sum bin content =%g effective entries =%g\n",h2->GetName(),sum2,esum2);
7684  printf(" Kolmo Prob = %g, Max Dist = %g\n",prob,dfmax);
7685  if (opt.Contains("N"))
7686  printf(" Kolmo Prob = %f for shape alone, =%f for normalisation alone\n",prb1,prb2);
7687  if (opt.Contains("X"))
7688  printf(" Kolmo Prob = %f with %d pseudo-experiments\n",prb3,nEXPT);
7689  }
7690  // This numerical error condition should never occur:
7691  if (TMath::Abs(rsum1-1) > 0.002) Warning("KolmogorovTest","Numerical problems with h1=%s\n",h1->GetName());
7692  if (TMath::Abs(rsum2-1) > 0.002) Warning("KolmogorovTest","Numerical problems with h2=%s\n",h2->GetName());
7693 
7694  if(opt.Contains("M")) return dfmax;
7695  else if(opt.Contains("X")) return prb3;
7696  else return prob;
7697 }
7698 
7699 ////////////////////////////////////////////////////////////////////////////////
7700 /// Replace bin contents by the contents of array content
7701 
7702 void TH1::SetContent(const Double_t *content)
7703 {
7704  fEntries = fNcells;
7705  fTsumw = 0;
7706  for (Int_t i = 0; i < fNcells; ++i) UpdateBinContent(i, content[i]);
7707 }
7708 
7709 ////////////////////////////////////////////////////////////////////////////////
7710 /// Return contour values into array levels if pointer levels is non zero.
7711 ///
7712 /// The function returns the number of contour levels.
7713 /// see GetContourLevel to return one contour only
7714 
7716 {
7717  Int_t nlevels = fContour.fN;
7718  if (levels) {
7719  if (nlevels == 0) {
7720  nlevels = 20;
7721  SetContour(nlevels);
7722  } else {
7723  if (TestBit(kUserContour) == 0) SetContour(nlevels);
7724  }
7725  for (Int_t level=0; level<nlevels; level++) levels[level] = fContour.fArray[level];
7726  }
7727  return nlevels;
7728 }
7729 
7730 ////////////////////////////////////////////////////////////////////////////////
7731 /// Return value of contour number level.
7732 /// Use GetContour to return the array of all contour levels
7733 
7734 Double_t TH1::GetContourLevel(Int_t level) const
7735 {
7736  return (level >= 0 && level < fContour.fN) ? fContour.fArray[level] : 0.0;
7737 }
7738 
7739 ////////////////////////////////////////////////////////////////////////////////
7740 /// Return the value of contour number "level" in Pad coordinates.
7741 /// ie: if the Pad is in log scale along Z it returns le log of the contour level
7742 /// value. See GetContour to return the array of all contour levels
7743 
7745 {
7746  if (level <0 || level >= fContour.fN) return 0;
7747  Double_t zlevel = fContour.fArray[level];
7748 
7749  // In case of user defined contours and Pad in log scale along Z,
7750  // fContour.fArray doesn't contain the log of the contour whereas it does
7751  // in case of equidistant contours.
7752  if (gPad && gPad->GetLogz() && TestBit(kUserContour)) {
7753  if (zlevel <= 0) return 0;
7754  zlevel = TMath::Log10(zlevel);
7755  }
7756  return zlevel;
7757 }
7758 
7759 ////////////////////////////////////////////////////////////////////////////////
7760 /// Set the maximum number of entries to be kept in the buffer.
7761 
7762 void TH1::SetBuffer(Int_t buffersize, Option_t * /*option*/)
7763 {
7764  if (fBuffer) {
7765  BufferEmpty();
7766  delete [] fBuffer;
7767  fBuffer = 0;
7768  }
7769  if (buffersize <= 0) {
7770  fBufferSize = 0;
7771  return;
7772  }
7773  if (buffersize < 100) buffersize = 100;
7774  fBufferSize = 1 + buffersize*(fDimension+1);
7775  fBuffer = new Double_t[fBufferSize];
7776  memset(fBuffer,0,sizeof(Double_t)*fBufferSize);
7777 }
7778 
7779 ////////////////////////////////////////////////////////////////////////////////
7780 /// Set the number and values of contour levels.
7781 ///
7782 /// By default the number of contour levels is set to 20. The contours values
7783 /// in the array "levels" should be specified in increasing order.
7784 ///
7785 /// if argument levels = 0 or missing, equidistant contours are computed
7786 
7787 void TH1::SetContour(Int_t nlevels, const Double_t *levels)
7788 {
7789  Int_t level;
7791  if (nlevels <=0 ) {
7792  fContour.Set(0);
7793  return;
7794  }
7795  fContour.Set(nlevels);
7796 
7797  // - Contour levels are specified
7798  if (levels) {
7800  for (level=0; level<nlevels; level++) fContour.fArray[level] = levels[level];
7801  } else {
7802  // - contour levels are computed automatically as equidistant contours
7803  Double_t zmin = GetMinimum();
7804  Double_t zmax = GetMaximum();
7805  if ((zmin == zmax) && (zmin != 0)) {
7806  zmax += 0.01*TMath::Abs(zmax);
7807  zmin -= 0.01*TMath::Abs(zmin);
7808  }
7809  Double_t dz = (zmax-zmin)/Double_t(nlevels);
7810  if (gPad && gPad->GetLogz()) {
7811  if (zmax <= 0) return;
7812  if (zmin <= 0) zmin = 0.001*zmax;
7813  zmin = TMath::Log10(zmin);
7814  zmax = TMath::Log10(zmax);
7815  dz = (zmax-zmin)/Double_t(nlevels);
7816  }
7817  for (level=0; level<nlevels; level++) {
7818  fContour.fArray[level] = zmin + dz*Double_t(level);
7819  }
7820  }
7821 }
7822 
7823 ////////////////////////////////////////////////////////////////////////////////
7824 /// Set value for one contour level.
7825 
7826 void TH1::SetContourLevel(Int_t level, Double_t value)
7827 {
7828  if (level < 0 || level >= fContour.fN) return;
7830  fContour.fArray[level] = value;
7831 }
7832 
7833 ////////////////////////////////////////////////////////////////////////////////
7834 /// Return maximum value smaller than maxval of bins in the range,
7835 /// unless the value has been overridden by TH1::SetMaximum,
7836 /// in which case it returns that value. (This happens, for example,
7837 /// when the histogram is drawn and the y or z axis limits are changed
7838 ///
7839 /// To get the maximum value of bins in the histogram regardless of
7840 /// whether the value has been overridden, use
7841 ///
7842 /// ~~~ {.cpp}
7843 /// h->GetBinContent(h->GetMaximumBin())
7844 /// ~~~
7845 
7846 Double_t TH1::GetMaximum(Double_t maxval) const
7847 {
7848  if (fMaximum != -1111) return fMaximum;
7849 
7850  // empty the buffer
7851  if (fBuffer) ((TH1*)this)->BufferEmpty();
7852 
7853  Int_t bin, binx, biny, binz;
7854  Int_t xfirst = fXaxis.GetFirst();
7855  Int_t xlast = fXaxis.GetLast();
7856  Int_t yfirst = fYaxis.GetFirst();
7857  Int_t ylast = fYaxis.GetLast();
7858  Int_t zfirst = fZaxis.GetFirst();
7859  Int_t zlast = fZaxis.GetLast();
7860  Double_t maximum = -FLT_MAX, value;
7861  for (binz=zfirst;binz<=zlast;binz++) {
7862  for (biny=yfirst;biny<=ylast;biny++) {
7863  for (binx=xfirst;binx<=xlast;binx++) {
7864  bin = GetBin(binx,biny,binz);
7865  value = RetrieveBinContent(bin);
7866  if (value > maximum && value < maxval) maximum = value;
7867  }
7868  }
7869  }
7870  return maximum;
7871 }
7872 
7873 ////////////////////////////////////////////////////////////////////////////////
7874 /// Return location of bin with maximum value in the range.
7875 
7876 Int_t TH1::GetMaximumBin() const
7877 {
7878  Int_t locmax, locmay, locmaz;
7879  return GetMaximumBin(locmax, locmay, locmaz);
7880 }
7881 
7882 ////////////////////////////////////////////////////////////////////////////////
7883 /// Return location of bin with maximum value in the range.
7884 
7885 Int_t TH1::GetMaximumBin(Int_t &locmax, Int_t &locmay, Int_t &locmaz) const
7886 {
7887  // empty the buffer
7888  if (fBuffer) ((TH1*)this)->BufferEmpty();
7889 
7890  Int_t bin, binx, biny, binz;
7891  Int_t locm;
7892  Int_t xfirst = fXaxis.GetFirst();
7893  Int_t xlast = fXaxis.GetLast();
7894  Int_t yfirst = fYaxis.GetFirst();
7895  Int_t ylast = fYaxis.GetLast();
7896  Int_t zfirst = fZaxis.GetFirst();
7897  Int_t zlast = fZaxis.GetLast();
7898  Double_t maximum = -FLT_MAX, value;
7899  locm = locmax = locmay = locmaz = 0;
7900  for (binz=zfirst;binz<=zlast;binz++) {
7901  for (biny=yfirst;biny<=ylast;biny++) {
7902  for (binx=xfirst;binx<=xlast;binx++) {
7903  bin = GetBin(binx,biny,binz);
7904  value = RetrieveBinContent(bin);
7905  if (value > maximum) {
7906  maximum = value;
7907  locm = bin;
7908  locmax = binx;
7909  locmay = biny;
7910  locmaz = binz;
7911  }
7912  }
7913  }
7914  }
7915  return locm;
7916 }
7917 
7918 ////////////////////////////////////////////////////////////////////////////////
7919 /// Return minimum value larger than minval of bins in the range,
7920 /// unless the value has been overridden by TH1::SetMinimum,
7921 /// in which case it returns that value. (This happens, for example,
7922 /// when the histogram is drawn and the y or z axis limits are changed
7923 ///
7924 /// To get the minimum value of bins in the histogram regardless of
7925 /// whether the value has been overridden, use
7926 ///
7927 /// ~~~ {.cpp}
7928 /// h->GetBinContent(h->GetMinimumBin())
7929 /// ~~~
7930 
7931 Double_t TH1::GetMinimum(Double_t minval) const
7932 {
7933  if (fMinimum != -1111) return fMinimum;
7934 
7935  // empty the buffer
7936  if (fBuffer) ((TH1*)this)->BufferEmpty();
7937 
7938  Int_t bin, binx, biny, binz;
7939  Int_t xfirst = fXaxis.GetFirst();
7940  Int_t xlast = fXaxis.GetLast();
7941  Int_t yfirst = fYaxis.GetFirst();
7942  Int_t ylast = fYaxis.GetLast();
7943  Int_t zfirst = fZaxis.GetFirst();
7944  Int_t zlast = fZaxis.GetLast();
7945  Double_t minimum=FLT_MAX, value;
7946  for (binz=zfirst;binz<=zlast;binz++) {
7947  for (biny=yfirst;biny<=ylast;biny++) {
7948  for (binx=xfirst;binx<=xlast;binx++) {
7949  bin = GetBin(binx,biny,binz);
7950  value = RetrieveBinContent(bin);
7951  if (value < minimum && value > minval) minimum = value;
7952  }
7953  }
7954  }
7955  return minimum;
7956 }
7957 
7958 ////////////////////////////////////////////////////////////////////////////////
7959 /// Return location of bin with minimum value in the range.
7960 
7961 Int_t TH1::GetMinimumBin() const
7962 {
7963  Int_t locmix, locmiy, locmiz;
7964  return GetMinimumBin(locmix, locmiy, locmiz);
7965 }
7966 
7967 ////////////////////////////////////////////////////////////////////////////////
7968 /// Return location of bin with minimum value in the range.
7969 
7970 Int_t TH1::GetMinimumBin(Int_t &locmix, Int_t &locmiy, Int_t &locmiz) const
7971 {
7972  // empty the buffer
7973  if (fBuffer) ((TH1*)this)->BufferEmpty();
7974 
7975  Int_t bin, binx, biny, binz;
7976  Int_t locm;
7977  Int_t xfirst = fXaxis.GetFirst();
7978  Int_t xlast = fXaxis.GetLast();
7979  Int_t yfirst = fYaxis.GetFirst();
7980  Int_t ylast = fYaxis.GetLast();
7981  Int_t zfirst = fZaxis.GetFirst();
7982  Int_t zlast = fZaxis.GetLast();
7983  Double_t minimum = FLT_MAX, value;
7984  locm = locmix = locmiy = locmiz = 0;
7985  for (binz=zfirst;binz<=zlast;binz++) {
7986  for (biny=yfirst;biny<=ylast;biny++) {
7987  for (binx=xfirst;binx<=xlast;binx++) {
7988  bin = GetBin(binx,biny,binz);
7989  value = RetrieveBinContent(bin);
7990  if (value < minimum) {
7991  minimum = value;
7992  locm = bin;
7993  locmix = binx;
7994  locmiy = biny;
7995  locmiz = binz;
7996  }
7997  }
7998  }
7999  }
8000  return locm;
8001 }
8002 
8003 ///////////////////////////////////////////////////////////////////////////////
8004 /// Retrieve the minimum and maximum values in the histogram
8005 ///
8006 /// This will not return a cached value and will always search the
8007 /// histogram for the min and max values. The user can condition whether
8008 /// or not to call this with the GetMinimumStored() and GetMaximumStored()
8009 /// methods. If the cache is empty, then the value will be -1111. Users
8010 /// can then use the SetMinimum() or SetMaximum() methods to cache the results.
8011 /// For example, the following recipe will make efficient use of this method
8012 /// and the cached minimum and maximum values.
8013 //
8014 /// \code{.cpp}
8015 /// Double_t currentMin = pHist->GetMinimumStored();
8016 /// Double_t currentMax = pHist->GetMaximumStored();
8017 /// if ((currentMin == -1111) || (currentMax == -1111)) {
8018 /// pHist->GetMinimumAndMaximum(currentMin, currentMax);
8019 /// pHist->SetMinimum(currentMin);
8020 /// pHist->SetMaximum(currentMax);
8021 /// }
8022 /// \endcode
8023 ///
8024 /// \param min reference to variable that will hold found minimum value
8025 /// \param max reference to variable that will hold found maximum value
8026 
8027 void TH1::GetMinimumAndMaximum(Double_t& min, Double_t& max) const
8028 {
8029  // empty the buffer
8030  if (fBuffer) ((TH1*)this)->BufferEmpty();
8031 
8032  Int_t bin, binx, biny, binz;
8033  Int_t xfirst = fXaxis.GetFirst();
8034  Int_t xlast = fXaxis.GetLast();
8035  Int_t yfirst = fYaxis.GetFirst();
8036  Int_t ylast = fYaxis.GetLast();
8037  Int_t zfirst = fZaxis.GetFirst();
8038  Int_t zlast = fZaxis.GetLast();
8039  min=TMath::Infinity();
8040  max=-TMath::Infinity();
8041  Double_t value;
8042  for (binz=zfirst;binz<=zlast;binz++) {
8043  for (biny=yfirst;biny<=ylast;biny++) {
8044  for (binx=xfirst;binx<=xlast;binx++) {
8045  bin = GetBin(binx,biny,binz);
8046  value = RetrieveBinContent(bin);
8047  if (value < min) min = value;
8048  if (value > max) max = value;
8049  }
8050  }
8051  }
8052 }
8053 
8054 ////////////////////////////////////////////////////////////////////////////////
8055 /// Redefine x axis parameters.
8056 ///
8057 /// The X axis parameters are modified.
8058 /// The bins content array is resized
8059 /// if errors (Sumw2) the errors array is resized
8060 /// The previous bin contents are lost
8061 /// To change only the axis limits, see TAxis::SetRange
8062 
8064 {
8065  if (GetDimension() != 1) {
8066  Error("SetBins","Operation only valid for 1-d histograms");
8067  return;
8068  }
8069  fXaxis.SetRange(0,0);
8070  fXaxis.Set(nx,xmin,xmax);
8071  fYaxis.Set(1,0,1);
8072  fZaxis.Set(1,0,1);
8073  fNcells = nx+2;
8075  if (fSumw2.fN) {
8076  fSumw2.Set(fNcells);
8077  }
8078 }
8079 
8080 ////////////////////////////////////////////////////////////////////////////////
8081 /// Redefine x axis parameters with variable bin sizes.
8082 ///
8083 /// The X axis parameters are modified.
8084 /// The bins content array is resized
8085 /// if errors (Sumw2) the errors array is resized
8086 /// The previous bin contents are lost
8087 /// To change only the axis limits, see TAxis::SetRange
8088 /// xBins is supposed to be of length nx+1
8089 
8090 void TH1::SetBins(Int_t nx, const Double_t *xBins)
8091 {
8092  if (GetDimension() != 1) {
8093  Error("SetBins","Operation only valid for 1-d histograms");
8094  return;
8095  }
8096  fXaxis.SetRange(0,0);
8097  fXaxis.Set(nx,xBins);
8098  fYaxis.Set(1,0,1);
8099  fZaxis.Set(1,0,1);
8100  fNcells = nx+2;
8102  if (fSumw2.fN) {
8103  fSumw2.Set(fNcells);
8104  }
8105 }
8106 
8107 ////////////////////////////////////////////////////////////////////////////////
8108 /// Redefine x and y axis parameters.
8109 ///
8110 /// The X and Y axis parameters are modified.
8111 /// The bins content array is resized
8112 /// if errors (Sumw2) the errors array is resized
8113 /// The previous bin contents are lost
8114 /// To change only the axis limits, see TAxis::SetRange
8115 
8117 {
8118  if (GetDimension() != 2) {
8119  Error("SetBins","Operation only valid for 2-D histograms");
8120  return;
8121  }
8122  fXaxis.SetRange(0,0);
8123  fYaxis.SetRange(0,0);
8124  fXaxis.Set(nx,xmin,xmax);
8125  fYaxis.Set(ny,ymin,ymax);
8126  fZaxis.Set(1,0,1);
8127  fNcells = (nx+2)*(ny+2);
8129  if (fSumw2.fN) {
8130  fSumw2.Set(fNcells);
8131  }
8132 }
8133 
8134 ////////////////////////////////////////////////////////////////////////////////
8135 /// Redefine x and y axis parameters with variable bin sizes.
8136 ///
8137 /// The X and Y axis parameters are modified.
8138 /// The bins content array is resized
8139 /// if errors (Sumw2) the errors array is resized
8140 /// The previous bin contents are lost
8141 /// To change only the axis limits, see TAxis::SetRange
8142 /// xBins is supposed to be of length nx+1, yBins is supposed to be of length ny+1
8143 
8144 void TH1::SetBins(Int_t nx, const Double_t *xBins, Int_t ny, const Double_t *yBins)
8145 {
8146  if (GetDimension() != 2) {
8147  Error("SetBins","Operation only valid for 2-D histograms");
8148  return;
8149  }
8150  fXaxis.SetRange(0,0);
8151  fYaxis.SetRange(0,0);
8152  fXaxis.Set(nx,xBins);
8153  fYaxis.Set(ny,yBins);
8154  fZaxis.Set(1,0,1);
8155  fNcells = (nx+2)*(ny+2);
8157  if (fSumw2.fN) {
8158  fSumw2.Set(fNcells);
8159  }
8160 }
8161 
8162 ////////////////////////////////////////////////////////////////////////////////
8163 /// Redefine x, y and z axis parameters.
8164 ///
8165 /// The X, Y and Z axis parameters are modified.
8166 /// The bins content array is resized
8167 /// if errors (Sumw2) the errors array is resized
8168 /// The previous bin contents are lost
8169 /// To change only the axis limits, see TAxis::SetRange
8170 
8172 {
8173  if (GetDimension() != 3) {
8174  Error("SetBins","Operation only valid for 3-D histograms");
8175  return;
8176  }
8177  fXaxis.SetRange(0,0);
8178  fYaxis.SetRange(0,0);
8179  fZaxis.SetRange(0,0);
8180  fXaxis.Set(nx,xmin,xmax);
8181  fYaxis.Set(ny,ymin,ymax);
8182  fZaxis.Set(nz,zmin,zmax);
8183  fNcells = (nx+2)*(ny+2)*(nz+2);
8185  if (fSumw2.fN) {
8186  fSumw2.Set(fNcells);
8187  }
8188 }
8189 
8190 ////////////////////////////////////////////////////////////////////////////////
8191 /// Redefine x, y and z axis parameters with variable bin sizes.
8192 ///
8193 /// The X, Y and Z axis parameters are modified.
8194 /// The bins content array is resized
8195 /// if errors (Sumw2) the errors array is resized
8196 /// The previous bin contents are lost
8197 /// To change only the axis limits, see TAxis::SetRange
8198 /// xBins is supposed to be of length nx+1, yBins is supposed to be of length ny+1,
8199 /// zBins is supposed to be of length nz+1
8200 
8201 void TH1::SetBins(Int_t nx, const Double_t *xBins, Int_t ny, const Double_t *yBins, Int_t nz, const Double_t *zBins)
8202 {
8203  if (GetDimension() != 3) {
8204  Error("SetBins","Operation only valid for 3-D histograms");
8205  return;
8206  }
8207  fXaxis.SetRange(0,0);
8208  fYaxis.SetRange(0,0);
8209  fZaxis.SetRange(0,0);
8210  fXaxis.Set(nx,xBins);
8211  fYaxis.Set(ny,yBins);
8212  fZaxis.Set(nz,zBins);
8213  fNcells = (nx+2)*(ny+2)*(nz+2);
8215  if (fSumw2.fN) {
8216  fSumw2.Set(fNcells);
8217  }
8218 }
8219 
8220 ////////////////////////////////////////////////////////////////////////////////
8221 /// By default when an histogram is created, it is added to the list
8222 /// of histogram objects in the current directory in memory.
8223 /// Remove reference to this histogram from current directory and add
8224 /// reference to new directory dir. dir can be 0 in which case the
8225 /// histogram does not belong to any directory.
8226 ///
8227 /// Note that the directory is not a real property of the histogram and
8228 /// it will not be copied when the histogram is copied or cloned.
8229 /// If the user wants to have the copied (cloned) histogram in the same
8230 /// directory, he needs to set again the directory using SetDirectory to the
8231 /// copied histograms
8232 
8233 void TH1::SetDirectory(TDirectory *dir)
8234 {
8235  if (fDirectory == dir) return;
8236  if (fDirectory) fDirectory->Remove(this);
8237  fDirectory = dir;
8238  if (fDirectory) {
8239  fFunctions->UseRWLock();
8240  fDirectory->Append(this);
8241  }
8242 }
8243 
8244 ////////////////////////////////////////////////////////////////////////////////
8245 /// Replace bin errors by values in array error.
8246 
8247 void TH1::SetError(const Double_t *error)
8248 {
8249  for (Int_t i = 0; i < fNcells; ++i) SetBinError(i, error[i]);
8250 }
8251 
8252 ////////////////////////////////////////////////////////////////////////////////
8253 /// Change the name of this histogram
8254 ///
8255 
8256 void TH1::SetName(const char *name)
8257 {
8258  // Histograms are named objects in a THashList.
8259  // We must update the hashlist if we change the name
8260  // We protect this operation
8262  if (fDirectory) fDirectory->Remove(this);
8263  fName = name;
8264  if (fDirectory) fDirectory->Append(this);
8265 }
8266 
8267 ////////////////////////////////////////////////////////////////////////////////
8268 /// Change the name and title of this histogram
8269 
8270 void TH1::SetNameTitle(const char *name, const char *title)
8271 {
8272  // Histograms are named objects in a THashList.
8273  // We must update the hashlist if we change the name
8274  SetName(name);
8275  SetTitle(title);
8276 }
8277 
8278 ////////////////////////////////////////////////////////////////////////////////
8279 /// Set statistics option on/off
8280 ///
8281 /// By default, the statistics box is drawn.
8282 /// The paint options can be selected via gStyle->SetOptStats.
8283 /// This function sets/resets the kNoStats bin in the histogram object.
8284 /// It has priority over the Style option.
8285 
8286 void TH1::SetStats(Bool_t stats)
8287 {
8288  ResetBit(kNoStats);
8289  if (!stats) {
8290  SetBit(kNoStats);
8291  //remove the "stats" object from the list of functions
8292  if (fFunctions) {
8293  TObject *obj = fFunctions->FindObject("stats");
8294  if (obj) {
8295  fFunctions->Remove(obj);
8296  delete obj;
8297  }
8298  }
8299  }
8300 }
8301 
8302 ////////////////////////////////////////////////////////////////////////////////
8303 /// Create structure to store sum of squares of weights.
8304 ///
8305 /// if histogram is already filled, the sum of squares of weights
8306 /// is filled with the existing bin contents
8307 ///
8308 /// The error per bin will be computed as sqrt(sum of squares of weight)
8309 /// for each bin.
8310 ///
8311 /// This function is automatically called when the histogram is created
8312 /// if the static function TH1::SetDefaultSumw2 has been called before.
8313 /// If flag = false the structure is deleted
8314 
8315 void TH1::Sumw2(Bool_t flag)
8316 {
8317  if (!flag) {
8318  // clear the array if existing - do nothing otherwise
8319  if (fSumw2.fN > 0 ) fSumw2.Set(0);
8320  return;
8321  }
8322 
8323  if (fSumw2.fN == fNcells) {
8324  if (!fgDefaultSumw2 )
8325  Warning("Sumw2","Sum of squares of weights structure already created");
8326  return;
8327  }
8328 
8329  fSumw2.Set(fNcells);
8330 
8331  // empty the buffer
8332  if (fBuffer) BufferEmpty();
8333 
8334  if (fEntries > 0)
8335  for (Int_t i = 0; i < fNcells; ++i)
8337 }
8338 
8339 ////////////////////////////////////////////////////////////////////////////////
8340 /// Return pointer to function with name.
8341 ///
8342 ///
8343 /// Functions such as TH1::Fit store the fitted function in the list of
8344 /// functions of this histogram.
8345 
8346 TF1 *TH1::GetFunction(const char *name) const
8347 {
8348  return (TF1*)fFunctions->FindObject(name);
8349 }
8350 
8351 ////////////////////////////////////////////////////////////////////////////////
8352 /// Return value of error associated to bin number bin.
8353 ///
8354 /// if the sum of squares of weights has been defined (via Sumw2),
8355 /// this function returns the sqrt(sum of w2).
8356 /// otherwise it returns the sqrt(contents) for this bin.
8357 
8358 Double_t TH1::GetBinError(Int_t bin) const
8359 {
8360  if (bin < 0) bin = 0;
8361  if (bin >= fNcells) bin = fNcells-1;
8362  if (fBuffer) ((TH1*)this)->BufferEmpty();
8363  if (fSumw2.fN) return TMath::Sqrt(fSumw2.fArray[bin]);
8364 
8366 }
8367 
8368 ////////////////////////////////////////////////////////////////////////////////
8369 /// Return lower error associated to bin number bin.
8370 ///
8371 /// The error will depend on the statistic option used will return
8372 /// the binContent - lower interval value
8373 
8375 {
8376  if (fBinStatErrOpt == kNormal) return GetBinError(bin);
8377  // in case of weighted histogram check if it is really weighted
8378  if (fSumw2.fN && fTsumw != fTsumw2) return GetBinError(bin);
8379 
8380  if (bin < 0) bin = 0;
8381  if (bin >= fNcells) bin = fNcells-1;
8382  if (fBuffer) ((TH1*)this)->BufferEmpty();
8383 
8384  Double_t alpha = 1.- 0.682689492;
8385  if (fBinStatErrOpt == kPoisson2) alpha = 0.05;
8386 
8387  Double_t c = RetrieveBinContent(bin);
8388  Int_t n = int(c);
8389  if (n < 0) {
8390  Warning("GetBinErrorLow","Histogram has negative bin content-force usage to normal errors");
8391  ((TH1*)this)->fBinStatErrOpt = kNormal;
8392  return GetBinError(bin);
8393  }
8394 
8395  if (n == 0) return 0;
8396  return c - ROOT::Math::gamma_quantile( alpha/2, n, 1.);
8397 }
8398 
8399 ////////////////////////////////////////////////////////////////////////////////
8400 /// Return upper error associated to bin number bin.
8401 ///
8402 /// The error will depend on the statistic option used will return
8403 /// the binContent - upper interval value
8404 
8406 {
8407  if (fBinStatErrOpt == kNormal) return GetBinError(bin);
8408  // in case of weighted histogram check if it is really weighted
8409  if (fSumw2.fN && fTsumw != fTsumw2) return GetBinError(bin);
8410  if (bin < 0) bin = 0;
8411  if (bin >= fNcells) bin = fNcells-1;
8412  if (fBuffer) ((TH1*)this)->BufferEmpty();
8413 
8414  Double_t alpha = 1.- 0.682689492;
8415  if (fBinStatErrOpt == kPoisson2) alpha = 0.05;
8416 
8417  Double_t c = RetrieveBinContent(bin);
8418  Int_t n = int(c);
8419  if (n < 0) {
8420  Warning("GetBinErrorUp","Histogram has negative bin content-force usage to normal errors");
8421  ((TH1*)this)->fBinStatErrOpt = kNormal;
8422  return GetBinError(bin);
8423  }
8424 
8425  // for N==0 return an upper limit at 0.68 or (1-alpha)/2 ?
8426  // decide to return always (1-alpha)/2 upper interval
8427  //if (n == 0) return ROOT::Math::gamma_quantile_c(alpha,n+1,1);
8428  return ROOT::Math::gamma_quantile_c( alpha/2, n+1, 1) - c;
8429 }
8430 
8431 //L.M. These following getters are useless and should be probably deprecated
8432 ////////////////////////////////////////////////////////////////////////////////
8433 /// Return bin center for 1D histogram.
8434 /// Better to use h1.GetXaxis().GetBinCenter(bin)
8435 
8436 Double_t TH1::GetBinCenter(Int_t bin) const
8437 {
8438  if (fDimension == 1) return fXaxis.GetBinCenter(bin);
8439  Error("GetBinCenter","Invalid method for a %d-d histogram - return a NaN",fDimension);
8440  return TMath::QuietNaN();
8441 }
8442 
8443 ////////////////////////////////////////////////////////////////////////////////
8444 /// Return bin lower edge for 1D histogram.
8445 /// Better to use h1.GetXaxis().GetBinLowEdge(bin)
8446 
8448 {
8449  if (fDimension == 1) return fXaxis.GetBinLowEdge(bin);
8450  Error("GetBinLowEdge","Invalid method for a %d-d histogram - return a NaN",fDimension);
8451  return TMath::QuietNaN();
8452 }
8453 
8454 ////////////////////////////////////////////////////////////////////////////////
8455 /// Return bin width for 1D histogram.
8456 /// Better to use h1.GetXaxis().GetBinWidth(bin)
8457 
8458 Double_t TH1::GetBinWidth(Int_t bin) const
8459 {
8460  if (fDimension == 1) return fXaxis.GetBinWidth(bin);
8461  Error("GetBinWidth","Invalid method for a %d-d histogram - return a NaN",fDimension);
8462  return TMath::QuietNaN();
8463 }
8464 
8465 ////////////////////////////////////////////////////////////////////////////////
8466 /// Fill array with center of bins for 1D histogram
8467 /// Better to use h1.GetXaxis().GetCenter(center)
8468 
8469 void TH1::GetCenter(Double_t *center) const
8470 {
8471  if (fDimension == 1) {
8472  fXaxis.GetCenter(center);
8473  return;
8474  }
8475  Error("GetCenter","Invalid method for a %d-d histogram ",fDimension);
8476 }
8477 
8478 ////////////////////////////////////////////////////////////////////////////////
8479 /// Fill array with low edge of bins for 1D histogram
8480 /// Better to use h1.GetXaxis().GetLowEdge(edge)
8481 
8482 void TH1::GetLowEdge(Double_t *edge) const
8483 {
8484  if (fDimension == 1) {
8485  fXaxis.GetLowEdge(edge);
8486  return;
8487  }
8488  Error("GetLowEdge","Invalid method for a %d-d histogram ",fDimension);
8489 }
8490 
8491 ////////////////////////////////////////////////////////////////////////////////
8492 /// Set the bin Error
8493 /// Note that this resets the bin eror option to be of Normal Type and for the
8494 /// non-empty bin the bin error is set by default to the square root of their content,
8495 /// but in case the user sets explicitly a new bin content (using SetBinContent) he needs to provide also
8496 /// the error, otherwise a default error = 0 is used.
8497 ///
8498 /// See convention for numbering bins in TH1::GetBin
8499 
8500 void TH1::SetBinError(Int_t bin, Double_t error)
8501 {
8502  if (!fSumw2.fN) Sumw2();
8503  if (bin < 0 || bin>= fSumw2.fN) return;
8504  fSumw2.fArray[bin] = error * error;
8505  // reset the bin error option
8507 }
8508 
8509 ////////////////////////////////////////////////////////////////////////////////
8510 /// Set bin content
8511 /// see convention for numbering bins in TH1::GetBin
8512 /// In case the bin number is greater than the number of bins and
8513 /// the timedisplay option is set or CanExtendAllAxes(),
8514 /// the number of bins is automatically doubled to accommodate the new bin
8515 
8516 void TH1::SetBinContent(Int_t bin, Double_t content)
8517 {
8518  fEntries++;
8519  fTsumw = 0;
8520  if (bin < 0) return;
8521  if (bin >= fNcells-1) {
8522  if (fXaxis.GetTimeDisplay() || CanExtendAllAxes() ) {
8523  while (bin >= fNcells-1) LabelsInflate();
8524  } else {
8525  if (bin == fNcells-1) UpdateBinContent(bin, content);
8526  return;
8527  }
8528  }
8529  UpdateBinContent(bin, content);
8530 }
8531 
8532 ////////////////////////////////////////////////////////////////////////////////
8533 /// See convention for numbering bins in TH1::GetBin
8534 
8535 void TH1::SetBinError(Int_t binx, Int_t biny, Double_t error)
8536 {
8537  if (binx < 0 || binx > fXaxis.GetNbins() + 1) return;
8538  if (biny < 0 || biny > fYaxis.GetNbins() + 1) return;
8539  SetBinError(GetBin(binx, biny), error);
8540 }
8541 
8542 ////////////////////////////////////////////////////////////////////////////////
8543 /// See convention for numbering bins in TH1::GetBin
8544 
8545 void TH1::SetBinError(Int_t binx, Int_t biny, Int_t binz, Double_t error)
8546 {
8547  if (binx < 0 || binx > fXaxis.GetNbins() + 1) return;
8548  if (biny < 0 || biny > fYaxis.GetNbins() + 1) return;
8549  if (binz < 0 || binz > fZaxis.GetNbins() + 1) return;
8550  SetBinError(GetBin(binx, biny, binz), error);
8551 }
8552 
8553 ////////////////////////////////////////////////////////////////////////////////
8554 /// This function calculates the background spectrum in this histogram.
8555 /// The background is returned as a histogram.
8556 ///
8557 /// \param[in] niter number of iterations (default value = 2)
8558 /// Increasing niter make the result smoother and lower.
8559 /// \param[in] option may contain one of the following options
8560 /// - to set the direction parameter
8561 /// "BackDecreasingWindow". By default the direction is BackIncreasingWindow
8562 /// - filterOrder-order of clipping filter (default "BackOrder2")
8563 /// possible values= "BackOrder4" "BackOrder6" "BackOrder8"
8564 /// - "nosmoothing" - if selected, the background is not smoothed
8565 /// By default the background is smoothed.
8566 /// - smoothWindow - width of smoothing window, (default is "BackSmoothing3")
8567 /// possible values= "BackSmoothing5" "BackSmoothing7" "BackSmoothing9"
8568 /// "BackSmoothing11" "BackSmoothing13" "BackSmoothing15"
8569 /// - "nocompton" - if selected the estimation of Compton edge
8570 /// will be not be included (by default the compton estimation is set)
8571 /// - "same" if this option is specified, the resulting background
8572 /// histogram is superimposed on the picture in the current pad.
8573 /// This option is given by default.
8574 ///
8575 /// NOTE that the background is only evaluated in the current range of this histogram.
8576 /// i.e., if this has a bin range (set via h->GetXaxis()->SetRange(binmin, binmax),
8577 /// the returned histogram will be created with the same number of bins
8578 /// as this input histogram, but only bins from binmin to binmax will be filled
8579 /// with the estimated background.
8580 
8581 TH1 *TH1::ShowBackground(Int_t niter, Option_t *option)
8582 {
8583 
8584  return (TH1*)gROOT->ProcessLineFast(Form("TSpectrum::StaticBackground((TH1*)0x%lx,%d,\"%s\")",
8585  (ULong_t)this, niter, option));
8586 }
8587 
8588 ////////////////////////////////////////////////////////////////////////////////
8589 /// Interface to TSpectrum::Search.
8590 /// The function finds peaks in this histogram where the width is > sigma
8591 /// and the peak maximum greater than threshold*maximum bin content of this.
8592 /// For more details see TSpectrum::Search.
8593 /// Note the difference in the default value for option compared to TSpectrum::Search
8594 /// option="" by default (instead of "goff").
8595 
8596 Int_t TH1::ShowPeaks(Double_t sigma, Option_t *option, Double_t threshold)
8597 {
8598  return (Int_t)gROOT->ProcessLineFast(Form("TSpectrum::StaticSearch((TH1*)0x%lx,%g,\"%s\",%g)",
8599  (ULong_t)this, sigma, option, threshold));
8600 }
8601 
8602 ////////////////////////////////////////////////////////////////////////////////
8603 /// For a given transform (first parameter), fills the histogram (second parameter)
8604 /// with the transform output data, specified in the third parameter
8605 /// If the 2nd parameter h_output is empty, a new histogram (TH1D or TH2D) is created
8606 /// and the user is responsible for deleting it.
8607 ///
8608 /// Available options:
8609 /// - "RE" - real part of the output
8610 /// - "IM" - imaginary part of the output
8611 /// - "MAG" - magnitude of the output
8612 /// - "PH" - phase of the output
8613 
8614 TH1* TH1::TransformHisto(TVirtualFFT *fft, TH1* h_output, Option_t *option)
8615 {
8616  if (!fft || !fft->GetN() ) {
8617  ::Error("TransformHisto","Invalid FFT transform class");
8618  return 0;
8619  }
8620 
8621  if (fft->GetNdim()>2){
8622  ::Error("TransformHisto","Only 1d and 2D transform are supported");
8623  return 0;
8624  }
8625  Int_t binx,biny;
8626  TString opt = option;
8627  opt.ToUpper();
8628  Int_t *n = fft->GetN();
8629  TH1 *hout=0;
8630  if (h_output) {
8631  hout = h_output;
8632  }
8633  else {
8634  TString name = TString::Format("out_%s", opt.Data());
8635  if (fft->GetNdim()==1)
8636  hout = new TH1D(name, name,n[0], 0, n[0]);
8637  else if (fft->GetNdim()==2)
8638  hout = new TH2D(name, name, n[0], 0, n[0], n[1], 0, n[1]);
8639  }
8640  R__ASSERT(hout != 0);
8641  TString type=fft->GetType();
8642  Int_t ind[2];
8643  if (opt.Contains("RE")){
8644  if (type.Contains("2C") || type.Contains("2HC")) {
8645  Double_t re, im;
8646  for (binx = 1; binx<=hout->GetNbinsX(); binx++) {
8647  for (biny=1; biny<=hout->GetNbinsY(); biny++) {
8648  ind[0] = binx-1; ind[1] = biny-1;
8649  fft->GetPointComplex(ind, re, im);
8650  hout->SetBinContent(binx, biny, re);
8651  }
8652  }
8653  } else {
8654  for (binx = 1; binx<=hout->GetNbinsX(); binx++) {
8655  for (biny=1; biny<=hout->GetNbinsY(); biny++) {
8656  ind[0] = binx-1; ind[1] = biny-1;
8657  hout->SetBinContent(binx, biny, fft->GetPointReal(ind));
8658  }
8659  }
8660  }
8661  }
8662  if (opt.Contains("IM")) {
8663  if (type.Contains("2C") || type.Contains("2HC")) {
8664  Double_t re, im;
8665  for (binx = 1; binx<=hout->GetNbinsX(); binx++) {
8666  for (biny=1; biny<=hout->GetNbinsY(); biny++) {
8667  ind[0] = binx-1; ind[1] = biny-1;
8668  fft->GetPointComplex(ind, re, im);
8669  hout->SetBinContent(binx, biny, im);
8670  }
8671  }
8672  } else {
8673  ::Error("TransformHisto","No complex numbers in the output");
8674  return 0;
8675  }
8676  }
8677  if (opt.Contains("MA")) {
8678  if (type.Contains("2C") || type.Contains("2HC")) {
8679  Double_t re, im;
8680  for (binx = 1; binx<=hout->GetNbinsX(); binx++) {
8681  for (biny=1; biny<=hout->GetNbinsY(); biny++) {
8682  ind[0] = binx-1; ind[1] = biny-1;
8683  fft->GetPointComplex(ind, re, im);
8684  hout->SetBinContent(binx, biny, TMath::Sqrt(re*re + im*im));
8685  }
8686  }
8687  } else {
8688  for (binx = 1; binx<=hout->GetNbinsX(); binx++) {
8689  for (biny=1; biny<=hout->GetNbinsY(); biny++) {
8690  ind[0] = binx-1; ind[1] = biny-1;
8691  hout->SetBinContent(binx, biny, TMath::Abs(fft->GetPointReal(ind)));
8692  }
8693  }
8694  }
8695  }
8696  if (opt.Contains("PH")) {
8697  if (type.Contains("2C") || type.Contains("2HC")){
8698  Double_t re, im, ph;
8699  for (binx = 1; binx<=hout->GetNbinsX(); binx++){
8700  for (biny=1; biny<=hout->GetNbinsY(); biny++){
8701  ind[0] = binx-1; ind[1] = biny-1;
8702  fft->GetPointComplex(ind, re, im);
8703  if (TMath::Abs(re) > 1e-13){
8704  ph = TMath::ATan(im/re);
8705  //find the correct quadrant
8706  if (re<0 && im<0)
8707  ph -= TMath::Pi();
8708  if (re<0 && im>=0)
8709  ph += TMath::Pi();
8710  } else {
8711  if (TMath::Abs(im) < 1e-13)
8712  ph = 0;
8713  else if (im>0)
8714  ph = TMath::Pi()*0.5;
8715  else
8716  ph = -TMath::Pi()*0.5;
8717  }
8718  hout->SetBinContent(binx, biny, ph);
8719  }
8720  }
8721  } else {
8722  printf("Pure real output, no phase");
8723  return 0;
8724  }
8725  }
8726 
8727  return hout;
8728 }
8729 
8730 ////////////////////////////////////////////////////////////////////////////////
8731 /// Raw retrieval of bin content on internal data structure
8732 /// see convention for numbering bins in TH1::GetBin
8733 
8735 {
8736  AbstractMethod("RetrieveBinContent");
8737  return 0;
8738 }
8739 
8740 ////////////////////////////////////////////////////////////////////////////////
8741 /// Raw update of bin content on internal data structure
8742 /// see convention for numbering bins in TH1::GetBin
8743 
8745 {
8746  AbstractMethod("UpdateBinContent");
8747 }
8748 
8749 ////////////////////////////////////////////////////////////////////////////////
8750 /// Print value overload
8751 
8752 std::string cling::printValue(TH1 *val) {
8753  std::ostringstream strm;
8754  strm << cling::printValue((TObject*)val) << " NbinsX: " << val->GetNbinsX();
8755  return strm.str();
8756 }
8757 
8758 //______________________________________________________________________________
8759 // TH1C methods
8760 // TH1C : histograms with one byte per channel. Maximum bin content = 127
8761 //______________________________________________________________________________
8762 
8763 ClassImp(TH1C);
8764 
8765 ////////////////////////////////////////////////////////////////////////////////
8766 /// Constructor.
8767 
8768 TH1C::TH1C(): TH1(), TArrayC()
8769 {
8770  fDimension = 1;
8771  SetBinsLength(3);
8772  if (fgDefaultSumw2) Sumw2();
8773 }
8774 
8775 ////////////////////////////////////////////////////////////////////////////////
8776 /// Create a 1-Dim histogram with fix bins of type char (one byte per channel)
8777 /// (see TH1::TH1 for explanation of parameters)
8778 
8779 TH1C::TH1C(const char *name,const char *title,Int_t nbins,Double_t xlow,Double_t xup)
8780 : TH1(name,title,nbins,xlow,xup)
8781 {
8782  fDimension = 1;
8784 
8785  if (xlow >= xup) SetBuffer(fgBufferSize);
8786  if (fgDefaultSumw2) Sumw2();
8787 }
8788 
8789 ////////////////////////////////////////////////////////////////////////////////
8790 /// Create a 1-Dim histogram with variable bins of type char (one byte per channel)
8791 /// (see TH1::TH1 for explanation of parameters)
8792 
8793 TH1C::TH1C(const char *name,const char *title,Int_t nbins,const Float_t *xbins)
8794 : TH1(name,title,nbins,xbins)
8795 {
8796  fDimension = 1;
8798  if (fgDefaultSumw2) Sumw2();
8799 }
8800 
8801 ////////////////////////////////////////////////////////////////////////////////
8802 /// Create a 1-Dim histogram with variable bins of type char (one byte per channel)
8803 /// (see TH1::TH1 for explanation of parameters)
8804 
8805 TH1C::TH1C(const char *name,const char *title,Int_t nbins,const Double_t *xbins)
8806 : TH1(name,title,nbins,xbins)
8807 {
8808  fDimension = 1;
8810  if (fgDefaultSumw2) Sumw2();
8811 }
8812 
8813 ////////////////////////////////////////////////////////////////////////////////
8814 /// Destructor.
8815 
8816 TH1C::~TH1C()
8817 {
8818 }
8819 
8820 ////////////////////////////////////////////////////////////////////////////////
8821 /// Copy constructor.
8822 
8823 TH1C::TH1C(const TH1C &h1c) : TH1(), TArrayC()
8824 {
8825  ((TH1C&)h1c).Copy(*this);
8826 }
8827 
8828 ////////////////////////////////////////////////////////////////////////////////
8829 /// Increment bin content by 1.
8830 
8831 void TH1C::AddBinContent(Int_t bin)
8832 {
8833  if (fArray[bin] < 127) fArray[bin]++;
8834 }
8835 
8836 ////////////////////////////////////////////////////////////////////////////////
8837 /// Increment bin content by w.
8838 
8839 void TH1C::AddBinContent(Int_t bin, Double_t w)
8840 {
8841  Int_t newval = fArray[bin] + Int_t(w);
8842  if (newval > -128 && newval < 128) {fArray[bin] = Char_t(newval); return;}
8843  if (newval < -127) fArray[bin] = -127;
8844  if (newval > 127) fArray[bin] = 127;
8845 }
8846 
8847 ////////////////////////////////////////////////////////////////////////////////
8848 /// Copy this to newth1
8849 
8850 void TH1C::Copy(TObject &newth1) const
8851 {
8852  TH1::Copy(newth1);
8853 }
8854 
8855 ////////////////////////////////////////////////////////////////////////////////
8856 /// Reset.
8857 
8858 void TH1C::Reset(Option_t *option)
8859 {
8860  TH1::Reset(option);
8861  TArrayC::Reset();
8862 }
8863 
8864 ////////////////////////////////////////////////////////////////////////////////
8865 /// Set total number of bins including under/overflow
8866 /// Reallocate bin contents array
8867 
8869 {
8870  if (n < 0) n = fXaxis.GetNbins() + 2;
8871  fNcells = n;
8872  TArrayC::Set(n);
8873 }
8874 
8875 ////////////////////////////////////////////////////////////////////////////////
8876 /// Operator =
8877 
8878 TH1C& TH1C::operator=(const TH1C &h1)
8879 {
8880  if (this != &h1) ((TH1C&)h1).Copy(*this);
8881  return *this;
8882 }
8883 
8884 ////////////////////////////////////////////////////////////////////////////////
8885 /// Operator *
8886 
8887 TH1C operator*(Double_t c1, const TH1C &h1)
8888 {
8889  TH1C hnew = h1;
8890  hnew.Scale(c1);
8891  hnew.SetDirectory(0);
8892  return hnew;
8893 }
8894 
8895 ////////////////////////////////////////////////////////////////////////////////
8896 /// Operator +
8897 
8898 TH1C operator+(const TH1C &h1, const TH1C &h2)
8899 {
8900  TH1C hnew = h1;
8901  hnew.Add(&h2,1);
8902  hnew.SetDirectory(0);
8903  return hnew;
8904 }
8905 
8906 ////////////////////////////////////////////////////////////////////////////////
8907 /// Operator -
8908 
8909 TH1C operator-(const TH1C &h1, const TH1C &h2)
8910 {
8911  TH1C hnew = h1;
8912  hnew.Add(&h2,-1);
8913  hnew.SetDirectory(0);
8914  return hnew;
8915 }
8916 
8917 ////////////////////////////////////////////////////////////////////////////////
8918 /// Operator *
8919 
8920 TH1C operator*(const TH1C &h1, const TH1C &h2)
8921 {
8922  TH1C hnew = h1;
8923  hnew.Multiply(&h2);
8924  hnew.SetDirectory(0);
8925  return hnew;
8926 }
8927 
8928 ////////////////////////////////////////////////////////////////////////////////
8929 /// Operator /
8930 
8931 TH1C operator/(const TH1C &h1, const TH1C &h2)
8932 {
8933  TH1C hnew = h1;
8934  hnew.Divide(&h2);
8935  hnew.SetDirectory(0);
8936  return hnew;
8937 }
8938 
8939 //______________________________________________________________________________
8940 // TH1S methods
8941 // TH1S : histograms with one short per channel. Maximum bin content = 32767
8942 //______________________________________________________________________________
8943 
8944 ClassImp(TH1S);
8945 
8946 ////////////////////////////////////////////////////////////////////////////////
8947 /// Constructor.
8948 
8949 TH1S::TH1S(): TH1(), TArrayS()
8950 {
8951  fDimension = 1;
8952  SetBinsLength(3);
8953  if (fgDefaultSumw2) Sumw2();
8954 }
8955 
8956 ////////////////////////////////////////////////////////////////////////////////
8957 /// Create a 1-Dim histogram with fix bins of type short
8958 /// (see TH1::TH1 for explanation of parameters)
8959 
8960 TH1S::TH1S(const char *name,const char *title,Int_t nbins,Double_t xlow,Double_t xup)
8961 : TH1(name,title,nbins,xlow,xup)
8962 {
8963  fDimension = 1;
8965 
8966  if (xlow >= xup) SetBuffer(fgBufferSize);
8967  if (fgDefaultSumw2) Sumw2();
8968 }
8969 
8970 ////////////////////////////////////////////////////////////////////////////////
8971 /// Create a 1-Dim histogram with variable bins of type short
8972 /// (see TH1::TH1 for explanation of parameters)
8973 
8974 TH1S::TH1S(const char *name,const char *title,Int_t nbins,const Float_t *xbins)
8975 : TH1(name,title,nbins,xbins)
8976 {
8977  fDimension = 1;
8979  if (fgDefaultSumw2) Sumw2();
8980 }
8981 
8982 ////////////////////////////////////////////////////////////////////////////////
8983 /// Create a 1-Dim histogram with variable bins of type short
8984 /// (see TH1::TH1 for explanation of parameters)
8985 
8986 TH1S::TH1S(const char *name,const char *title,Int_t nbins,const Double_t *xbins)
8987 : TH1(name,title,nbins,xbins)
8988 {
8989  fDimension = 1;
8991  if (fgDefaultSumw2) Sumw2();
8992 }
8993 
8994 ////////////////////////////////////////////////////////////////////////////////
8995 /// Destructor.
8996 
8997 TH1S::~TH1S()
8998 {
8999 }
9000 
9001 ////////////////////////////////////////////////////////////////////////////////
9002 /// Copy constructor.
9003 
9004 TH1S::TH1S(const TH1S &h1s) : TH1(), TArrayS()
9005 {
9006  ((TH1S&)h1s).Copy(*this);
9007 }
9008 
9009 ////////////////////////////////////////////////////////////////////////////////
9010 /// Increment bin content by 1.
9011 
9012 void TH1S::AddBinContent(Int_t bin)
9013 {
9014  if (fArray[bin] < 32767) fArray[bin]++;
9015 }
9016 
9017 ////////////////////////////////////////////////////////////////////////////////
9018 /// Increment bin content by w
9019 
9020 void TH1S::AddBinContent(Int_t bin, Double_t w)
9021 {
9022  Int_t newval = fArray[bin] + Int_t(w);
9023  if (newval > -32768 && newval < 32768) {fArray[bin] = Short_t(newval); return;}
9024  if (newval < -32767) fArray[bin] = -32767;
9025  if (newval > 32767) fArray[bin] = 32767;
9026 }
9027 
9028 ////////////////////////////////////////////////////////////////////////////////
9029 /// Copy this to newth1
9030 
9031 void TH1S::Copy(TObject &newth1) const
9032 {
9033  TH1::Copy(newth1);
9034 }
9035 
9036 ////////////////////////////////////////////////////////////////////////////////
9037 /// Reset.
9038 
9039 void TH1S::Reset(Option_t *option)
9040 {
9041  TH1::Reset(option);
9042  TArrayS::Reset();
9043 }
9044 
9045 ////////////////////////////////////////////////////////////////////////////////
9046 /// Set total number of bins including under/overflow
9047 /// Reallocate bin contents array
9048 
9050 {
9051  if (n < 0) n = fXaxis.GetNbins() + 2;
9052  fNcells = n;
9053  TArrayS::Set(n);
9054 }
9055 
9056 ////////////////////////////////////////////////////////////////////////////////
9057 /// Operator =
9058 
9059 TH1S& TH1S::operator=(const TH1S &h1)
9060 {
9061  if (this != &h1) ((TH1S&)h1).Copy(*this);
9062  return *this;
9063 }
9064 
9065 ////////////////////////////////////////////////////////////////////////////////
9066 /// Operator *
9067 
9068 TH1S operator*(Double_t c1, const TH1S &h1)
9069 {
9070  TH1S hnew = h1;
9071  hnew.Scale(c1);
9072  hnew.SetDirectory(0);
9073  return hnew;
9074 }
9075 
9076 ////////////////////////////////////////////////////////////////////////////////
9077 /// Operator +
9078 
9079 TH1S operator+(const TH1S &h1, const TH1S &h2)
9080 {
9081  TH1S hnew = h1;
9082  hnew.Add(&h2,1);
9083  hnew.SetDirectory(0);
9084  return hnew;
9085 }
9086 
9087 ////////////////////////////////////////////////////////////////////////////////
9088 /// Operator -
9089 
9090 TH1S operator-(const TH1S &h1, const TH1S &h2)
9091 {
9092  TH1S hnew = h1;
9093  hnew.Add(&h2,-1);
9094  hnew.SetDirectory(0);
9095  return hnew;
9096 }
9097 
9098 ////////////////////////////////////////////////////////////////////////////////
9099 /// Operator *
9100 
9101 TH1S operator*(const TH1S &h1, const TH1S &h2)
9102 {
9103  TH1S hnew = h1;
9104  hnew.Multiply(&h2);
9105  hnew.SetDirectory(0);
9106  return hnew;
9107 }
9108 
9109 ////////////////////////////////////////////////////////////////////////////////
9110 /// Operator /
9111 
9112 TH1S operator/(const TH1S &h1, const TH1S &h2)
9113 {
9114  TH1S hnew = h1;
9115  hnew.Divide(&h2);
9116  hnew.SetDirectory(0);
9117  return hnew;
9118 }
9119 
9120 //______________________________________________________________________________
9121 // TH1I methods
9122 // TH1I : histograms with one int per channel. Maximum bin content = 2147483647
9123 //______________________________________________________________________________
9124 
9125 ClassImp(TH1I);
9126 
9127 ////////////////////////////////////////////////////////////////////////////////
9128 /// Constructor.
9129 
9130 TH1I::TH1I(): TH1(), TArrayI()
9131 {
9132  fDimension = 1;
9133  SetBinsLength(3);
9134  if (fgDefaultSumw2) Sumw2();
9135 }
9136 
9137 ////////////////////////////////////////////////////////////////////////////////
9138 /// Create a 1-Dim histogram with fix bins of type integer
9139 /// (see TH1::TH1 for explanation of parameters)
9140 
9141 TH1I::TH1I(const char *name,const char *title,Int_t nbins,Double_t xlow,Double_t xup)
9142 : TH1(name,title,nbins,xlow,xup)
9143 {
9144  fDimension = 1;
9146 
9147  if (xlow >= xup) SetBuffer(fgBufferSize);
9148  if (fgDefaultSumw2) Sumw2();
9149 }
9150 
9151 ////////////////////////////////////////////////////////////////////////////////
9152 /// Create a 1-Dim histogram with variable bins of type integer
9153 /// (see TH1::TH1 for explanation of parameters)
9154 
9155 TH1I::TH1I(const char *name,const char *title,Int_t nbins,const Float_t *xbins)
9156 : TH1(name,title,nbins,xbins)
9157 {
9158  fDimension = 1;
9160  if (fgDefaultSumw2) Sumw2();
9161 }
9162 
9163 ////////////////////////////////////////////////////////////////////////////////
9164 /// Create a 1-Dim histogram with variable bins of type integer
9165 /// (see TH1::TH1 for explanation of parameters)
9166 
9167 TH1I::TH1I(const char *name,const char *title,Int_t nbins,const Double_t *xbins)
9168 : TH1(name,title,nbins,xbins)
9169 {
9170  fDimension = 1;
9172  if (fgDefaultSumw2) Sumw2();
9173 }
9174 
9175 ////////////////////////////////////////////////////////////////////////////////
9176 /// Destructor.
9177 
9178 TH1I::~TH1I()
9179 {
9180 }
9181 
9182 ////////////////////////////////////////////////////////////////////////////////
9183 /// Copy constructor.
9184 
9185 TH1I::TH1I(const TH1I &h1i) : TH1(), TArrayI()
9186 {
9187  ((TH1I&)h1i).Copy(*this);
9188 }
9189 
9190 ////////////////////////////////////////////////////////////////////////////////
9191 /// Increment bin content by 1.
9192 
9193 void TH1I::AddBinContent(Int_t bin)
9194 {
9195  if (fArray[bin] < 2147483647) fArray[bin]++;
9196 }
9197 
9198 ////////////////////////////////////////////////////////////////////////////////
9199 /// Increment bin content by w
9200 
9201 void TH1I::AddBinContent(Int_t bin, Double_t w)
9202 {
9203  Long64_t newval = fArray[bin] + Long64_t(w);
9204  if (newval > -2147483647 && newval < 2147483647) {fArray[bin] = Int_t(newval); return;}
9205  if (newval < -2147483647) fArray[bin] = -2147483647;
9206  if (newval > 2147483647) fArray[bin] = 2147483647;
9207 }
9208 
9209 ////////////////////////////////////////////////////////////////////////////////
9210 /// Copy this to newth1
9211 
9212 void TH1I::Copy(TObject &newth1) const
9213 {
9214  TH1::Copy(newth1);
9215 }
9216 
9217 ////////////////////////////////////////////////////////////////////////////////
9218 /// Reset.
9219 
9220 void TH1I::Reset(Option_t *option)
9221 {
9222  TH1::Reset(option);
9223  TArrayI::Reset();
9224 }
9225 
9226 ////////////////////////////////////////////////////////////////////////////////
9227 /// Set total number of bins including under/overflow
9228 /// Reallocate bin contents array
9229 
9231 {
9232  if (n < 0) n = fXaxis.GetNbins() + 2;
9233  fNcells = n;
9234  TArrayI::Set(n);
9235 }
9236 
9237 ////////////////////////////////////////////////////////////////////////////////
9238 /// Operator =
9239 
9240 TH1I& TH1I::operator=(const TH1I &h1)
9241 {
9242  if (this != &h1) ((TH1I&)h1).Copy(*this);
9243  return *this;
9244 }
9245 
9246 
9247 ////////////////////////////////////////////////////////////////////////////////
9248 /// Operator *
9249 
9250 TH1I operator*(Double_t c1, const TH1I &h1)
9251 {
9252  TH1I hnew = h1;
9253  hnew.Scale(c1);
9254  hnew.SetDirectory(0);
9255  return hnew;
9256 }
9257 
9258 ////////////////////////////////////////////////////////////////////////////////
9259 /// Operator +
9260 
9261 TH1I operator+(const TH1I &h1, const TH1I &h2)
9262 {
9263  TH1I hnew = h1;
9264  hnew.Add(&h2,1);
9265  hnew.SetDirectory(0);
9266  return hnew;
9267 }
9268 
9269 ////////////////////////////////////////////////////////////////////////////////
9270 /// Operator -
9271 
9272 TH1I operator-(const TH1I &h1, const TH1I &h2)
9273 {
9274  TH1I hnew = h1;
9275  hnew.Add(&h2,-1);
9276  hnew.SetDirectory(0);
9277  return hnew;
9278 }
9279 
9280 ////////////////////////////////////////////////////////////////////////////////
9281 /// Operator *
9282 
9283 TH1I operator*(const TH1I &h1, const TH1I &h2)
9284 {
9285  TH1I hnew = h1;
9286  hnew.Multiply(&h2);
9287  hnew.SetDirectory(0);
9288  return hnew;
9289 }
9290 
9291 ////////////////////////////////////////////////////////////////////////////////
9292 /// Operator /
9293 
9294 TH1I operator/(const TH1I &h1, const TH1I &h2)
9295 {
9296  TH1I hnew = h1;
9297  hnew.Divide(&h2);
9298  hnew.SetDirectory(0);
9299  return hnew;
9300 }
9301 
9302 //______________________________________________________________________________
9303 // TH1F methods
9304 // TH1F : histograms with one float per channel. Maximum precision 7 digits
9305 //______________________________________________________________________________
9306 
9307 ClassImp(TH1F);
9308 
9309 ////////////////////////////////////////////////////////////////////////////////
9310 /// Constructor.
9311 
9312 TH1F::TH1F(): TH1(), TArrayF()
9313 {
9314  fDimension = 1;
9315  SetBinsLength(3);
9316  if (fgDefaultSumw2) Sumw2();
9317 }
9318 
9319 ////////////////////////////////////////////////////////////////////////////////
9320 /// Create a 1-Dim histogram with fix bins of type float
9321 /// (see TH1::TH1 for explanation of parameters)
9322 
9323 TH1F::TH1F(const char *name,const char *title,Int_t nbins,Double_t xlow,Double_t xup)
9324 : TH1(name,title,nbins,xlow,xup)
9325 {
9326  fDimension = 1;
9328 
9329  if (xlow >= xup) SetBuffer(fgBufferSize);
9330  if (fgDefaultSumw2) Sumw2();
9331 }
9332 
9333 ////////////////////////////////////////////////////////////////////////////////
9334 /// Create a 1-Dim histogram with variable bins of type float
9335 /// (see TH1::TH1 for explanation of parameters)
9336 
9337 TH1F::TH1F(const char *name,const char *title,Int_t nbins,const Float_t *xbins)
9338 : TH1(name,title,nbins,xbins)
9339 {
9340  fDimension = 1;
9342  if (fgDefaultSumw2) Sumw2();
9343 }
9344 
9345 ////////////////////////////////////////////////////////////////////////////////
9346 /// Create a 1-Dim histogram with variable bins of type float
9347 /// (see TH1::TH1 for explanation of parameters)
9348 
9349 TH1F::TH1F(const char *name,const char *title,Int_t nbins,const Double_t *xbins)
9350 : TH1(name,title,nbins,xbins)
9351 {
9352  fDimension = 1;
9354  if (fgDefaultSumw2) Sumw2();
9355 }
9356 
9357 ////////////////////////////////////////////////////////////////////////////////
9358 /// Create a histogram from a TVectorF
9359 /// by default the histogram name is "TVectorF" and title = ""
9360 
9361 TH1F::TH1F(const TVectorF &v)
9362 : TH1("TVectorF","",v.GetNrows(),0,v.GetNrows())
9363 {
9365  fDimension = 1;
9366  Int_t ivlow = v.GetLwb();
9367  for (Int_t i=0;i<fNcells-2;i++) {
9368  SetBinContent(i+1,v(i+ivlow));
9369  }
9370  TArrayF::Set(fNcells);
9371  if (fgDefaultSumw2) Sumw2();
9372 }
9373 
9374 ////////////////////////////////////////////////////////////////////////////////
9375 /// Copy Constructor.
9376 
9377 TH1F::TH1F(const TH1F &h) : TH1(), TArrayF()
9378 {
9379  ((TH1F&)h).Copy(*this);
9380 }
9381 
9382 ////////////////////////////////////////////////////////////////////////////////
9383 /// Destructor.
9384 
9385 TH1F::~TH1F()
9386 {
9387 }
9388 
9389 ////////////////////////////////////////////////////////////////////////////////
9390 /// Copy this to newth1.
9391 
9392 void TH1F::Copy(TObject &newth1) const
9393 {
9394  TH1::Copy(newth1);
9395 }
9396 
9397 ////////////////////////////////////////////////////////////////////////////////
9398 /// Reset.
9399 
9400 void TH1F::Reset(Option_t *option)
9401 {
9402  TH1::Reset(option);
9403  TArrayF::Reset();
9404 }
9405 
9406 ////////////////////////////////////////////////////////////////////////////////
9407 /// Set total number of bins including under/overflow
9408 /// Reallocate bin contents array
9409 
9411 {
9412  if (n < 0) n = fXaxis.GetNbins() + 2;
9413  fNcells = n;
9414  TArrayF::Set(n);
9415 }
9416 
9417 ////////////////////////////////////////////////////////////////////////////////
9418 /// Operator =
9419 
9420 TH1F& TH1F::operator=(const TH1F &h1)
9421 {
9422  if (this != &h1) ((TH1F&)h1).Copy(*this);
9423  return *this;
9424 }
9425 
9426 ////////////////////////////////////////////////////////////////////////////////
9427 /// Operator *
9428 
9429 TH1F operator*(Double_t c1, const TH1F &h1)
9430 {
9431  TH1F hnew = h1;
9432  hnew.Scale(c1);
9433  hnew.SetDirectory(0);
9434  return hnew;
9435 }
9436 
9437 ////////////////////////////////////////////////////////////////////////////////
9438 /// Operator +
9439 
9440 TH1F operator+(const TH1F &h1, const TH1F &h2)
9441 {
9442  TH1F hnew = h1;
9443  hnew.Add(&h2,1);
9444  hnew.SetDirectory(0);
9445  return hnew;
9446 }
9447 
9448 ////////////////////////////////////////////////////////////////////////////////
9449 /// Operator -
9450 
9451 TH1F operator-(const TH1F &h1, const TH1F &h2)
9452 {
9453  TH1F hnew = h1;
9454  hnew.Add(&h2,-1);
9455  hnew.SetDirectory(0);
9456  return hnew;
9457 }
9458 
9459 ////////////////////////////////////////////////////////////////////////////////
9460 /// Operator *
9461 
9462 TH1F operator*(const TH1F &h1, const TH1F &h2)
9463 {
9464  TH1F hnew = h1;
9465  hnew.Multiply(&h2);
9466  hnew.SetDirectory(0);
9467  return hnew;
9468 }
9469 
9470 ////////////////////////////////////////////////////////////////////////////////
9471 /// Operator /
9472 
9473 TH1F operator/(const TH1F &h1, const TH1F &h2)
9474 {
9475  TH1F hnew = h1;
9476  hnew.Divide(&h2);
9477  hnew.SetDirectory(0);
9478  return hnew;
9479 }
9480 
9481 //______________________________________________________________________________
9482 // TH1D methods
9483 // TH1D : histograms with one double per channel. Maximum precision 14 digits
9484 //______________________________________________________________________________
9485 
9486 ClassImp(TH1D);
9487 
9488 ////////////////////////////////////////////////////////////////////////////////
9489 /// Constructor.
9490 
9491 TH1D::TH1D(): TH1(), TArrayD()
9492 {
9493  fDimension = 1;
9494  SetBinsLength(3);
9495  if (fgDefaultSumw2) Sumw2();
9496 }
9497 
9498 ////////////////////////////////////////////////////////////////////////////////
9499 /// Create a 1-Dim histogram with fix bins of type double
9500 /// (see TH1::TH1 for explanation of parameters)
9501 
9502 TH1D::TH1D(const char *name,const char *title,Int_t nbins,Double_t xlow,Double_t xup)
9503 : TH1(name,title,nbins,xlow,xup)
9504 {
9505  fDimension = 1;
9507 
9508  if (xlow >= xup) SetBuffer(fgBufferSize);
9509  if (fgDefaultSumw2) Sumw2();
9510 }
9511 
9512 ////////////////////////////////////////////////////////////////////////////////
9513 /// Create a 1-Dim histogram with variable bins of type double
9514 /// (see TH1::TH1 for explanation of parameters)
9515 
9516 TH1D::TH1D(const char *name,const char *title,Int_t nbins,const Float_t *xbins)
9517 : TH1(name,title,nbins,xbins)
9518 {
9519  fDimension = 1;
9521  if (fgDefaultSumw2) Sumw2();
9522 }
9523 
9524 ////////////////////////////////////////////////////////////////////////////////
9525 /// Create a 1-Dim histogram with variable bins of type double
9526 /// (see TH1::TH1 for explanation of parameters)
9527 
9528 TH1D::TH1D(const char *name,const char *title,Int_t nbins,const Double_t *xbins)
9529 : TH1(name,title,nbins,xbins)
9530 {
9531  fDimension = 1;
9533  if (fgDefaultSumw2) Sumw2();
9534 }
9535 
9536 ////////////////////////////////////////////////////////////////////////////////
9537 /// Create a histogram from a TVectorD
9538 /// by default the histogram name is "TVectorD" and title = ""
9539 
9540 TH1D::TH1D(const TVectorD &v)
9541 : TH1("TVectorD","",v.GetNrows(),0,v.GetNrows())
9542 {
9544  fDimension = 1;
9545  Int_t ivlow = v.GetLwb();
9546  for (Int_t i=0;i<fNcells-2;i++) {
9547  SetBinContent(i+1,v(i+ivlow));
9548  }
9549  TArrayD::Set(fNcells);
9550  if (fgDefaultSumw2) Sumw2();
9551 }
9552 
9553 ////////////////////////////////////////////////////////////////////////////////
9554 /// Destructor.
9555 
9556 TH1D::~TH1D()
9557 {
9558 }
9559 
9560 ////////////////////////////////////////////////////////////////////////////////
9561 /// Constructor.
9562 
9563 TH1D::TH1D(const TH1D &h1d) : TH1(), TArrayD()
9564 {
9565  ((TH1D&)h1d).Copy(*this);
9566 }
9567 
9568 ////////////////////////////////////////////////////////////////////////////////
9569 /// Copy this to newth1
9570 
9571 void TH1D::Copy(TObject &newth1) const
9572 {
9573  TH1::Copy(newth1);
9574 }
9575 
9576 ////////////////////////////////////////////////////////////////////////////////
9577 /// Reset.
9578 
9579 void TH1D::Reset(Option_t *option)
9580 {
9581  TH1::Reset(option);
9582  TArrayD::Reset();
9583 }
9584 
9585 ////////////////////////////////////////////////////////////////////////////////
9586 /// Set total number of bins including under/overflow
9587 /// Reallocate bin contents array
9588 
9590 {
9591  if (n < 0) n = fXaxis.GetNbins() + 2;
9592  fNcells = n;
9593  TArrayD::Set(n);
9594 }
9595 
9596 ////////////////////////////////////////////////////////////////////////////////
9597 /// Operator =
9598 
9599 TH1D& TH1D::operator=(const TH1D &h1)
9600 {
9601  if (this != &h1) ((TH1D&)h1).Copy(*this);
9602  return *this;
9603 }
9604 
9605 ////////////////////////////////////////////////////////////////////////////////
9606 /// Operator *
9607 
9608 TH1D operator*(Double_t c1, const TH1D &h1)
9609 {
9610  TH1D hnew = h1;
9611  hnew.Scale(c1);
9612  hnew.SetDirectory(0);
9613  return hnew;
9614 }
9615 
9616 ////////////////////////////////////////////////////////////////////////////////
9617 /// Operator +
9618 
9619 TH1D operator+(const TH1D &h1, const TH1D &h2)
9620 {
9621  TH1D hnew = h1;
9622  hnew.Add(&h2,1);
9623  hnew.SetDirectory(0);
9624  return hnew;
9625 }
9626 
9627 ////////////////////////////////////////////////////////////////////////////////
9628 /// Operator -
9629 
9630 TH1D operator-(const TH1D &h1, const TH1D &h2)
9631 {
9632  TH1D hnew = h1;
9633  hnew.Add(&h2,-1);
9634  hnew.SetDirectory(0);
9635  return hnew;
9636 }
9637 
9638 ////////////////////////////////////////////////////////////////////////////////
9639 /// Operator *
9640 
9641 TH1D operator*(const TH1D &h1, const TH1D &h2)
9642 {
9643  TH1D hnew = h1;
9644  hnew.Multiply(&h2);
9645  hnew.SetDirectory(0);
9646  return hnew;
9647 }
9648 
9649 ////////////////////////////////////////////////////////////////////////////////
9650 /// Operator /
9651 
9652 TH1D operator/(const TH1D &h1, const TH1D &h2)
9653 {
9654  TH1D hnew = h1;
9655  hnew.Divide(&h2);
9656  hnew.SetDirectory(0);
9657  return hnew;
9658 }
9659 
9660 ////////////////////////////////////////////////////////////////////////////////
9661 ///return pointer to histogram with name
9662 ///hid if id >=0
9663 ///h_id if id <0
9664 
9665 TH1 *R__H(Int_t hid)
9666 {
9667  TString hname;
9668  if(hid >= 0) hname.Form("h%d",hid);
9669  else hname.Form("h_%d",hid);
9670  return (TH1*)gDirectory->Get(hname);
9671 }
9672 
9673 ////////////////////////////////////////////////////////////////////////////////
9674 ///return pointer to histogram with name hname
9675 
9676 TH1 *R__H(const char * hname)
9677 {
9678  return (TH1*)gDirectory->Get(hname);
9679 }
static void StatOverflows(Bool_t flag=kTRUE)
if flag=kTRUE, underflows and overflows are used by the Fill functions in the computation of statisti...
Definition: TH1.cxx:6405
TString fTitle
Definition: TNamed.h:33
Abstract array base class.
Definition: TArray.h:31
virtual void Browse(TBrowser *b)
Browse the Histogram object.
Definition: TH1.cxx:713
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save primitive as a C++ statement(s) on output stream out.
Definition: TH1.cxx:6636
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 const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH1.cxx:9587
virtual void Print(Option_t *option="") const
Print some global quantities for this histogram.
Definition: TH1.cxx:6489
virtual void SetNameTitle(const char *name, const char *title)
Change the name and title of this histogram.
Definition: TH1.cxx:8268
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Definition: TAttLine.h:43
virtual UInt_t GetUniqueID() const
Return the unique object id.
Definition: TObject.cxx:375
Bool_t IsReading() const
Definition: TBuffer.h:83
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
Definition: TH1.cxx:3572
virtual Float_t GetTickLength() const
Definition: TAttAxis.h:44
virtual Int_t GetNcells() const
Definition: TH1.h:294
Double_t fNormFactor
Normalization factor.
Definition: TH1.h:99
virtual void SetBarOffset(Float_t offset=0.25)
Definition: TH1.h:352
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
Definition: TH1.cxx:6101
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition: TH1.cxx:3251
virtual Int_t ShowPeaks(Double_t sigma=2, Option_t *option="", Double_t threshold=0.05)
Interface to TSpectrum::Search.
Definition: TH1.cxx:8594
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
Return maximum value smaller than maxval of bins in the range, unless the value has been overridden b...
Definition: TH1.cxx:7844
TH1D & operator=(const TH1D &h1)
Operator =.
Definition: TH1.cxx:9597
virtual Double_t IntegralAndError(Int_t binx1, Int_t binx2, Double_t &err, Option_t *option="") const
Return integral of bin contents in range [binx1,binx2] and its error.
Definition: TH1.cxx:7320
void SetBarWidth(Float_t barwidth=0.5)
Definition: TStyle.h:314
static long int sum(long int i)
Definition: Factory.cxx:2258
virtual void SaveAttributes(std::ostream &out, const char *name, const char *subname)
Save axis attributes as C++ statement(s) on output stream out.
Definition: TAxis.cxx:647
virtual Double_t GetEffectiveEntries() const
Number of effective entries of the histogram.
Definition: TH1.cxx:4210
virtual void Paint(Option_t *option="")
Control routine to paint any kind of histograms.
Definition: TH1.cxx:5692
float xmin
Definition: THbookFile.cxx:93
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
Definition: TList.cxx:467
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
Definition: TH1.cxx:8434
const char * GetBinLabel(Int_t bin) const
Return label for bin.
Definition: TAxis.cxx:426
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition: TObject.cxx:854
virtual Double_t PoissonD(Double_t mean)
Generates a random number according to a Poisson law.
Definition: TRandom.cxx:435
Bool_t IsBinUnderflow(Int_t bin, Int_t axis=0) const
Return true if the bin is underflow.
Definition: TH1.cxx:4923
Double_t Floor(Double_t x)
Definition: TMath.h:702
void Set(Int_t n)
Set size of this array to n chars.
Definition: TArrayC.cxx:105
virtual ~TH1I()
Destructor.
Definition: TH1.cxx:9176
Int_t GetFirst() const
Return first bin on the axis i.e.
Definition: TAxis.cxx:444
long long Long64_t
Definition: RtypesCore.h:69
virtual Int_t AutoP2FindLimits(Double_t min, Double_t max)
Buffer-based estimate of the histogram range using the power of 2 algorithm.
Definition: TH1.cxx:1275
virtual void SetMaximum(Double_t maximum=-1111)
Definition: TH1.h:390
double Chisquare(const TH1 &h1, TF1 &f1, bool useRange, bool usePL=false)
compute the chi2 value for an histogram given a function (see TH1::Chisquare for the documentation) ...
Definition: HFitImpl.cxx:1018
auto * m
Definition: textangle.C:8
void UseCurrentStyle()
Copy current attributes from/to current style.
Definition: TH1.cxx:6866
void Copy(TArrayI &array) const
Definition: TArrayI.h:42
virtual void LabelsOption(Option_t *option="h", Option_t *axis="X")
Set option(s) to draw axis with labels.
Definition: TH1.cxx:5085
short Style_t
Definition: RtypesCore.h:76
virtual void SetLimits(Double_t xmin, Double_t xmax)
Definition: TAxis.h:154
Double_t Log(Double_t x)
Definition: TMath.h:759
Short_t fBarWidth
(1000*width) for bar charts or legos
Definition: TH1.h:91
short Version_t
Definition: RtypesCore.h:61
TH1C()
Constructor.
Definition: TH1.cxx:8766
Bool_t IsBinOverflow(Int_t bin, Int_t axis=0) const
Return true if the bin is overflow.
Definition: TH1.cxx:4891
static Bool_t fgDefaultSumw2
!flag to call TH1::Sumw2 automatically at histogram creation time
Definition: TH1.h:115
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)=0
Computes distance from point (px,py) to the object.
TVirtualHistPainter * GetPainter(Option_t *option="")
Return pointer to painter.
Definition: TH1.cxx:4231
virtual void FitPanel()
Display a panel with all histogram fit options.
Definition: TH1.cxx:4046
float Float_t
Definition: RtypesCore.h:53
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:8231
virtual TF1 * GetFunction(const char *name) const
Return pointer to function with name.
Definition: TH1.cxx:8344
virtual Float_t GetLabelOffset() const
Definition: TAttAxis.h:40
Short_t * fArray
Definition: TArrayS.h:30
const char Option_t
Definition: RtypesCore.h:62
virtual Float_t GetBarOffset() const
Definition: TH1.h:250
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
Definition: TAxis.cxx:504
Double_t KolmogorovProb(Double_t z)
return c1
Definition: legend1.C:41
void Reset()
Definition: TArrayD.h:47
float ymin
Definition: THbookFile.cxx:93
virtual void Set(Int_t n)=0
virtual void ResetAttAxis(Option_t *option="")
Reset axis attributes.
Definition: TAttAxis.cxx:79
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754
Definition: TMath.h:900
virtual void SetError(const Double_t *error)
Replace bin errors by values in array error.
Definition: TH1.cxx:8245
image html pict1_TGaxis_012 png width
Define new text attributes for the label number "labNum".
Definition: TGaxis.cxx:2551
virtual Double_t GetNormFactor() const
Definition: TH1.h:295
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition: TString.h:687
TAxis fYaxis
Y axis descriptor.
Definition: TH1.h:88
virtual Int_t BufferFill(Double_t x, Double_t w)
accumulate arguments in buffer.
Definition: TH1.cxx:1436
virtual void SetContour(Int_t nlevels, const Double_t *levels=0)
Set the number and values of contour levels.
Definition: TH1.cxx:7785
R__EXTERN TStyle * gStyle
Definition: TStyle.h:406
virtual void PutStats(Double_t *stats)
Replace current statistics with the values in array stats.
Definition: TH1.cxx:7239
void SetHistLineWidth(Width_t width=1)
Definition: TStyle.h:360
const Double_t * GetArray() const
Definition: TArrayD.h:43
Bool_t GetStatOverflowsBehaviour() const
Definition: TH1.h:148
TList * fFunctions
->Pointer to list of functions (fits and user)
Definition: TH1.h:103
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: TH1.cxx:3650
virtual void SetBins(Int_t nx, Double_t xmin, Double_t xmax)
Redefine x axis parameters.
Definition: TH1.cxx:8061
Int_t GetLwb() const
Definition: TVectorT.h:73
virtual Int_t GetXfirst() const
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
virtual Color_t GetAxisColor() const
Definition: TAttAxis.h:37
TH1 * GetAsymmetry(TH1 *h2, Double_t c2=1, Double_t dc2=0)
Return an histogram containing the asymmetry of this histogram with h2, where the asymmetry is define...
Definition: TH1.cxx:4101
static Bool_t fgStatOverflows
!flag to use under/overflows in statistics
Definition: TH1.h:114
virtual TH1 * DrawNormalized(Option_t *option="", Double_t norm=1) const
Draw a normalized copy of this histogram.
Definition: TH1.cxx:3051
static Bool_t SameLimitsAndNBins(const TAxis &axis1, const TAxis &axis2)
Same limits and bins.
Definition: TH1.cxx:5370
virtual ~TH1F()
Destructor.
Definition: TH1.cxx:9383
virtual void SetLabelColor(Color_t color=1, Float_t alpha=1.)
Set color of labels.
Definition: TAttAxis.cxx:173
void Build()
Creates histogram basic data structure.
Definition: TH1.cxx:722
EStatOverflows fStatOverflows
per object flag to use under/overflows in statistics
Definition: TH1.h:111
virtual Double_t GetSumOfWeights() const
Return the sum of weights excluding under/overflows.
Definition: TH1.cxx:7269
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Definition: TH1.cxx:4770
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 Copy(TObject &hnew) const
Copy this to newth1.
Definition: TH1.cxx:8848
TVectorT.
Definition: TMatrixTBase.h:77
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:4322
virtual Double_t Integral(Option_t *option="") const
Return integral of bin contents.
Definition: TH1.cxx:7293
void ToUpper()
Change string to upper case.
Definition: TString.cxx:1113
virtual void Reset(Option_t *option="")
Reset.
Definition: TH1.cxx:8856
TH1D()
Constructor.
Definition: TH1.cxx:9489
friend TH1D operator/(const TH1D &h1, const TH1D &h2)
Operator /.
Definition: TH1.cxx:9650
static bool CheckAxisLimits(const TAxis *a1, const TAxis *a2)
Check that the axis limits of the histograms are the same.
Definition: TH1.cxx:1529
Buffer base class used for serializing objects.
Definition: TBuffer.h:40
friend TH1S operator+(const TH1S &h1, const TH1S &h2)
Operator +.
Definition: TH1.cxx:9077
virtual Double_t GetMeanError(Int_t axis=1) const
Return standard error of mean of this histogram along the X axis.
Definition: TH1.cxx:6961
virtual Int_t GetNbinsZ() const
Definition: TH1.h:293
TH1F()
Constructor.
Definition: TH1.cxx:9310
#define R__ASSERT(e)
Definition: TError.h:96
virtual void SetMinimum(Double_t minimum=-1111)
Definition: TH1.h:391
static THLimitsFinder * GetLimitsFinder()
Return pointer to the current finder.
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
#define gROOT
Definition: TROOT.h:410
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:6930
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition: TString.h:634
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
virtual void Copy(TObject &hnew) const
Copy this to newth1.
Definition: TH1.cxx:9569
Int_t LoadPlugin()
Load the plugin library for this handler.
virtual void GetBinXYZ(Int_t binglobal, Int_t &binx, Int_t &biny, Int_t &binz) const
Return binx, biny, binz corresponding to the global bin number globalbin see TH1::GetBin function abo...
Definition: TH1.cxx:4685
double gamma_quantile_c(double z, double alpha, double theta)
Inverse ( ) of the cumulative distribution function of the upper tail of the gamma distribution (gamm...
virtual void Copy(TObject &hnew) const
Copy this to newth1.
Definition: TH1.cxx:9390
Basic string class.
Definition: TString.h:131
static Bool_t AddDirectoryStatus()
Static function: cannot be inlined on Windows/NT.
Definition: TH1.cxx:705
1-D histogram with a float per channel (see TH1 documentation)}
Definition: TH1.h:567
1-D histogram with a short per channel (see TH1 documentation)
Definition: TH1.h:485
void H1InitExpo()
Compute Initial values of parameters for an exponential.
Definition: TH1.cxx:4428
Array of floats (32 bits per element).
Definition: TArrayF.h:27
static Double_t AutoP2GetPower2(Double_t x, Bool_t next=kTRUE)
Auxilliary function to get the power of 2 next (larger) or previous (smaller) a given x...
Definition: TH1.cxx:1239
virtual void SetTitleFont(Style_t font=62)
Set the title font.
Definition: TAttAxis.cxx:322
Short_t Min(Short_t a, Short_t b)
Definition: TMathBase.h:168
void ToLower()
Change string to lower-case.
Definition: TString.cxx:1100
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
void SetBarOffset(Float_t baroff=0.5)
Definition: TStyle.h:313
R__EXTERN TVirtualMutex * gROOTMutex
Definition: TROOT.h:57
void Copy(TAttMarker &attmarker) const
Copy this marker attributes to a new TAttMarker.
Definition: TAttMarker.cxx:210
virtual TH1 * DrawCopy(Option_t *option="", const char *name_postfix="_copy") const
Copy this histogram and Draw in the current pad.
Definition: TH1.cxx:3021
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Definition: TAttFill.h:39
virtual void Smooth(Int_t ntimes=1, Option_t *option="")
Smooth bin contents of this histogram.
Definition: TH1.cxx:6359
#define gInterpreter
Definition: TInterpreter.h:527
Bool_t IsNaN(Double_t x)
Definition: TMath.h:891
TArrayD fSumw2
Array of sum of squares of weights.
Definition: TH1.h:101
user specified contour levels
Definition: TH1.h:161
virtual void UseCurrentStyle()
Set current style settings in this object This function is called when either TCanvas::UseCurrentStyl...
Definition: TObject.cxx:715
virtual void Copy(TObject &axis) const
Copy axis structure to another axis.
Definition: TAxis.cxx:208
void Copy(TArrayC &array) const
Definition: TArrayC.h:42
virtual Float_t GetLabelSize() const
Definition: TAttAxis.h:41
virtual Double_t GetBinLowEdge(Int_t bin) const
Return bin lower edge for 1D histogram.
Definition: TH1.cxx:8445
static Bool_t AlmostInteger(Double_t a, Double_t epsilon=0.00000001)
Test if a double is almost an integer.
Definition: TH1.cxx:5341
virtual void Copy(TObject &hnew) const
Copy this to newth1.
Definition: TH1.cxx:9210
void Reset()
Definition: TArrayF.h:47
virtual Double_t Integral(Double_t a, Double_t b, Double_t epsrel=1.e-12)
IntegralOneDim or analytical integral.
Definition: TF1.cxx:2409
virtual Int_t FindGoodLimits(TH1 *h, Double_t xmin, Double_t xmax)
Compute the best axis limits for the X axis.
static Bool_t RecomputeAxisLimits(TAxis &destAxis, const TAxis &anAxis)
Finds new limits for the axis for the Merge function.
Definition: TH1.cxx:5381
TAxis fZaxis
Z axis descriptor.
Definition: TH1.h:89
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH1.cxx:9408
virtual TObject * Clone(const char *newname="") const
Make a clone of an collection using the Streamer facility.
Bool_t CanExtend() const
Definition: TAxis.h:82
virtual Double_t GetContourLevel(Int_t level) const
Return value of contour number level.
Definition: TH1.cxx:7732
TF1 * gF1
Definition: TH1.cxx:524
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
Short_t Abs(Short_t d)
Definition: TMathBase.h:108
virtual Width_t GetLineWidth() const
Return the line width.
Definition: TAttLine.h:35
don&#39;t draw stats box
Definition: TH1.h:160
friend TH1D operator+(const TH1D &h1, const TH1D &h2)
Operator +.
Definition: TH1.cxx:9617
Double_t Prob(Double_t chi2, Int_t ndf)
static bool CheckBinLimits(const TAxis *a1, const TAxis *a2)
Check bin limits.
Definition: TH1.cxx:1471
Array of integers (32 bits per element).
Definition: TArrayI.h:27
void Reset(Char_t val=0)
Definition: TArrayC.h:47
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Definition: TMath.h:734
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:694
virtual void SetBuffer(Int_t buffersize, Option_t *option="")
Set the maximum number of entries to be kept in the buffer.
Definition: TH1.cxx:7760
Double_t fTsumwx2
Total Sum of weight*X*X.
Definition: TH1.h:96
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: TH1.cxx:7188
virtual Bool_t CanExtendAllAxes() const
Returns true if all axes are extendable.
Definition: TH1.cxx:6125
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
Definition: TH1.cxx:6583
friend TH1S operator-(const TH1S &h1, const TH1S &h2)
Operator -.
Definition: TH1.cxx:9088
virtual TObject * FindObject(const char *name) const
Delete a TObjLink object.
Definition: TList.cxx:574
Width_t GetHistLineWidth() const
Definition: TStyle.h:223
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
Definition: TH1.cxx:1225
if object in a list can be deleted
Definition: TObject.h:58
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
Definition: TAxis.cxx:514
virtual void SetBarWidth(Float_t width=0.5)
Definition: TH1.h:353
virtual void SetLabelFont(Style_t font=62)
Set labels&#39; font.
Definition: TAttAxis.cxx:183
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition: TObject.cxx:105
static TVirtualHistPainter * HistPainter(TH1 *obj)
Static function returning a pointer to the current histogram painter.
virtual void SetPoint(Int_t ipoint, Double_t re, Double_t im=0)=0
virtual Style_t GetMarkerStyle() const
Return the marker style.
Definition: TAttMarker.h:32
TDirectory * fDirectory
!Pointer to directory holding this histogram
Definition: TH1.h:106
static void SetDefaultSumw2(Bool_t sumw2=kTRUE)
When this static function is called with sumw2=kTRUE, all new histograms will automatically activate ...
Definition: TH1.cxx:6177
Marker Attributes class.
Definition: TAttMarker.h:19
virtual Style_t GetTitleFont() const
Definition: TAttAxis.h:46
static bool CheckConsistentSubAxes(const TAxis *a1, Int_t firstBin1, Int_t lastBin1, const TAxis *a2, Int_t firstBin2=0, Int_t lastBin2=0)
Check that two sub axis are the same.
Definition: TH1.cxx:1578
virtual Style_t GetLineStyle() const
Return the line style.
Definition: TAttLine.h:34
virtual Int_t GetDimension() const
Definition: TH1.h:277
virtual Double_t Interpolate(Double_t x)
Given a point x, approximates the value via linear interpolation based on the two nearest bin centers...
Definition: TH1.cxx:4824
virtual Int_t GetContour(Double_t *levels=0)
Return contour values into array levels if pointer levels is non zero.
Definition: TH1.cxx:7713
TH1C & operator=(const TH1C &h1)
Operator =.
Definition: TH1.cxx:8876
Double_t GetXmin() const
Definition: TAxis.h:133
virtual void Paint(Option_t *option="")=0
This method must be overridden if a class wants to paint itself.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
Fill Area Attributes class.
Definition: TAttFill.h:19
Double_t x[n]
Definition: legend1.C:17
static Int_t FitOptionsMake(Option_t *option, Foption_t &Foption)
Decode string choptin and fill fitOption structure.
Definition: TH1.cxx:4363
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
virtual void Eval(TF1 *f1, Option_t *option="")
Evaluate function f1 at the center of bins of this histogram.
Definition: TH1.cxx:3099
void Class()
Definition: Class.C:29
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
Definition: THashList.h:34
static Bool_t GetDefaultSumw2()
Return kTRUE if TH1::Sumw2 must be called when creating new histograms.
Definition: TH1.cxx:4177
void SetHistFillColor(Color_t color=1)
Definition: TStyle.h:356
virtual Bool_t GetTimeDisplay() const
Definition: TAxis.h:126
static void SetDefaultBufferSize(Int_t buffersize=1000)
Static function to set the default buffer size for automatic histograms.
Definition: TH1.cxx:6167
Use Power(2)-based algorithm for autobinning.
Definition: TH1.h:169
void Copy(TAttLine &attline) const
Copy this line attributes to a new TAttLine.
Definition: TAttLine.cxx:164
virtual void SaveLineAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t widdef=1)
Save line attributes as C++ statement(s) on output stream out.
Definition: TAttLine.cxx:262
virtual Double_t Chi2Test(const TH1 *h2, Option_t *option="UU", Double_t *res=0) const
test for comparing weighted and unweighted histograms
Definition: TH1.cxx:1942
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
virtual ~TH1()
Histogram default destructor.
Definition: TH1.cxx:578
THashList * GetLabels() const
Definition: TAxis.h:117
friend TH1D operator-(const TH1D &h1, const TH1D &h2)
Operator -.
Definition: TH1.cxx:9628
Int_t GetOptFit() const
Definition: TStyle.h:231
Double_t Log10(Double_t x)
Definition: TMath.h:763
virtual void SetContourLevel(Int_t level, Double_t value)
Set value for one contour level.
Definition: TH1.cxx:7824
#define R__WRITE_LOCKGUARD(mutex)
virtual void GetCenter(Double_t *center) const
Return an array with the center of all bins.
Definition: TAxis.cxx:539
TH1I()
Constructor.
Definition: TH1.cxx:9128
Abstract interface to a histogram painter.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
Definition: TAxis.cxx:464
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
Definition: TAttMarker.h:38
Style_t GetHistFillStyle() const
Definition: TStyle.h:221
TH1S()
Constructor.
Definition: TH1.cxx:8947
TString & Append(const char *cs)
Definition: TString.h:559
virtual void GetLowEdge(Double_t *edge) const
Return an array with the lod edge of all bins.
Definition: TAxis.cxx:548
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
Definition: TMath.h:1282
Double_t * fArray
Definition: TArrayD.h:30
void H1InitGaus()
Compute Initial values of parameters for a gaussian.
Definition: TH1.cxx:4372
virtual Size_t GetMarkerSize() const
Return the marker size.
Definition: TAttMarker.h:33
R__EXTERN TVirtualRWMutex * gCoreMutex
virtual bool UseRWLock()
Set this collection to use a RW lock upon access, making it thread safe.
virtual void DrawPanel()=0
errors from Poisson interval at 95% CL (~ 2 sigma)
Definition: TH1.h:64
const Double_t sigma
TString fOption
histogram options
Definition: TH1.h:102
friend TH1I operator-(const TH1I &h1, const TH1I &h2)
Operator -.
Definition: TH1.cxx:9270
virtual void SaveMarkerAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t sizdef=1)
Save line attributes as C++ statement(s) on output stream out.
Definition: TAttMarker.cxx:245
virtual Int_t * GetN() const =0
Float_t GetBarWidth() const
Definition: TStyle.h:171
virtual Bool_t FindNewAxisLimits(const TAxis *axis, const Double_t point, Double_t &newMin, Double_t &newMax)
finds new limits for the axis so that point is within the range and the limits are compatible with th...
Definition: TH1.cxx:5944
TH1F * h1
Definition: legend1.C:5
constexpr Double_t Pi()
Definition: TMath.h:38
virtual void SetContent(const Double_t *content)
Replace bin contents by the contents of array content.
Definition: TH1.cxx:7700
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH1.cxx:1200
friend TH1C operator*(Double_t c1, const TH1C &h1)
Operator *.
Definition: TH1.cxx:8885
virtual void ResetStats()
Reset the statistics including the number of entries and replace with values calculates from bin cont...
Definition: TH1.cxx:7254
void Set(Int_t n)
Set size of this array to n ints.
Definition: TArrayI.cxx:105
Double_t Infinity()
Returns an infinity as defined by the IEEE standard.
Definition: TMath.h:913
TArrayD fContour
Array to display contour levels.
Definition: TH1.h:100
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:8498
Int_t AxisChoice(Option_t *axis) const
Choose an axis according to "axis".
Definition: Haxis.cxx:14
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
virtual void LabelsInflate(Option_t *axis="X")
Double the number of bins for axis.
Definition: TH1.cxx:5024
virtual Color_t GetLabelColor() const
Definition: TAttAxis.h:38
object has not been deleted
Definition: TObject.h:78
short Color_t
Definition: RtypesCore.h:79
virtual Double_t GetSkewness(Int_t axis=1) const
Definition: TH1.cxx:7035
virtual void SetTimeDisplay(Int_t value)
Definition: TAxis.h:161
Double_t fTsumwx
Total Sum of weight*X.
Definition: TH1.h:95
void H1LeastSquareFit(Int_t n, Int_t m, Double_t *a)
Least squares lpolynomial fitting without weights.
Definition: TH1.cxx:4478
virtual Bool_t Divide(TF1 *f1, Double_t c1=1)
Performs the operation: this = this/(c1*f1) if errors are defined (see TH1::Sumw2), errors are also recalculated.
Definition: TH1.cxx:2729
virtual Int_t GetNdivisions() const
Definition: TAttAxis.h:36
static Int_t AutoP2GetBins(Int_t n)
Auxilliary function to get the next power of 2 integer value larger then n.
Definition: TH1.cxx:1252
static Bool_t fgAddDirectory
!flag to add histograms to the directory
Definition: TH1.h:113
virtual void SetUniqueID(UInt_t uid)
Set the unique object id.
Definition: TObject.cxx:705
A doubly linked list.
Definition: TList.h:44
void Set(Int_t n)
Set size of this array to n shorts.
Definition: TArrayS.cxx:105
virtual void GetMinimumAndMaximum(Double_t &min, Double_t &max) const
Retrieve the minimum and maximum values in the histogram.
Definition: TH1.cxx:8025
virtual Double_t Rndm()
Machine independent random number generator.
Definition: TRandom.cxx:533
virtual Double_t GetStdDevError(Int_t axis=1) const
Return error of standard deviation estimation for Normal distribution.
Definition: TH1.cxx:7022
Double_t fMinimum
Minimum value for plotting.
Definition: TH1.h:98
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: TH1.cxx:7527
Bool_t AreEqualAbs(Double_t af, Double_t bf, Double_t epsilon)
Definition: TMath.h:412
virtual void ExtendAxis(Double_t x, TAxis *axis)
Histogram is resized along axis such that x is in the axis range.
Definition: TH1.cxx:6001
Bool_t AreEqualRel(Double_t af, Double_t bf, Double_t relPrec)
Definition: TMath.h:416
TH1 * GetCumulative(Bool_t forward=kTRUE, const char *suffix="_cumulative") const
Return a pointer to an histogram containing the cumulative The cumulative can be computed both in the...
Definition: TH1.cxx:2537
virtual TH1 * FFT(TH1 *h_output, Option_t *option)
This function allows to do discrete Fourier transforms of TH1 and TH2.
Definition: TH1.cxx:3191
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)
Compute distance from point px,py to a line.
Definition: TH1.cxx:2712
void Reset()
Definition: TArrayS.h:47
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH1.cxx:9010
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Definition: TAttLine.h:40
friend TH1S operator/(const TH1S &h1, const TH1S &h2)
Operator /.
Definition: TH1.cxx:9110
Using a TBrowser one can browse all ROOT objects.
Definition: TBrowser.h:37
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py)
Execute action corresponding to one event.
Definition: TH1.cxx:3147
Int_t fN
Definition: TArray.h:38
int isnan(double)
virtual Double_t * GetIntegral()
Return a pointer to the array of bins integral.
Definition: TH1.cxx:2515
NOTE: Must always be 0 !!!
Definition: TH1.h:69
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis from bin first to last.
Definition: TAxis.cxx:903
void Clear(Option_t *option="")
Remove all objects from the list.
Definition: THashList.cxx:189
float ymax
Definition: THbookFile.cxx:93
std::string printValue(const TDatime *val)
Print a TDatime at the prompt.
Definition: TDatime.cxx:514
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
Set limits for parameter ipar.
Definition: TF1.cxx:3404
friend TH1C operator-(const TH1C &h1, const TH1C &h2)
Operator -.
Definition: TH1.cxx:8907
void Copy(TArrayF &array) const
Definition: TArrayF.h:42
friend TH1C operator+(const TH1C &h1, const TH1C &h2)
Operator +.
Definition: TH1.cxx:8896
void FillData(BinData &dv, const TH1 *hist, TF1 *func=0)
fill the data vector from a TH1.
virtual TObject * First() const
Return the first object in the list. Returns 0 when list is empty.
Definition: TList.cxx:655
virtual void FillRandom(const char *fname, Int_t ntimes=5000)
Fill histogram following distribution in function fname.
Definition: TH1.cxx:3421
void SetHistFillStyle(Style_t styl=0)
Definition: TStyle.h:358
Int_t GetLast() const
Return last bin on the axis i.e.
Definition: TAxis.cxx:455
static void SmoothArray(Int_t NN, Double_t *XX, Int_t ntimes=1)
Smooth array xx, translation of Hbook routine hsmoof.F based on algorithm 353QH twice presented by J...
Definition: TH1.cxx:6241
Class to manage histogram axis.
Definition: TAxis.h:30
virtual Double_t GetKurtosis(Int_t axis=1) const
Definition: TH1.cxx:7105
virtual void Draw(Option_t *option="")
Draw this histogram with options.
Definition: TH1.cxx:2974
static bool CheckBinLabels(const TAxis *a1, const TAxis *a2)
Check that axis have same labels.
Definition: TH1.cxx:1497
Array of shorts (16 bits per element).
Definition: TArrayS.h:27
virtual Double_t GetPointReal(Int_t ipoint, Bool_t fromInput=kFALSE) const =0
Int_t GetSize() const
Definition: TArray.h:47
SVector< double, 2 > v
Definition: Dict.h:5
if object ctor succeeded but object should not be used
Definition: TObject.h:68
TH1 * R__H(Int_t hid)
return pointer to histogram with name hid if id >=0 h_id if id <0
Definition: TH1.cxx:9663
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
Definition: TAttFill.h:37
auto * a
Definition: textangle.C:12
A 3-Dim function with parameters.
Definition: TF3.h:28
virtual Double_t GetBinWithContent(Double_t c, Int_t &binx, Int_t firstx=0, Int_t lastx=0, Double_t maxdiff=0) const
Compute first binx in the range [firstx,lastx] for which diff = abs(bin_content-c) <= maxdiff...
Definition: TH1.cxx:4795
friend TH1I operator+(const TH1I &h1, const TH1I &h2)
Operator +.
Definition: TH1.cxx:9259
void SetCanExtend(Bool_t canExtend)
Definition: TAxis.h:86
1-D histogram with an int per channel (see TH1 documentation)}
Definition: TH1.h:526
Long_t ExecPlugin(int nargs, const T &... params)
virtual TObject * Remove(TObject *obj)
Remove object from the list.
Definition: TList.cxx:818
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py)=0
Execute action corresponding to an event at (px,py).
Provides an indirection to the TFitResult class and with a semantics identical to a TFitResult pointe...
Definition: TFitResultPtr.h:31
static TH1 * TransformHisto(TVirtualFFT *fft, TH1 *h_output, Option_t *option)
For a given transform (first parameter), fills the histogram (second parameter) with the transform ou...
Definition: TH1.cxx:8612
static TVirtualFFT * FFT(Int_t ndim, Int_t *n, Option_t *option)
Returns a pointer to the FFT of requested size and type.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:443
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:8514
Collection abstract base class.
Definition: TCollection.h:63
static Int_t fgBufferSize
!default buffer size for automatic histograms
Definition: TH1.h:112
virtual TH1 * Rebin(Int_t ngroup=2, const char *newname="", const Double_t *xbins=0)
Rebin this histogram.
Definition: TH1.cxx:5759
virtual Double_t AndersonDarlingTest(const TH1 *h2, Option_t *option="") const
Statistical test of compatibility in shape between this histogram and h2, using the Anderson-Darling ...
Definition: TH1.cxx:7413
virtual Bool_t Multiply(TF1 *f1, Double_t c1=1)
Performs the operation:
Definition: TH1.cxx:5517
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2264
Double_t fEntries
Number of entries.
Definition: TH1.h:92
unsigned int UInt_t
Definition: RtypesCore.h:42
virtual void SaveFillAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1001)
Save fill attributes as C++ statement(s) on output stream out.
Definition: TAttFill.cxx:233
virtual Float_t GetTitleOffset() const
Definition: TAttAxis.h:42
virtual void LabelsDeflate(Option_t *axis="X")
Reduce the number of bins for the axis passed in the option to the number of bins having a label...
Definition: TH1.cxx:4954
virtual void DoFillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride=1)
Internal method to fill histogram content from a vector called directly by TH1::BufferEmpty.
Definition: TH1.cxx:3380
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
char * Form(const char *fmt,...)
virtual void Transform()=0
virtual Double_t Chisquare(TF1 *f1, Option_t *option="") const
Compute and return the chisquare of this histogram with respect to a function The chisquare is comput...
Definition: TH1.cxx:2429
Ssiz_t Length() const
Definition: TString.h:405
virtual void Append(TObject *obj, Bool_t replace=kFALSE)
Append object to this directory.
Definition: TDirectory.cxx:190
static TVirtualFitter * GetFitter()
static: return the current Fitter
virtual void Copy(TObject &hnew) const
Copy this histogram structure to newth1.
Definition: TH1.cxx:2580
virtual TH1 * ShowBackground(Int_t niter=20, Option_t *option="same")
This function calculates the background spectrum in this histogram.
Definition: TH1.cxx:8579
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH1.cxx:9228
virtual ~TH1C()
Destructor.
Definition: TH1.cxx:8814
static void RejectPoint(Bool_t reject=kTRUE)
Static function to set the global flag to reject points the fgRejectPoint global flag is tested by al...
Definition: TF1.cxx:3610
short Short_t
Definition: RtypesCore.h:35
#define s1(x)
Definition: RSha256.hxx:91
virtual void Copy(TObject &hnew) const
Copy this to newth1.
Definition: TH1.cxx:9029
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
Definition: TAttMarker.h:40
virtual Double_t GetContourLevelPad(Int_t level) const
Return the value of contour number "level" in Pad coordinates.
Definition: TH1.cxx:7742
TAxis * GetYaxis()
Definition: TH1.h:316
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
Definition: BinData.h:53
float xmax
Definition: THbookFile.cxx:93
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
Definition: TList.cxx:354
virtual Color_t GetTitleColor() const
Definition: TAttAxis.h:45
Double_t * fIntegral
!Integral of bins used by GetRandom
Definition: TH1.h:108
virtual void SetBinErrorOption(EBinErrorOpt type)
Definition: TH1.h:369
friend TH1F operator*(Double_t c1, const TH1F &h1)
Operator *.
Definition: TH1.cxx:9427
static bool CheckConsistency(const TH1 *h1, const TH1 *h2)
Check histogram compatibility.
Definition: TH1.cxx:1613
A 2-Dim function with parameters.
Definition: TF2.h:29
void H1LeastSquareSeqnd(Int_t n, Double_t *a, Int_t idim, Int_t &ifail, Int_t k, Double_t *b)
Extracted from CERN Program library routine DSEQN.
Definition: TH1.cxx:4583
TH1()
Histogram default constructor.
Definition: TH1.cxx:550
R__EXTERN TRandom * gRandom
Definition: TRandom.h:62
1-D histogram with a double per channel (see TH1 documentation)}
Definition: TH1.h:610
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:4672
static Int_t GetDefaultBufferSize()
Static function return the default buffer size for automatic histograms the parameter fgBufferSize ma...
Definition: TH1.cxx:4168
virtual void SetAxisColor(Color_t color=1, Float_t alpha=1.)
Set color of the line axis and tick marks.
Definition: TAttAxis.cxx:163
TString fName
Definition: TNamed.h:32
virtual TObject * FindObject(const char *name) const
Search object named name in the list of functions.
Definition: TH1.cxx:3668
virtual void Rebuild(Option_t *option="")
Using the current bin info, recompute the arrays for contents and errors.
Definition: TH1.cxx:6567
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: TH1.cxx:3631
if object destructor must call RecursiveRemove()
Definition: TObject.h:60
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 void SetMarkerSize(Size_t msize=1)
Set the marker size.
Definition: TAttMarker.h:41
friend TH1I operator/(const TH1I &h1, const TH1I &h2)
Operator /.
Definition: TH1.cxx:9292
REAL epsilon
Definition: triangle.c:617
virtual void SetTitleColor(Color_t color=1)
Set color of axis title.
Definition: TAttAxis.cxx:313
constexpr Double_t E()
Base of natural log: .
Definition: TMath.h:97
virtual TObjLink * FirstLink() const
Definition: TList.h:108
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
#define h(i)
Definition: RSha256.hxx:106
#define Printf
Definition: TGeoToOCC.h:18
virtual void RecursiveRemove(TObject *obj)
Recursively remove object from the list of functions.
Definition: TH1.cxx:6073
EBinErrorOpt fBinStatErrOpt
option for bin statistical errors
Definition: TH1.h:110
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:8732
virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const
Return minimum value larger than minval of bins in the range, unless the value has been overridden by...
Definition: TH1.cxx:7929
errors with Normal (Wald) approximation: errorUp=errorLow= sqrt(N)
Definition: TH1.h:62
const Bool_t kFALSE
Definition: RtypesCore.h:88
TVirtualFFT is an interface class for Fast Fourier Transforms.
Definition: TVirtualFFT.h:88
virtual Color_t GetLineColor() const
Return the line color.
Definition: TAttLine.h:33
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
Definition: TAxis.cxx:279
virtual void SetName(const char *name)
Change the name of this histogram.
Definition: TH1.cxx:8254
friend TH1I operator*(Double_t c1, const TH1I &h1)
Operator *.
Definition: TH1.cxx:9248
static TVirtualFFT * SineCosine(Int_t ndim, Int_t *n, Int_t *r2rkind, Option_t *option)
Returns a pointer to a sine or cosine transform of requested size and kind.
TString & Remove(Ssiz_t pos)
Definition: TString.h:668
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
virtual Int_t GetSumw2N() const
Definition: TH1.h:309
Double_t fTsumw2
Total Sum of squares of weights.
Definition: TH1.h:94
Color_t GetHistFillColor() const
Definition: TStyle.h:219
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
Evaluate this function.
Definition: TF1.cxx:1336
virtual void GetPointComplex(Int_t ipoint, Double_t &re, Double_t &im, Bool_t fromInput=kFALSE) const =0
Bin contents are average (used by Add)
Definition: TH1.h:166
virtual Bool_t IsEmpty() const
Definition: TCollection.h:186
return c2
Definition: legend2.C:14
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
Definition: TH1.cxx:8456
static const double x1[5]
virtual TObject * Remove(TObject *)
Remove an object from the in-memory list.
#define ClassImp(name)
Definition: Rtypes.h:359
class describing the range in the coordinates it supports multiple range in a coordinate.
Definition: DataRange.h:34
virtual Double_t GetBinErrorLow(Int_t bin) const
Return lower error associated to bin number bin.
Definition: TH1.cxx:8372
friend TH1F operator+(const TH1F &h1, const TH1F &h2)
Operator +.
Definition: TH1.cxx:9438
double Double_t
Definition: RtypesCore.h:55
Int_t GetOptStat() const
Definition: TStyle.h:232
Int_t * fArray
Definition: TArrayI.h:30
void SetHistLineStyle(Style_t styl=0)
Definition: TStyle.h:359
virtual void SavePrimitiveHelp(std::ostream &out, const char *hname, Option_t *option="")
Helper function for the SavePrimitive functions from TH1 or classes derived from TH1, eg TProfile, TProfile2D.
Definition: TH1.cxx:6778
Double_t fTsumw
Total Sum of weights.
Definition: TH1.h:93
Color_t GetHistLineColor() const
Definition: TStyle.h:220
friend TH1D operator*(Double_t c1, const TH1D &h1)
Operator *.
Definition: TH1.cxx:9606
Describe directory structure in memory.
Definition: TDirectory.h:34
Histogram is forced to be not weighted even when the histogram is filled with weighted different than...
Definition: TH1.h:167
int type
Definition: TGX11.cxx:120
R__EXTERN TEnv * gEnv
Definition: TEnv.h:171
Double_t Median(Long64_t n, const T *a, const Double_t *w=0, Long64_t *work=0)
Return the median of the array a where each entry i has weight w[i] .
Definition: TMath.h:1367
unsigned long ULong_t
Definition: RtypesCore.h:51
int nentries
Definition: THbookFile.cxx:89
Double_t y[n]
Definition: legend1.C:17
virtual Color_t GetFillColor() const
Return the fill area color.
Definition: TAttFill.h:30
TH1I & operator=(const TH1I &h1)
Operator =.
Definition: TH1.cxx:9238
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition: TString.h:619
The TH1 histogram class.
Definition: TH1.h:56
static constexpr double s
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
Definition: TRolke.cxx:630
virtual Double_t GetEntries() const
Return the current number of entries.
Definition: TH1.cxx:4185
friend TH1F operator/(const TH1F &h1, const TH1F &h2)
Operator /.
Definition: TH1.cxx:9471
#define R__LOCKGUARD(mutex)
void forward(const LAYERDATA &prevLayerData, LAYERDATA &currLayerData)
apply the weights (and functions) in forward direction of the DNN
Definition: NeuralNet.icc:544
THist< 2, double, THistStatContent, THistStatUncertainty > TH2D
Definition: THist.hxx:290
virtual Float_t GetTitleSize() const
Definition: TAttAxis.h:43
virtual Double_t Chi2TestX(const TH1 *h2, Double_t &chi2, Int_t &ndf, Int_t &igood, Option_t *option="UU", Double_t *res=0) const
The computation routine of the Chisquare test.
Definition: TH1.cxx:2001
static bool IsEquidistantBinning(const TAxis &axis)
Test if the binning is equidistant.
Definition: TH1.cxx:5350
Short_t fBarOffset
(1000*offset) for bar charts or legos
Definition: TH1.h:90
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
Definition: TAttLine.h:42
double Stat_t
Definition: RtypesCore.h:73
Array of doubles (64 bits per element).
Definition: TArrayD.h:27
Bool_t IsNull() const
Definition: TString.h:402
void FitOptionsMake(EFitObjectType type, const char *option, Foption_t &fitOption)
Decode list of options into fitOption.
Definition: HFitImpl.cxx:681
virtual void InitArgs(const Double_t *x, const Double_t *params)
Initialize parameters addresses.
Definition: TF1.cxx:2361
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), errors are also recalculated.
Definition: TH1.cxx:777
Abstract Base Class for Fitting.
TAxis * GetZaxis()
Definition: TH1.h:317
virtual UInt_t SetCanExtend(UInt_t extendBitMask)
Make the histogram axes extendable / not extendable according to the bit mask returns the previous bi...
Definition: TH1.cxx:6138
virtual Int_t FindFixBin(Double_t x, Double_t y=0, Double_t z=0) const
Return Global bin number corresponding to x,y,z.
Definition: TH1.cxx:3605
Mother of all ROOT objects.
Definition: TObject.h:37
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
Definition: TAxis.cxx:405
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH1.cxx:9047
you should not use this method at all Int_t Int_t z
Definition: TRolke.cxx:630
Bool_t IsReading() const
Definition: TStyle.h:277
virtual void ClearUnderflowAndOverflow()
Remove all the content from the underflow and overflow bins, without changing the number of entries A...
Definition: TH1.cxx:2448
virtual Bool_t IsInside(const Double_t *x) const
return kTRUE if the point is inside the function range
Definition: TF1.h:582
char Char_t
Definition: RtypesCore.h:29
virtual char * GetObjectInfo(Int_t px, Int_t py) const
Redefines TObject::GetObjectInfo.
Definition: TH1.cxx:4222
TH1S & operator=(const TH1S &h1)
Operator =.
Definition: TH1.cxx:9057
virtual Int_t GetNpar() const
Definition: TF1.h:465
Style_t GetHistLineStyle() const
Definition: TStyle.h:222
Double_t fMaximum
Maximum value for plotting.
Definition: TH1.h:97
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
Definition: TAxis.cxx:526
virtual void DirectoryAutoAdd(TDirectory *)
Perform the automatic addition of the histogram to the given directory.
Definition: TH1.cxx:2690
TVirtualHistPainter * fPainter
!pointer to histogram painter
Definition: TH1.h:109
virtual void Copy(TObject &named) const
Copy this to obj.
Definition: TNamed.cxx:94
friend TH1C operator/(const TH1C &h1, const TH1C &h2)
Operator /.
Definition: TH1.cxx:8929
friend TH1S operator*(Double_t c1, const TH1S &h1)
Operator *.
Definition: TH1.cxx:9066
static Bool_t RejectedPoint()
See TF1::RejectPoint above.
Definition: TF1.cxx:3619
virtual void DrawPanel()
Display a panel with all histogram drawing options.
Definition: TH1.cxx:3082
virtual void Add(TObject *obj)
Definition: TList.h:87
auto * l
Definition: textangle.C:4
Int_t fBufferSize
fBuffer size
Definition: TH1.h:104
virtual void RecursiveRemove(TObject *obj)
Remove object from this collection and recursively remove the object from all other objects (and coll...
Definition: TList.cxx:760
virtual Int_t GetMinimumBin() const
Return location of bin with minimum value in the range.
Definition: TH1.cxx:7959
virtual Double_t GetBinErrorSqUnchecked(Int_t bin) const
Definition: TH1.h:435
virtual void GetRange(Double_t *xmin, Double_t *xmax) const
Return range of a generic N-D function.
Definition: TF1.cxx:2170
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:7329
virtual void FillN(Int_t ntimes, const Double_t *x, const Double_t *w, Int_t stride=1)
Fill this histogram with an array x and weights w.
Definition: TH1.cxx:3354
Short_t Max(Short_t a, Short_t b)
Definition: TMathBase.h:200
1-Dim function class
Definition: TF1.h:211
virtual void SetBinsLength(Int_t=-1)
Definition: TH1.h:368
Char_t * fArray
Definition: TArrayC.h:30
1-D histogram with a byte per channel (see TH1 documentation)
Definition: TH1.h:444
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
Definition: TH1.cxx:8313
TObject * Clone(const char *newname=0) const
Make a complete copy of the underlying object.
Definition: TH1.cxx:2657
TF1 * f1
Definition: legend1.C:11
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Definition: TRolke.cxx:630
Double_t GetAt(Int_t i) const
Definition: TArrayD.h:45
Double_t Ceil(Double_t x)
Definition: TMath.h:694
friend TH1F operator-(const TH1F &h1, const TH1F &h2)
Operator -.
Definition: TH1.cxx:9449
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
Definition: TStyle.cxx:1444
Int_t fDimension
!Histogram dimension (1, 2 or 3 dim)
Definition: TH1.h:107
THist< 1, double, THistStatContent, THistStatUncertainty > TH1D
Definition: THist.hxx:284
#define gPad
Definition: TVirtualPad.h:285
void Reset()
Definition: TArrayI.h:47
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 Int_t GetXlast() const
#define c(i)
Definition: RSha256.hxx:101
virtual Double_t GetBinErrorUp(Int_t bin) const
Return upper error associated to bin number bin.
Definition: TH1.cxx:8403
virtual Int_t BufferEmpty(Int_t action=0)
Fill histogram with all entries in the buffer.
Definition: TH1.cxx:1346
virtual void SetParent(TObject *obj)
Definition: TAxis.h:157
void Set(Int_t n)
Set size of this array to n floats.
Definition: TArrayF.cxx:105
virtual ~TH1D()
Destructor.
Definition: TH1.cxx:9554
virtual void SetEntries(Double_t n)
Definition: TH1.h:378
TAxis fXaxis
X axis descriptor.
Definition: TH1.h:87
Float_t GetBarOffset() const
Definition: TStyle.h:170
#define gDirectory
Definition: TDirectory.h:213
virtual TH1 * GetHistogram() const
Return a pointer to the histogram used to visualise the function.
Definition: TF1.cxx:1471
Bool_t IsEmpty() const
Check if an histogram is empty (this a protected method used mainly by TH1Merger ) ...
Definition: TH1.cxx:4873
void ResetBit(UInt_t f)
Definition: TObject.h:171
virtual void SetParameter(Int_t param, Double_t value)
Definition: TF1.h:618
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH1.cxx:9191
virtual void SetTitle(const char *title)
See GetStatOverflows for more information.
Definition: TH1.cxx:6192
TFitResultPtr FitObject(TH1 *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
fitting function for a TH1 (called from TH1::Fit)
Definition: HFitImpl.cxx:964
virtual Int_t GetNdim() const =0
virtual Color_t GetMarkerColor() const
Return the marker color.
Definition: TAttMarker.h:31
Definition: first.py:1
virtual Int_t GetNbinsX() const
Definition: TH1.h:291
Option_t * GetDrawOption() const
Get option used by the graphics system to draw this object.
Definition: TBrowser.h:104
virtual Int_t Poisson(Double_t mean)
Generates a random integer N according to a Poisson law.
Definition: TRandom.cxx:383
virtual Style_t GetFillStyle() const
Return the fill area style.
Definition: TAttFill.h:31
Double_t Sqrt(Double_t x)
Definition: TMath.h:690
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
Definition: TH1.cxx:8829
Int_t GetNbins() const
Definition: TAxis.h:121
Bool_t GetCanvasPreferGL() const
Definition: TStyle.h:175
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:357
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Definition: TCollection.h:182
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
Definition: TAxis.cxx:717
float * q
Definition: THbookFile.cxx:87
static Bool_t AlmostEqual(Double_t a, Double_t b, Double_t epsilon=0.00000001)
Test if two double are almost equal.
Definition: TH1.cxx:5333
virtual Double_t EvalPar(const Double_t *x, const Double_t *params=0)
Evaluate function with given coordinates and parameters.
Definition: TF1.cxx:1365
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition: TNamed.cxx:164
TList * GetListOfFunctions() const
Definition: TH1.h:238
void SetHistLineColor(Color_t color=1)
Definition: TStyle.h:357
virtual TObject * GetUserFunc() const
virtual TObject * GetObjectFit() const
Double_t * fBuffer
[fBufferSize] entry buffer
Definition: TH1.h:105
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition: TEnv.cxx:491
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
const Bool_t kTRUE
Definition: RtypesCore.h:87
Int_t Nint(T x)
Round to nearest integer. Rounds half integers to the nearest even integer.
Definition: TMath.h:712
void AbstractMethod(const char *method) const
Use this method to implement an "abstract" method that you don&#39;t want to leave purely abstract...
Definition: TObject.cxx:922
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:8742
virtual Double_t GetStdDev(Int_t axis=1) const
Returns the Standard Deviation (Sigma).
Definition: TH1.cxx:6984
void Set(Int_t n)
Set size of this array to n doubles.
Definition: TArrayD.cxx:106
virtual Double_t GetRandom() const
Return a random number distributed according the histogram bin contents.
Definition: TH1.cxx:4719
static bool CheckEqualAxes(const TAxis *a1, const TAxis *a2)
Check that the axis are the same.
Definition: TH1.cxx:1542
Double_t GetXmax() const
Definition: TAxis.h:134
double gamma_quantile(double z, double alpha, double theta)
Inverse ( ) of the cumulative distribution function of the lower tail of the gamma distribution (gamm...
virtual ~TH1S()
Destructor.
Definition: TH1.cxx:8995
void Copy(TArrayD &array) const
Definition: TArrayD.h:42
virtual Int_t GetMaximumBin() const
Return location of bin with maximum value in the range.
Definition: TH1.cxx:7874
const Int_t n
Definition: legend1.C:16
Line Attributes class.
Definition: TAttLine.h:18
virtual void GetCenter(Double_t *center) const
Fill array with center of bins for 1D histogram Better to use h1.GetXaxis().GetCenter(center) ...
Definition: TH1.cxx:8467
void H1InitPolynom()
Compute Initial values of parameters for a polynom.
Definition: TH1.cxx:4448
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
Definition: TH1.cxx:8284
TH1F & operator=(const TH1F &h1)
Operator =.
Definition: TH1.cxx:9418
virtual Float_t GetBarWidth() const
Definition: TH1.h:251
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Binary search in an array of n values to locate value.
Definition: TMath.h:1221
char name[80]
Definition: TGX11.cxx:109
const TArrayD * GetXbins() const
Definition: TAxis.h:130
virtual void GetLowEdge(Double_t *edge) const
Fill array with low edge of bins for 1D histogram Better to use h1.GetXaxis().GetLowEdge(edge) ...
Definition: TH1.cxx:8480
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:866
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
Definition: TH1.h:315
virtual void SetBinsLength(Int_t n=-1)
Set total number of bins including under/overflow Reallocate bin contents array.
Definition: TH1.cxx:8866
virtual Style_t GetLabelFont() const
Definition: TAttAxis.h:39
void Copy(TArrayS &array) const
Definition: TArrayS.h:42
virtual Long64_t Merge(TCollection *list)
Add all histograms in the collection to this histogram.
Definition: TH1.cxx:5490
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
double ldexp(double, int)
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:48
virtual Int_t GetNbinsY() const
Definition: TH1.h:292
virtual Option_t * GetType() const =0
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.
Definition: TH1.cxx:8356
virtual Int_t ReadArray(Bool_t *&b)=0
Int_t fNcells
number of bins(1D), cells (2D) +U/Overflows
Definition: TH1.h:86
void Copy(TAttFill &attfill) const
Copy this fill attributes to a new TAttFill.
Definition: TAttFill.cxx:201
void AndersonDarling2SamplesTest(Double_t &pvalue, Double_t &testStat) const
Definition: GoFTest.cxx:646
T MinElement(Long64_t n, const T *a)
Return minimum of array a of length n.
Definition: TMath.h:951
void H1LeastSquareLinearFit(Int_t ndata, Double_t &a0, Double_t &a1, Int_t &ifail)
Least square linear fit without weights.
Definition: TH1.cxx:4537
const char * Data() const
Definition: TString.h:364
Array of chars or bytes (8 bits per element).
Definition: TArrayC.h:27
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save a primitive as a C++ statement(s) on output stream "out".
Definition: TObject.cxx:664
Double_t ATan(Double_t)
Definition: TMath.h:674