ATLAS Offline Software
HistValProfile2D.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 //____________________________________________________________________
9 HistValProfile2D::HistValProfile2D( bool trigger_conversion_all,
10  const std::string& name, const std::string& title,
11  int nbinsx, const double& xmin, const double& xmax,
12  int nbinsy, const double& ymin, const double& ymax,
13  const double& profparmin, const double& profparmax)
14  : HistValBase()
15 {
16  m_h1 = new TProfile2D(name.c_str(),title.c_str(),nbinsx,xmin,xmax,nbinsy,ymin,ymax,profparmin, profparmax,profile_test_erroroption());
17  m_h2 = TProfile2D_LW::create(name.c_str(),title.c_str(),nbinsx,xmin,xmax,nbinsy,ymin,ymax,profparmin, profparmax,profile_test_erroroption());
18  HistValProfile2D::compareMetaData();
19 
20  if (trigger_conversion_all)
21  triggerConversionToROOTHist();
22 }
23 
24 //____________________________________________________________________
25 HistValProfile2D::HistValProfile2D( bool trigger_conversion_all,
26  const std::string& name, const std::string& title,
27  int nbinsx, const double* xbins,
28  int nbinsy, const double* ybins)
29  : HistValBase()
30 {
31  m_h1 = new TProfile2D(name.c_str(),title.c_str(),nbinsx,xbins,nbinsy,ybins,profile_test_erroroption());
32  m_h2 = TProfile2D_LW::create(name.c_str(),title.c_str(),nbinsx,xbins,nbinsy,ybins,profile_test_erroroption());
33  HistValProfile2D::compareMetaData();
34 
35  if (trigger_conversion_all)
36  triggerConversionToROOTHist();
37 }
38 
39 //____________________________________________________________________
40 HistValProfile2D::~HistValProfile2D()
41 {
42  compareAll();
43  delete m_h1;
44  LWHist::safeDelete(m_h2);
45 }
46 
47 //____________________________________________________________________
48 unsigned HistValProfile2D::getXAxis_NBins() const
49 {
50  return std::as_const(*m_h1).GetXaxis()->GetNbins();
51 }
52 
53 //____________________________________________________________________
54 unsigned HistValProfile2D::getYAxis_NBins() const
55 {
56  return std::as_const(*m_h1).GetYaxis()->GetNbins();
57 }
58 
59 //____________________________________________________________________
60 void HistValProfile2D::fill(const double& x, const double& y, const double& z)
61 {
62  m_h1->Fill(x,y,z);
63  m_h2->Fill(x,y,z);
64  this->binContentsChanged();
65 }
66 
67 //____________________________________________________________________
68 void HistValProfile2D::fill(const double& x, const double& y, const double& z, const double& w)
69 {
70  if (w<0) return;//Latest root gives NaN's in case of negative weights => not worth reproducing that.
71  m_h1->Fill(x,y,z,w);
72  m_h2->Fill(x,y,z,w);
73  this->binContentsChanged();
74 }
75 
76 // //____________________________________________________________________
77 // void HistValProfile2D::setBinEntries(unsigned binx, unsigned biny, const double& entries)
78 // {
79 // //Do nothing, since root's 2D histograms don't support this n
80 // // m_h1->SetBinEntries(binx,biny,entries);
81 // // m_h2->SetBinEntries(binx,biny,entries);
82 // // this->binContentsChanged();
83 // }
84 
85 //____________________________________________________________________
86 void HistValProfile2D::setBinContent(unsigned binx, unsigned biny, const double& content)
87 {
88  m_h1->SetBinContent(binx,biny,content);
89  m_h2->SetBinContent(binx,biny,content);
90  this->binContentsChanged();
91 }
92 
93 //____________________________________________________________________
94 void HistValProfile2D::setBinError(unsigned binx, unsigned biny, const double& error)
95 {
96  m_h1->SetBinError(binx,biny,error);
97  m_h2->SetBinError(binx,biny,error);
98  this->binContentsChanged();
99 }
100 
101 //____________________________________________________________________
102 void HistValProfile2D::setBinInfo(unsigned binx, unsigned biny, const double& entries, const double& content,const double& error)
103 {
104  if (entries<0)
105  return;//Fixme: this is because of some NaN resulting from ROOT internals which I can't reproduce.
106  m_h1->SetBinEntries(biny * (m_h1->GetNbinsX()+2) + binx,//ROOT only provides method with the internal bin.
107  entries);
108  m_h1->SetBinContent(binx,biny,content);
109  m_h1->SetBinError(binx,biny,error);
110  m_h2->SetBinInfo(binx,biny,entries,content,error);
111  this->binContentsChanged();
112 }
113 
114 //____________________________________________________________________
115 void HistValProfile2D::compareBinContents() const
116 {
117  HistValFunctions::test("GetNbinsX()",int(m_h1->GetNbinsX()), int(m_h2->GetNbinsX()));
118  HistValFunctions::test("GetNbinsY()",int(m_h1->GetNbinsY()), int(m_h2->GetNbinsY()));
119  int nx = m_h1->GetNbinsX();
120  int ny = m_h1->GetNbinsY();
121  std::ostringstream s;
122  for (int ix=0;ix<=nx+1;++ix) {
123  for (int iy=0;iy<=ny+1;++iy) {
124  int internal_bin = iy * (nx+2) + ix;
125  double entries_1 = m_h1->GetBinEntries(internal_bin);
126  double content_1 = m_h1->GetBinContent(ix,iy);
127  double error_1 = m_h1->GetBinError(ix,iy);
128  //double entries_2 = m_h2->GetBinEntries(i);
129  double content_2 = m_h2->GetBinContent(ix,iy);
130  double error_2 = m_h2->GetBinError(ix,iy);
131  double entries_3, content_3, error_3;
132  m_h2->GetBinInfo(ix,iy,entries_3, content_3, error_3);
133  if (!HistValFunctions::compatible(entries_1,entries_3)) {
134  s << "[TProfile2D vs. TProfile2D_LW] bin-entries for (ix="<<ix<<" and iy="<<iy
135  <<", nbinsx="<<nx<<", nbinsy="<<ny<<", ninternalbins="<<(nx+2)*(ny+2)<<")";
136  HistValFunctions::test(s.str(),entries_1,entries_3);
137  }
138  if (!HistValFunctions::compatible(content_1,content_2)) {
139  s << "[TProfile2D vs. TProfile2D_LW] GetBinContent("<<ix<<", "<<iy
140  <<", nbinsx="<<nx<<", nbinsy="<<ny<<", ninternalbins="<<(nx+2)*(ny+2)<<")";
141  HistValFunctions::test(s.str(),content_1,content_2);
142  }
143  if (!HistValFunctions::compatible(error_1,error_2)) {
144  s << "[TProfile2D vs. TProfile2D_LW] GetBinError("<<ix<<", "<<iy
145  <<", nbinsx="<<nx<<", nbinsy="<<ny<<", ninternalbins="<<(nx+2)*(ny+2)<<")";
146  HistValFunctions::test(s.str(),error_1,error_2);
147  }
148  if (!HistValFunctions::compatible(content_1,content_3)) {
149  s << "[TProfile2D vs. TProfile2D_LW] content from GetBinInfo("<<ix<<", "<<iy
150  <<", nbinsx="<<nx<<", nbinsy="<<ny<<", ninternalbins="<<(nx+2)*(ny+2)<<")";
151  HistValFunctions::test(s.str(),content_1,content_3);
152  }
153  if (!HistValFunctions::compatible(error_1,error_3)) {
154  s << "[TProfile2D vs. TProfile2D_LW] error from GetBinInfo("<<ix<<", "<<iy
155  <<", nbinsx="<<nx<<", nbinsy="<<ny<<", ninternalbins="<<(nx+2)*(ny+2)<<")";
156  HistValFunctions::test(s.str(),error_1,error_3);
157  }
158  }
159  }
160 
161 }
162 
163 //____________________________________________________________________
164 void HistValProfile2D::compareMetaData()
165 {
166  HistValFunctions::compareMetaData(m_h1, m_h2);
167 }
168 
169 //____________________________________________________________________
170 void HistValProfile2D::compareTH1s()
171 {
172  std::string name1(m_h1->GetName());
173  TH1 * th1_gen(0);
174  if (!converted()) {
175  m_h1->SetName((name1+"tmp").c_str());
176  LWHistControls::setCleanupOnGetROOT(false);
177  m_h2->SetName("tmpname");
178  th1_gen = m_h2->getROOTHist();
179  LWHistControls::setCleanupOnGetROOT(true);
180  } else {
181  th1_gen = m_h2->getROOTHist();
182  }
183  if (!th1_gen)
184  HistValFunctions::testfailed("getROOTHist(..) returns null!");
185 
186  if (!converted())
187  HistValFunctions::test("[TH1-level] GetName()",std::string("tmpname"),th1_gen->GetName());
188  else
189  HistValFunctions::test("[TH1-level] GetName()",&(m_h1->GetName()[11]),th1_gen->GetName());//"stripping off "::trigger::"
190 
191  //Test various meta data including type and other state data:
192  HistValFunctions::test("[TH1-level] GetTitle()",m_h1->GetTitle(), th1_gen->GetTitle());
193  HistValFunctions::test("[TH1-level] ClassName()",m_h1->ClassName(), th1_gen->ClassName());
194 
195  HistValFunctions::test("[TH1-level] GetZmin()",static_cast<TProfile2D*>(m_h1)->GetZmin(), static_cast<TProfile2D*>(th1_gen)->GetZmin());
196  HistValFunctions::test("[TH1-level] GetZmax()",static_cast<TProfile2D*>(m_h1)->GetZmax(), static_cast<TProfile2D*>(th1_gen)->GetZmax());
197 
198  HistValFunctions::compareBinContents_2D(m_h1,th1_gen,true/*relaxedErrorComparison*/);
199  HistValFunctions::compareFields(m_h1,th1_gen);
200 
201  // -> And all other supported state data...
202  HistValFunctions::test("[TH1-level] GetRMS()",m_h1->GetRMS(), th1_gen->GetRMS());
203  HistValFunctions::test("[TH1-level] GetMean()",m_h1->GetMean(), th1_gen->GetMean());
204  HistValFunctions::test("[TH1-level] GetMeanError()",m_h1->GetMeanError(), th1_gen->GetMeanError());
205  //HistValFunctions::test("[TH1-level] ComputeIntegral()",m_h1->ComputeIntegral(), th1_gen->ComputeIntegral());
206  HistValFunctions::test("[TH1-level] Integral()",m_h1->Integral(), th1_gen->Integral());
207 
208  //TODO: Compare more axes values (like min and max, nbins etc.)!!
209  const TArrayD * h1_xbins = m_h1->GetXaxis()->GetXbins();
210  const TArrayD * gen_xbins = th1_gen->GetXaxis()->GetXbins();
211  if ((h1_xbins!=0)!=(gen_xbins!=0))
212  HistValFunctions::testfailed("2D hist has inconsistent presence of xbins");
213  if (h1_xbins&&gen_xbins)
214  HistValFunctions::test("[TH1-level] GetXaxis()->GetXbins()->GetSize()",h1_xbins->GetSize(), gen_xbins->GetSize());
215 
216  const TArrayD * h1_ybins = m_h1->GetYaxis()->GetXbins();
217  const TArrayD * gen_ybins = th1_gen->GetYaxis()->GetXbins();
218  if ((h1_ybins!=0)!=(gen_ybins!=0))
219  HistValFunctions::testfailed("2D hist has inconsistent presence of ybins");
220  if (h1_ybins&&gen_ybins)
221  HistValFunctions::test("[TH1-level] GetYaxis()->GetXbins()->GetSize()",h1_ybins->GetSize(), gen_ybins->GetSize());
222 
223  HistValFunctions::compareBinContents_2D(m_h1, m_h2,true/*relaxedErrorComparison*/);
224  HistValFunctions::compareBinContents_2D(th1_gen, m_h2,true/*relaxedErrorComparison*/);
225  HistValFunctions::compareBinContents_2D(th1_gen, m_h1,true/*relaxedErrorComparison*/);
226  HistValFunctions::compareMetaData(static_cast<TProfile2D*>(th1_gen), m_h2,true/*ignore name*/);
227  HistValFunctions::compareMetaData(m_h1, m_h2,true/*ignore name*/);
228 
229  if (!converted()) {
230  LWHistVal::clearKeptROOTHist(m_h2);//deletes th1_gen
231  m_h1->SetName(name1.c_str());
232  m_h2->SetName(name1.c_str());
233  }
234 }
235 
236 //____________________________________________________________________
237 void HistValProfile2D::compareFastLoop()
238 {
239 }
240 
241 
242 //____________________________________________________________________
243 void HistValProfile2D::setXAxis_BinLabel(unsigned bin, const char* label)
244 {
245  m_h1->GetXaxis()->SetBinLabel(bin,label);
246  m_h2->GetXaxis()->SetBinLabel(bin,label);
247  this->titleOrNameWasChanged();
248 }
249 
250 //____________________________________________________________________
251 void HistValProfile2D::setYAxis_BinLabel(unsigned bin, const char* label)
252 {
253  m_h1->GetYaxis()->SetBinLabel(bin,label);
254  m_h2->GetYaxis()->SetBinLabel(bin,label);
255  this->titleOrNameWasChanged();
256 }
257 
258 //____________________________________________________________________
259 void HistValProfile2D::setXAxis_LabelSize(float s)
260 {
261  m_h1->GetXaxis()->SetLabelSize(s);
262  m_h2->GetXaxis()->SetLabelSize(s);
263  this->titleOrNameWasChanged();
264 }
265 
266 //____________________________________________________________________
267 void HistValProfile2D::setYAxis_LabelSize(float s)
268 {
269  m_h1->GetYaxis()->SetLabelSize(s);
270  m_h2->GetYaxis()->SetLabelSize(s);
271  this->titleOrNameWasChanged();
272 }
273 
274 //____________________________________________________________________
275 void HistValProfile2D::setXAxis_Title(const std::string&t)
276 {
277  m_h1->GetXaxis()->SetTitle(t.c_str());
278  m_h2->GetXaxis()->SetTitle(t.c_str());
279  this->titleOrNameWasChanged();
280 }
281 
282 //____________________________________________________________________
283 void HistValProfile2D::setYAxis_Title(const std::string&t)
284 {
285  m_h1->GetYaxis()->SetTitle(t.c_str());
286  m_h2->GetYaxis()->SetTitle(t.c_str());
287  this->titleOrNameWasChanged();
288 }
289 
290 //____________________________________________________________________
291 void HistValProfile2D::setZAxis_Title(const std::string&t)
292 {
293  m_h1->GetZaxis()->SetTitle(t.c_str());
294  m_h2->GetZaxis()->SetTitle(t.c_str());
295  this->titleOrNameWasChanged();
296 }
297 
298 //____________________________________________________________________
299 void HistValProfile2D::SetMarkerColor( short c)
300 {
301  m_h1->SetMarkerColor(c);
302  m_h2->SetMarkerColor(c);
303  this->titleOrNameWasChanged();
304 }
305 
306 //____________________________________________________________________
307 void HistValProfile2D::SetMarkerStyle( short s )
308 {
309  m_h1->SetMarkerStyle(s);
310  m_h2->SetMarkerStyle(s);
311  assert(m_h1->GetMarkerStyle()==s);
312  assert(m_h2->GetMarkerStyle()==s);
313  this->titleOrNameWasChanged();
314 }
315 
316 //____________________________________________________________________
317 void HistValProfile2D::SetMarkerSize( float sz)
318 {
319  m_h1->SetMarkerSize(sz);
320  m_h2->SetMarkerSize(sz);
321  this->titleOrNameWasChanged();
322 }
323 
324 //____________________________________________________________________
325 void HistValProfile2D::setMinimum( const double& m )
326 {
327  m_h1->SetMinimum(m);
328  m_h2->SetMinimum(m);
329  this->titleOrNameWasChanged();
330 }
331 
332 //____________________________________________________________________
333 void HistValProfile2D::setMaximum( const double& m )
334 {
335  m_h1->SetMaximum(m);
336  m_h2->SetMaximum(m);
337  this->titleOrNameWasChanged();
338 }
339 
340 //____________________________________________________________________
341 void HistValProfile2D::setName(const std::string& name)
342 {
343  m_h1->SetName(convertedRootName(name).c_str());
344  m_h2->SetName(name.c_str());
345  this->titleOrNameWasChanged();
346 }
347 
348 //____________________________________________________________________
349 void HistValProfile2D::setTitle(const std::string& title)
350 {
351  m_h1->SetTitle(title.c_str());
352  m_h2->SetTitle(title.c_str());
353  this->titleOrNameWasChanged();
354 }
355 
356 //____________________________________________________________________
357 void HistValProfile2D::setNameTitle(const std::string& name,
358  const std::string& title)
359 {
360  m_h1->SetNameTitle(convertedRootName(name).c_str(),title.c_str());
361  m_h2->SetNameTitle(name.c_str(),title.c_str());
362  this->titleOrNameWasChanged();
363 }