2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
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)
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();
20 if (trigger_conversion_all)
21 triggerConversionToROOTHist();
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)
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();
35 if (trigger_conversion_all)
36 triggerConversionToROOTHist();
39 //____________________________________________________________________
40 HistValProfile2D::~HistValProfile2D()
44 LWHist::safeDelete(m_h2);
47 //____________________________________________________________________
48 unsigned HistValProfile2D::getXAxis_NBins() const
50 return std::as_const(*m_h1).GetXaxis()->GetNbins();
53 //____________________________________________________________________
54 unsigned HistValProfile2D::getYAxis_NBins() const
56 return std::as_const(*m_h1).GetYaxis()->GetNbins();
59 //____________________________________________________________________
60 void HistValProfile2D::fill(const double& x, const double& y, const double& z)
64 this->binContentsChanged();
67 //____________________________________________________________________
68 void HistValProfile2D::fill(const double& x, const double& y, const double& z, const double& w)
70 if (w<0) return;//Latest root gives NaN's in case of negative weights => not worth reproducing that.
73 this->binContentsChanged();
76 // //____________________________________________________________________
77 // void HistValProfile2D::setBinEntries(unsigned binx, unsigned biny, const double& entries)
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();
85 //____________________________________________________________________
86 void HistValProfile2D::setBinContent(unsigned binx, unsigned biny, const double& content)
88 m_h1->SetBinContent(binx,biny,content);
89 m_h2->SetBinContent(binx,biny,content);
90 this->binContentsChanged();
93 //____________________________________________________________________
94 void HistValProfile2D::setBinError(unsigned binx, unsigned biny, const double& error)
96 m_h1->SetBinError(binx,biny,error);
97 m_h2->SetBinError(binx,biny,error);
98 this->binContentsChanged();
101 //____________________________________________________________________
102 void HistValProfile2D::setBinInfo(unsigned binx, unsigned biny, const double& entries, const double& content,const double& error)
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.
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();
114 //____________________________________________________________________
115 void HistValProfile2D::compareBinContents() const
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);
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);
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);
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);
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);
163 //____________________________________________________________________
164 void HistValProfile2D::compareMetaData()
166 HistValFunctions::compareMetaData(m_h1, m_h2);
169 //____________________________________________________________________
170 void HistValProfile2D::compareTH1s()
172 std::string name1(m_h1->GetName());
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);
181 th1_gen = m_h2->getROOTHist();
184 HistValFunctions::testfailed("getROOTHist(..) returns null!");
187 HistValFunctions::test("[TH1-level] GetName()",std::string("tmpname"),th1_gen->GetName());
189 HistValFunctions::test("[TH1-level] GetName()",&(m_h1->GetName()[11]),th1_gen->GetName());//"stripping off "::trigger::"
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());
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());
198 HistValFunctions::compareBinContents_2D(m_h1,th1_gen,true/*relaxedErrorComparison*/);
199 HistValFunctions::compareFields(m_h1,th1_gen);
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());
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());
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());
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*/);
230 LWHistVal::clearKeptROOTHist(m_h2);//deletes th1_gen
231 m_h1->SetName(name1.c_str());
232 m_h2->SetName(name1.c_str());
236 //____________________________________________________________________
237 void HistValProfile2D::compareFastLoop()
242 //____________________________________________________________________
243 void HistValProfile2D::setXAxis_BinLabel(unsigned bin, const char* label)
245 m_h1->GetXaxis()->SetBinLabel(bin,label);
246 m_h2->GetXaxis()->SetBinLabel(bin,label);
247 this->titleOrNameWasChanged();
250 //____________________________________________________________________
251 void HistValProfile2D::setYAxis_BinLabel(unsigned bin, const char* label)
253 m_h1->GetYaxis()->SetBinLabel(bin,label);
254 m_h2->GetYaxis()->SetBinLabel(bin,label);
255 this->titleOrNameWasChanged();
258 //____________________________________________________________________
259 void HistValProfile2D::setXAxis_LabelSize(float s)
261 m_h1->GetXaxis()->SetLabelSize(s);
262 m_h2->GetXaxis()->SetLabelSize(s);
263 this->titleOrNameWasChanged();
266 //____________________________________________________________________
267 void HistValProfile2D::setYAxis_LabelSize(float s)
269 m_h1->GetYaxis()->SetLabelSize(s);
270 m_h2->GetYaxis()->SetLabelSize(s);
271 this->titleOrNameWasChanged();
274 //____________________________________________________________________
275 void HistValProfile2D::setXAxis_Title(const std::string&t)
277 m_h1->GetXaxis()->SetTitle(t.c_str());
278 m_h2->GetXaxis()->SetTitle(t.c_str());
279 this->titleOrNameWasChanged();
282 //____________________________________________________________________
283 void HistValProfile2D::setYAxis_Title(const std::string&t)
285 m_h1->GetYaxis()->SetTitle(t.c_str());
286 m_h2->GetYaxis()->SetTitle(t.c_str());
287 this->titleOrNameWasChanged();
290 //____________________________________________________________________
291 void HistValProfile2D::setZAxis_Title(const std::string&t)
293 m_h1->GetZaxis()->SetTitle(t.c_str());
294 m_h2->GetZaxis()->SetTitle(t.c_str());
295 this->titleOrNameWasChanged();
298 //____________________________________________________________________
299 void HistValProfile2D::SetMarkerColor( short c)
301 m_h1->SetMarkerColor(c);
302 m_h2->SetMarkerColor(c);
303 this->titleOrNameWasChanged();
306 //____________________________________________________________________
307 void HistValProfile2D::SetMarkerStyle( short s )
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();
316 //____________________________________________________________________
317 void HistValProfile2D::SetMarkerSize( float sz)
319 m_h1->SetMarkerSize(sz);
320 m_h2->SetMarkerSize(sz);
321 this->titleOrNameWasChanged();
324 //____________________________________________________________________
325 void HistValProfile2D::setMinimum( const double& m )
329 this->titleOrNameWasChanged();
332 //____________________________________________________________________
333 void HistValProfile2D::setMaximum( const double& m )
337 this->titleOrNameWasChanged();
340 //____________________________________________________________________
341 void HistValProfile2D::setName(const std::string& name)
343 m_h1->SetName(convertedRootName(name).c_str());
344 m_h2->SetName(name.c_str());
345 this->titleOrNameWasChanged();
348 //____________________________________________________________________
349 void HistValProfile2D::setTitle(const std::string& title)
351 m_h1->SetTitle(title.c_str());
352 m_h2->SetTitle(title.c_str());
353 this->titleOrNameWasChanged();
356 //____________________________________________________________________
357 void HistValProfile2D::setNameTitle(const std::string& name,
358 const std::string& title)
360 m_h1->SetNameTitle(convertedRootName(name).c_str(),title.c_str());
361 m_h2->SetNameTitle(name.c_str(),title.c_str());
362 this->titleOrNameWasChanged();