2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
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 )
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();
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 )
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);
36 if (trigger_conversion_all)
37 triggerConversionToROOTHist();
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 )
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);
53 if (trigger_conversion_all)
54 triggerConversionToROOTHist();
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 )
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);
70 if (trigger_conversion_all)
71 triggerConversionToROOTHist();
74 //____________________________________________________________________
75 template <class TH_2D, class THLW_2D>
76 HistVal2D<TH_2D,THLW_2D>::~HistVal2D()
80 LWHist::safeDelete(m_h2);
83 //____________________________________________________________________
84 template <class TH_2D, class THLW_2D>
85 unsigned HistVal2D<TH_2D,THLW_2D>::getXAxis_NBins() const
87 return std::as_const(*m_h1).GetXaxis()->GetNbins();
90 //____________________________________________________________________
91 template <class TH_2D, class THLW_2D>
92 unsigned HistVal2D<TH_2D,THLW_2D>::getYAxis_NBins() const
94 return std::as_const(*m_h1).GetYaxis()->GetNbins();
97 //____________________________________________________________________
98 template <class TH_2D, class THLW_2D>
99 void HistVal2D<TH_2D,THLW_2D>::setXAxis_BinLabel(unsigned bin, const char* label)
101 m_h1->GetXaxis()->SetBinLabel(bin,label);
102 m_h2->GetXaxis()->SetBinLabel(bin,label);
103 this->titleOrNameWasChanged();
106 //____________________________________________________________________
107 template <class TH_2D, class THLW_2D>
108 void HistVal2D<TH_2D,THLW_2D>::setYAxis_BinLabel(unsigned bin, const char* label)
110 m_h1->GetYaxis()->SetBinLabel(bin,label);
111 m_h2->GetYaxis()->SetBinLabel(bin,label);
112 this->titleOrNameWasChanged();
115 //____________________________________________________________________
116 template <class TH_2D, class THLW_2D>
117 void HistVal2D<TH_2D,THLW_2D>::setXAxis_LabelSize(float s)
119 m_h1->GetXaxis()->SetLabelSize(s);
120 m_h2->GetXaxis()->SetLabelSize(s);
121 this->titleOrNameWasChanged();
124 //____________________________________________________________________
125 template <class TH_2D, class THLW_2D>
126 void HistVal2D<TH_2D,THLW_2D>::setYAxis_LabelSize(float s)
128 m_h1->GetYaxis()->SetLabelSize(s);
129 m_h2->GetYaxis()->SetLabelSize(s);
130 this->titleOrNameWasChanged();
133 //____________________________________________________________________
134 template <class TH_2D, class THLW_2D>
135 void HistVal2D<TH_2D,THLW_2D>::setXAxis_Title(const std::string&t)
137 m_h1->GetXaxis()->SetTitle(t.c_str());
138 m_h2->GetXaxis()->SetTitle(t.c_str());
139 this->titleOrNameWasChanged();
142 //____________________________________________________________________
143 template <class TH_2D, class THLW_2D>
144 void HistVal2D<TH_2D,THLW_2D>::setYAxis_Title(const std::string&t)
146 m_h1->GetYaxis()->SetTitle(t.c_str());
147 m_h2->GetYaxis()->SetTitle(t.c_str());
148 this->titleOrNameWasChanged();
151 //____________________________________________________________________
152 template <class TH_2D, class THLW_2D>
153 void HistVal2D<TH_2D,THLW_2D>::setZAxis_Title(const std::string&t)
155 m_h1->GetZaxis()->SetTitle(t.c_str());
156 m_h2->GetZaxis()->SetTitle(t.c_str());
157 this->titleOrNameWasChanged();
160 //____________________________________________________________________
161 template <class TH_2D, class THLW_2D>
162 void HistVal2D<TH_2D,THLW_2D>::SetMarkerColor( short c)
164 m_h1->SetMarkerColor(c);
165 m_h2->SetMarkerColor(c);
166 this->titleOrNameWasChanged();
169 //____________________________________________________________________
170 template <class TH_2D, class THLW_2D>
171 void HistVal2D<TH_2D,THLW_2D>::SetMarkerStyle( short s )
173 m_h1->SetMarkerStyle(s);
174 m_h2->SetMarkerStyle(s);
175 this->titleOrNameWasChanged();
178 //____________________________________________________________________
179 template <class TH_2D, class THLW_2D>
180 void HistVal2D<TH_2D,THLW_2D>::SetMarkerSize( float sz)
182 m_h1->SetMarkerSize(sz);
183 m_h2->SetMarkerSize(sz);
184 this->titleOrNameWasChanged();
187 //____________________________________________________________________
188 template <class TH_2D, class THLW_2D>
189 void HistVal2D<TH_2D,THLW_2D>::setMinimum( const double& m )
193 this->titleOrNameWasChanged();
196 //____________________________________________________________________
197 template <class TH_2D, class THLW_2D>
198 void HistVal2D<TH_2D,THLW_2D>::setMaximum( const double& m )
202 this->titleOrNameWasChanged();
205 //____________________________________________________________________
206 template <class TH_2D, class THLW_2D>
207 void HistVal2D<TH_2D,THLW_2D>::setName(const std::string& name)
209 m_h1->SetName(convertedRootName(name).c_str());
210 m_h2->SetName(name.c_str());
211 this->titleOrNameWasChanged();
214 //____________________________________________________________________
215 template <class TH_2D, class THLW_2D>
216 void HistVal2D<TH_2D,THLW_2D>::setTitle(const std::string& title)
218 m_h1->SetTitle(title.c_str());
219 m_h2->SetTitle(title.c_str());
220 this->titleOrNameWasChanged();
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)
228 m_h1->SetNameTitle(convertedRootName(name).c_str(),title.c_str());
229 m_h2->SetNameTitle(name.c_str(),title.c_str());
230 this->titleOrNameWasChanged();
233 //____________________________________________________________________
234 template <class TH_2D, class THLW_2D>
235 void HistVal2D<TH_2D,THLW_2D>::fill(const double& x, const double& y)
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)));
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)));
249 this->binContentsChanged();
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)
258 this->binContentsChanged();
261 //____________________________________________________________________
262 template <class TH_2D, class THLW_2D>
263 void HistVal2D<TH_2D,THLW_2D>::setBinContent(unsigned binx,unsigned biny, const double& content)
265 m_h1->SetBinContent(binx,biny,content);
266 m_h2->SetBinContent(int(binx),int(biny),content);
267 this->binContentsChanged();
270 //____________________________________________________________________
271 template <class TH_2D, class THLW_2D>
272 void HistVal2D<TH_2D,THLW_2D>::setBinError(unsigned binx,unsigned biny, const double& error)
274 m_h1->SetBinError(binx,biny,error);
275 m_h2->SetBinError(binx,biny,error);
276 this->binContentsChanged();
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)
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();
289 //____________________________________________________________________
290 template <class TH_2D, class THLW_2D>
291 void HistVal2D<TH_2D,THLW_2D>::compareBinContents() const
293 HistValFunctions::compareBinContents_2D(m_h1,m_h2);
296 //____________________________________________________________________
297 template <class TH_2D, class THLW_2D>
298 void HistVal2D<TH_2D,THLW_2D>::compareMetaData()
300 HistValFunctions::compareMetaData(m_h1, m_h2);
303 //____________________________________________________________________
304 template <class TH_2D, class THLW_2D>
305 void HistVal2D<TH_2D,THLW_2D>::compareTH1s()
307 std::string name1(m_h1->GetName());
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);
316 th1_gen = m_h2->getROOTHist();
320 HistValFunctions::testfailed("createTH1(..) returns null!");
323 HistValFunctions::test("[TH1-level] GetName()",std::string("tmpname"),th1_gen->GetName());
325 HistValFunctions::test("[TH1-level] GetName()",&(m_h1->GetName()[11]),th1_gen->GetName());//"stripping off "::trigger::"
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());
331 HistValFunctions::compareBinContents_2D(m_h1,th1_gen);
332 HistValFunctions::compareFields(m_h1,th1_gen);
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());
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());
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());
356 HistValFunctions::compareMetaData(static_cast<TH_2D*>(th1_gen), m_h2,true/*ignore name*/);
357 HistValFunctions::compareMetaData(m_h1, m_h2,true/*ignore name*/);
360 LWHistVal::clearKeptROOTHist(m_h2);//deletes th1_gen
361 m_h1->SetName(name1.c_str());
362 m_h2->SetName(name1.c_str());
367 //____________________________________________________________________
368 template <class TH_2D, class THLW_2D>
369 void HistVal2D<TH_2D,THLW_2D>::compareFastLoop()
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;
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);
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)));
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");