ATLAS Offline Software
HistVal2D.icc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <utility>
6 
7 //____________________________________________________________________
8 template <class TH_2D, class THLW_2D>
9 HistVal2D<TH_2D,THLW_2D>::HistVal2D( bool trigger_conversion_all,
10  const std::string& name,
11  const std::string& title,
12  int nbinsx, const double& xmin, const double& xmax,
13  int nbinsy, const double& ymin, const double& ymax )
14  : HistValBase()
15 {
16  m_h1 = new TH_2D(name.c_str(),title.c_str(),nbinsx,xmin,xmax,nbinsy,ymin,ymax);
17  m_h2 = THLW_2D::create(name.c_str(),title.c_str(),nbinsx,xmin,xmax,nbinsy,ymin,ymax);
18  HistVal2D::compareMetaData();
19  if (trigger_conversion_all)
20  triggerConversionToROOTHist();
21 }
22 
23 //____________________________________________________________________
24 template <class TH_2D, class THLW_2D>
25 template <class TFloat>
26 HistVal2D<TH_2D,THLW_2D>::HistVal2D( bool trigger_conversion_all,
27  const std::string& name,
28  const std::string& title,
29  int nbinsx, const TFloat* xbins,
30  int nbinsy, const TFloat* ybins )
31  : HistValBase()
32 {
33  m_h1 = new TH_2D(name.c_str(),title.c_str(),nbinsx,xbins,nbinsy,ybins);
34  m_h2 = THLW_2D::create(name.c_str(),title.c_str(),nbinsx,xbins,nbinsy,ybins);
35  compareMetaData();
36  if (trigger_conversion_all)
37  triggerConversionToROOTHist();
38 }
39 
40 //____________________________________________________________________
41 template <class TH_2D, class THLW_2D>
42 template <class TFloat>
43 HistVal2D<TH_2D,THLW_2D>::HistVal2D( bool trigger_conversion_all,
44  const std::string& name,
45  const std::string& title,
46  int nbinsx, const TFloat* xbins,
47  int nbinsy, const double& ymin, const double& ymax )
48  : HistValBase()
49 {
50  m_h1 = new TH_2D(name.c_str(),title.c_str(),nbinsx,xbins,nbinsy,ymin,ymax);
51  m_h2 = THLW_2D::create(name.c_str(),title.c_str(),nbinsx,xbins,nbinsy,ymin,ymax);
52  compareMetaData();
53  if (trigger_conversion_all)
54  triggerConversionToROOTHist();
55 }
56 
57 //____________________________________________________________________
58 template <class TH_2D, class THLW_2D>
59 template <class TFloat>
60 HistVal2D<TH_2D,THLW_2D>::HistVal2D( bool trigger_conversion_all,
61  const std::string& name,
62  const std::string& title,
63  int nbinsx, const double& xmin, const double& xmax,
64  int nbinsy, const TFloat* ybins )
65  : HistValBase()
66 {
67  m_h1 = new TH_2D(name.c_str(),title.c_str(),nbinsx,xmin,xmax,nbinsy,ybins);
68  m_h2 = THLW_2D::create(name.c_str(),title.c_str(),nbinsx,xmin,xmax,nbinsy,ybins);
69  compareMetaData();
70  if (trigger_conversion_all)
71  triggerConversionToROOTHist();
72 }
73 
74 //____________________________________________________________________
75 template <class TH_2D, class THLW_2D>
76 HistVal2D<TH_2D,THLW_2D>::~HistVal2D()
77 {
78  compareAll();
79  delete m_h1;
80  LWHist::safeDelete(m_h2);
81 }
82 
83 //____________________________________________________________________
84 template <class TH_2D, class THLW_2D>
85 unsigned HistVal2D<TH_2D,THLW_2D>::getXAxis_NBins() const
86 {
87  return std::as_const(*m_h1).GetXaxis()->GetNbins();
88 }
89 
90 //____________________________________________________________________
91 template <class TH_2D, class THLW_2D>
92 unsigned HistVal2D<TH_2D,THLW_2D>::getYAxis_NBins() const
93 {
94  return std::as_const(*m_h1).GetYaxis()->GetNbins();
95 }
96 
97 //____________________________________________________________________
98 template <class TH_2D, class THLW_2D>
99 void HistVal2D<TH_2D,THLW_2D>::setXAxis_BinLabel(unsigned bin, const char* label)
100 {
101  m_h1->GetXaxis()->SetBinLabel(bin,label);
102  m_h2->GetXaxis()->SetBinLabel(bin,label);
103  this->titleOrNameWasChanged();
104 }
105 
106 //____________________________________________________________________
107 template <class TH_2D, class THLW_2D>
108 void HistVal2D<TH_2D,THLW_2D>::setYAxis_BinLabel(unsigned bin, const char* label)
109 {
110  m_h1->GetYaxis()->SetBinLabel(bin,label);
111  m_h2->GetYaxis()->SetBinLabel(bin,label);
112  this->titleOrNameWasChanged();
113 }
114 
115 //____________________________________________________________________
116 template <class TH_2D, class THLW_2D>
117 void HistVal2D<TH_2D,THLW_2D>::setXAxis_LabelSize(float s)
118 {
119  m_h1->GetXaxis()->SetLabelSize(s);
120  m_h2->GetXaxis()->SetLabelSize(s);
121  this->titleOrNameWasChanged();
122 }
123 
124 //____________________________________________________________________
125 template <class TH_2D, class THLW_2D>
126 void HistVal2D<TH_2D,THLW_2D>::setYAxis_LabelSize(float s)
127 {
128  m_h1->GetYaxis()->SetLabelSize(s);
129  m_h2->GetYaxis()->SetLabelSize(s);
130  this->titleOrNameWasChanged();
131 }
132 
133 //____________________________________________________________________
134 template <class TH_2D, class THLW_2D>
135 void HistVal2D<TH_2D,THLW_2D>::setXAxis_Title(const std::string&t)
136 {
137  m_h1->GetXaxis()->SetTitle(t.c_str());
138  m_h2->GetXaxis()->SetTitle(t.c_str());
139  this->titleOrNameWasChanged();
140 }
141 
142 //____________________________________________________________________
143 template <class TH_2D, class THLW_2D>
144 void HistVal2D<TH_2D,THLW_2D>::setYAxis_Title(const std::string&t)
145 {
146  m_h1->GetYaxis()->SetTitle(t.c_str());
147  m_h2->GetYaxis()->SetTitle(t.c_str());
148  this->titleOrNameWasChanged();
149 }
150 
151 //____________________________________________________________________
152 template <class TH_2D, class THLW_2D>
153 void HistVal2D<TH_2D,THLW_2D>::setZAxis_Title(const std::string&t)
154 {
155  m_h1->GetZaxis()->SetTitle(t.c_str());
156  m_h2->GetZaxis()->SetTitle(t.c_str());
157  this->titleOrNameWasChanged();
158 }
159 
160 //____________________________________________________________________
161 template <class TH_2D, class THLW_2D>
162 void HistVal2D<TH_2D,THLW_2D>::SetMarkerColor( short c)
163 {
164  m_h1->SetMarkerColor(c);
165  m_h2->SetMarkerColor(c);
166  this->titleOrNameWasChanged();
167 }
168 
169 //____________________________________________________________________
170 template <class TH_2D, class THLW_2D>
171 void HistVal2D<TH_2D,THLW_2D>::SetMarkerStyle( short s )
172 {
173  m_h1->SetMarkerStyle(s);
174  m_h2->SetMarkerStyle(s);
175  this->titleOrNameWasChanged();
176 }
177 
178 //____________________________________________________________________
179 template <class TH_2D, class THLW_2D>
180 void HistVal2D<TH_2D,THLW_2D>::SetMarkerSize( float sz)
181 {
182  m_h1->SetMarkerSize(sz);
183  m_h2->SetMarkerSize(sz);
184  this->titleOrNameWasChanged();
185 }
186 
187 //____________________________________________________________________
188 template <class TH_2D, class THLW_2D>
189 void HistVal2D<TH_2D,THLW_2D>::setMinimum( const double& m )
190 {
191  m_h1->SetMinimum(m);
192  m_h2->SetMinimum(m);
193  this->titleOrNameWasChanged();
194 }
195 
196 //____________________________________________________________________
197 template <class TH_2D, class THLW_2D>
198 void HistVal2D<TH_2D,THLW_2D>::setMaximum( const double& m )
199 {
200  m_h1->SetMaximum(m);
201  m_h2->SetMaximum(m);
202  this->titleOrNameWasChanged();
203 }
204 
205 //____________________________________________________________________
206 template <class TH_2D, class THLW_2D>
207 void HistVal2D<TH_2D,THLW_2D>::setName(const std::string& name)
208 {
209  m_h1->SetName(convertedRootName(name).c_str());
210  m_h2->SetName(name.c_str());
211  this->titleOrNameWasChanged();
212 }
213 
214 //____________________________________________________________________
215 template <class TH_2D, class THLW_2D>
216 void HistVal2D<TH_2D,THLW_2D>::setTitle(const std::string& title)
217 {
218  m_h1->SetTitle(title.c_str());
219  m_h2->SetTitle(title.c_str());
220  this->titleOrNameWasChanged();
221 }
222 
223 //____________________________________________________________________
224 template <class TH_2D, class THLW_2D>
225 void HistVal2D<TH_2D,THLW_2D>::setNameTitle(const std::string& name,
226  const std::string& title)
227 {
228  m_h1->SetNameTitle(convertedRootName(name).c_str(),title.c_str());
229  m_h2->SetNameTitle(name.c_str(),title.c_str());
230  this->titleOrNameWasChanged();
231 }
232 
233 //____________________________________________________________________
234 template <class TH_2D, class THLW_2D>
235 void HistVal2D<TH_2D,THLW_2D>::fill(const double& x, const double& y)
236 {
237  if (int(m_h2->GetXaxis()->FindBin(x))!=m_h1->GetXaxis()->FindBin(x)) {
238  //repeat test at x+epsilon to not get false positives since
239  //LWHists use float* internally rather than double*:
240  HistValFunctions::test("[TH1-level] GetXaxis()->FindBin()",m_h1->GetXaxis()->FindBin(x+1.0e-5),int(m_h2->GetXaxis()->FindBin(x+1.0e-5)));
241  }
242  if (int(m_h2->GetYaxis()->FindBin(y))!=m_h1->GetYaxis()->FindBin(y)) {
243  //repeat test at y+epsilon to not get false positives since
244  //LWHists use float* internally rather than double*:
245  HistValFunctions::test("[TH1-level] GetYaxis()->FindBin()",m_h1->GetYaxis()->FindBin(y+1.0e-5),int(m_h2->GetYaxis()->FindBin(y+1.0e-5)));
246  }
247  m_h1->Fill(x,y);
248  m_h2->Fill(x,y);
249  this->binContentsChanged();
250 }
251 
252 //____________________________________________________________________
253 template <class TH_2D, class THLW_2D>
254 void HistVal2D<TH_2D,THLW_2D>::fill(const double& x, const double& y, const double& w)
255 {
256  m_h1->Fill(x,y,w);
257  m_h2->Fill(x,y,w);
258  this->binContentsChanged();
259 }
260 
261 //____________________________________________________________________
262 template <class TH_2D, class THLW_2D>
263 void HistVal2D<TH_2D,THLW_2D>::setBinContent(unsigned binx,unsigned biny, const double& content)
264 {
265  m_h1->SetBinContent(binx,biny,content);
266  m_h2->SetBinContent(int(binx),int(biny),content);
267  this->binContentsChanged();
268 }
269 
270 //____________________________________________________________________
271 template <class TH_2D, class THLW_2D>
272 void HistVal2D<TH_2D,THLW_2D>::setBinError(unsigned binx,unsigned biny, const double& error)
273 {
274  m_h1->SetBinError(binx,biny,error);
275  m_h2->SetBinError(binx,biny,error);
276  this->binContentsChanged();
277 }
278 
279 //____________________________________________________________________
280 template <class TH_2D, class THLW_2D>
281 void HistVal2D<TH_2D,THLW_2D>::setBinContentAndError(unsigned binx, unsigned biny, const double& content,const double& error)
282 {
283  m_h1->SetBinContent(binx,biny,content);
284  m_h1->SetBinError(binx,biny,error);
285  m_h2->SetBinContentAndError(binx,biny,content,error);
286  this->binContentsChanged();
287 }
288 
289 //____________________________________________________________________
290 template <class TH_2D, class THLW_2D>
291 void HistVal2D<TH_2D,THLW_2D>::compareBinContents() const
292 {
293  HistValFunctions::compareBinContents_2D(m_h1,m_h2);
294 }
295 
296 //____________________________________________________________________
297 template <class TH_2D, class THLW_2D>
298 void HistVal2D<TH_2D,THLW_2D>::compareMetaData()
299 {
300  HistValFunctions::compareMetaData(m_h1, m_h2);
301 }
302 
303 //____________________________________________________________________
304 template <class TH_2D, class THLW_2D>
305 void HistVal2D<TH_2D,THLW_2D>::compareTH1s()
306 {
307  std::string name1(m_h1->GetName());
308  TH1 * th1_gen(0);
309  if (!converted()) {
310  m_h1->SetName((name1+"tmp").c_str());
311  LWHistControls::setCleanupOnGetROOT(false);
312  m_h2->SetName("tmpname");
313  th1_gen = m_h2->getROOTHist();
314  LWHistControls::setCleanupOnGetROOT(true);
315  } else {
316  th1_gen = m_h2->getROOTHist();
317  }
318 
319  if (!th1_gen)
320  HistValFunctions::testfailed("createTH1(..) returns null!");
321 
322  if (!converted())
323  HistValFunctions::test("[TH1-level] GetName()",std::string("tmpname"),th1_gen->GetName());
324  else
325  HistValFunctions::test("[TH1-level] GetName()",&(m_h1->GetName()[11]),th1_gen->GetName());//"stripping off "::trigger::"
326 
327  //Test various meta data including type and other state data:
328  HistValFunctions::test("[TH1-level] GetTitle()",m_h1->GetTitle(), th1_gen->GetTitle());
329  HistValFunctions::test("[TH1-level] ClassName()",m_h1->ClassName(), th1_gen->ClassName());
330 
331  HistValFunctions::compareBinContents_2D(m_h1,th1_gen);
332  HistValFunctions::compareFields(m_h1,th1_gen);
333 
334  // -> And all other supported state data...
335  HistValFunctions::test("[TH1-level] GetRMS()",m_h1->GetRMS(), th1_gen->GetRMS());
336  HistValFunctions::test("[TH1-level] GetMean()",m_h1->GetMean(), th1_gen->GetMean());
337  HistValFunctions::test("[TH1-level] GetMeanError()",m_h1->GetMeanError(), th1_gen->GetMeanError());
338  //HistValFunctions::test("[TH1-level] ComputeIntegral()",m_h1->ComputeIntegral(), th1_gen->ComputeIntegral());
339  HistValFunctions::test("[TH1-level] Integral()",m_h1->Integral(), th1_gen->Integral());
340 
341  //TODO: Compare more axes values (like min and max, nbins etc.)!!
342  const TArrayD * h1_xbins = m_h1->GetXaxis()->GetXbins();
343  const TArrayD * gen_xbins = th1_gen->GetXaxis()->GetXbins();
344  if ((h1_xbins!=0)!=(gen_xbins!=0))
345  HistValFunctions::testfailed("2D hist has inconsistent presence of xbins");
346  if (h1_xbins&&gen_xbins)
347  HistValFunctions::test("[TH1-level] GetXaxis()->GetXbins()->GetSize()",h1_xbins->GetSize(), gen_xbins->GetSize());
348 
349  const TArrayD * h1_ybins = m_h1->GetYaxis()->GetXbins();
350  const TArrayD * gen_ybins = th1_gen->GetYaxis()->GetXbins();
351  if ((h1_ybins!=0)!=(gen_ybins!=0))
352  HistValFunctions::testfailed("2D hist has inconsistent presence of ybins");
353  if (h1_ybins&&gen_ybins)
354  HistValFunctions::test("[TH1-level] GetYaxis()->GetXbins()->GetSize()",h1_ybins->GetSize(), gen_ybins->GetSize());
355 
356  HistValFunctions::compareMetaData(static_cast<TH_2D*>(th1_gen), m_h2,true/*ignore name*/);
357  HistValFunctions::compareMetaData(m_h1, m_h2,true/*ignore name*/);
358 
359  if (!converted()) {
360  LWHistVal::clearKeptROOTHist(m_h2);//deletes th1_gen
361  m_h1->SetName(name1.c_str());
362  m_h2->SetName(name1.c_str());
363  }
364 }
365 
366 
367 //____________________________________________________________________
368 template <class TH_2D, class THLW_2D>
369 void HistVal2D<TH_2D,THLW_2D>::compareFastLoop()
370 {
371  const unsigned nbinsx = m_h2->GetNbinsX();
372  const unsigned nbinsy = m_h2->GetNbinsY();
373  std::vector<std::pair<std::pair<unsigned,unsigned>,std::pair<double,double> > > active_bins_direct, active_bins_fastloop;
374  unsigned ibinx,ibiny;
375  double c,e;
376  for (ibiny=0;ibiny<=nbinsy+1;++ibiny) {
377  for (ibinx=0;ibinx<=nbinsx+1;++ibinx) {
378  c = m_h1->GetBinContent(ibinx,ibiny);
379  e = m_h1->GetBinError(ibinx,ibiny);
380  if (c!=0||e!=0)
381  active_bins_direct.push_back(std::pair<std::pair<unsigned,unsigned>,std::pair<double,double> >(std::make_pair(ibinx,ibiny),std::make_pair(c,e)));
382  }
383  }
384  m_h2->resetActiveBinLoop();
385  while(m_h2->getNextActiveBin(ibinx,ibiny, c, e))
386  active_bins_fastloop.push_back(std::pair<std::pair<unsigned,unsigned>,std::pair<double,double> >(std::make_pair(ibinx,ibiny),std::make_pair(c,e)));
387  if (!HistValFunctions::compatible(active_bins_direct,active_bins_fastloop)) {
388  std::cout<<"--> Correct bins: "<< HistValFunctions::toString(active_bins_direct)<<std::endl;;
389  std::cout<<"--> Fastloop bins: "<< HistValFunctions::toString(active_bins_fastloop)<<std::endl;;
390  HistValFunctions::testfailed("Fast-looping did not return correct active bins");
391  }
392 }