Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
fillhistosauto2p.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_hist
3 /// Fill multiple histograms with different functions and automatic binning.
4 /// Illustrates merging with the power-of-two autobin algorithm
5 ///
6 /// \macro_output
7 /// \macro_code
8 ///
9 /// \date November 2017
10 /// \author Gerardo Ganis
11 
12 #include "TF1.h"
13 #include "TH1D.h"
14 #include "TMath.h"
15 #include "TF1.h"
16 #include "TCanvas.h"
17 #include "TRandom3.h"
18 #include "TStatistic.h"
19 #include "TFile.h"
20 #include "TStyle.h"
21 
22 TF1 *gam = new TF1("gam", "1/(1+0.1*x*0.1*x)", -100., 100.);
23 TF1 *gam1 = new TF1("gam", "1/(1+0.1*x*0.1*x)", -1., .25);
24 TF1 *iga = new TF1("inv gam", "1.-1/(1+0.1*x*0.1*x)", -100., 100.);
25 TF1 *iga1 = new TF1("inv gam", "1.-1/(1+0.1*x*0.1*x)", -.5, 1.);
26 
27 void fillhistosauto2p(unsigned opt = 1, unsigned n = 1001)
28 {
29 
30  UInt_t nh = 10;
31  UInt_t bsize = 1000;
32 
33  TRandom3 rndm((Long64_t)time(0));
34 
35  // Standard autobinning reference
36  auto href = new TH1D("myhref", "current", 50, 0., -1.);
37  href->SetBuffer(bsize);
38 
39  // New autobinning 1-histo reference
40  auto href2 = new TH1D("myhref", "Auto P2, sequential", 50, 0., -1.);
41  href2->SetBit(TH1::kAutoBinPTwo);
42  href2->SetBuffer(bsize);
43 
44  TList *hlist = new TList;
45 
46  Int_t nbins = 50;
47 
48  TStatistic x("min"), y("max"), d("dif"), a("mean"), r("rms");
49  for (UInt_t j = 0; j < nh; ++j) {
50  Double_t xmi = 1e15, xma = -1e15;
51  TStatistic xw("work");
52  TString hname = TString::Format("myh%d", j);
53  auto hw = new TH1D(hname.Data(), "Auto P2, merged", nbins, 0., -1.);
54  hw->SetBit(TH1::kAutoBinPTwo);
55  hw->SetBuffer(bsize);
56 
57  Double_t xhma, xhmi, ovf, unf;
58  Bool_t emptied = kFALSE, tofill = kTRUE;
59  Bool_t buffering = kTRUE;
60  for (UInt_t i = 0; i < n; ++i) {
61 
62  Double_t xx;
63  switch (opt) {
64  case 1: xx = rndm.Gaus(3, 1); break;
65  case 2: xx = rndm.Rndm() * 100. - 50.; break;
66  case 3: xx = gam->GetRandom(); break;
67  case 4: xx = gam1->GetRandom(); break;
68  case 5: xx = iga->GetRandom(); break;
69  case 6: xx = iga1->GetRandom(); break;
70  default: xx = rndm.Gaus(0, 1);
71  }
72 
73  if (buffering) {
74  if (xx > xma)
75  xma = xx;
76  if (xx < xmi)
77  xmi = xx;
78  xw.Fill(xx);
79  }
80  hw->Fill(xx);
81  href->Fill(xx);
82  href2->Fill(xx);
83  if (!hw->GetBuffer()) {
84  // Not buffering anymore
85  buffering = kFALSE;
86  }
87  }
88  x.Fill(xmi);
89  y.Fill(xma);
90  d.Fill(xma - xmi);
91  a.Fill(xw.GetMean());
92  r.Fill(xw.GetRMS());
93 
94  hlist->Add(hw);
95  }
96 
97  x.Print();
98  y.Print();
99  d.Print();
100  a.Print();
101  r.Print();
102 
103  TH1D *h0 = (TH1D *)hlist->First();
104  hlist->Remove(h0);
105  if (!h0->Merge(hlist))
106  return;
107 
108  gStyle->SetOptStat(111110);
109 
110  if (gROOT->GetListOfCanvases()->FindObject("c3"))
111  delete gROOT->GetListOfCanvases()->FindObject("c3");
112  TCanvas *c3 = new TCanvas("c3", "c3", 800, 800);
113  c3->Divide(1, 3);
114  c3->cd(1);
115  h0->StatOverflows();
116  h0->DrawClone("HIST");
117 
118  c3->cd(2);
119  href2->StatOverflows();
120  href2->DrawClone();
121 
122  c3->cd(3);
123  href->StatOverflows();
124  href->DrawClone();
125  c3->Update();
126  std::cout << " ent: " << h0->GetEntries() << "\n";
127  h0->Print();
128  href->Print();
129 
130  hlist->SetOwner(kTRUE);
131  delete hlist;
132  delete href;
133  delete href2;
134  delete h0;
135 }