5 #ifndef VALIDATEFUNCTIONS_H
6 #define VALIDATEFUNCTIONS_H
12 #include "TProfile2D.h"
13 #include "TObjString.h"
14 #include "THashList.h"
29 template <
class T>
inline std::string
toString(
const T&
t) { std::ostringstream
s;
s<<
t;
return s.str(); }
30 template <
class T1,
class T2>
31 inline std::string
toString(
const std::pair<T1,T2>&
p) {
37 inline std::string
toString(
const std::vector<T>&
v) {
40 for (
unsigned i=0;
i<
v.size();++
i)
46 inline bool floatCompat(
const double& val1,
const double& val2,
const double& eps)
48 return (fabs(val1-val2)/(1.0+
std::max(fabs(val1),fabs(val2)))<eps) || ((val1!=val1)&&(val2!=val2));
51 inline bool compatible(
const double& val1,
const double& val2)
56 template<
class T1,
class T2>
57 inline bool compatible(
const std::pair<T1,T2>& val1,
const std::pair<T1,T2>& val2)
63 inline bool compatible(
const std::vector<T>& val1,
const std::vector<T>& val2)
65 const unsigned n(val2.size());
68 for (
unsigned i=0;
i<
n;++
i)
77 template <
class T1,
class T2>
78 inline void testfailed(
const std::string& testname, T1 val1, T2 val2)
80 std::cout<<
"Value in h1 ("<<
typeid(T1).
name()<<
"): ->"<<std::setprecision(14)<<val1<<std::setprecision(6)<<
"<-"<<std::endl;
81 std::cout<<
"Value in h2 ("<<
typeid(T2).
name()<<
"): ->"<<std::setprecision(14)<<val2<<std::setprecision(6)<<
"<-"<<std::endl;
84 template <
class T1,
class T2>
85 inline void test(
const std::string& testname, T1 val1, T2 val2)
90 void test(
const std::string& testname,
double val1,
double val2);
91 void test(
const std::string& testname,
const char* val1,
const char* val2);
156 template <
class TH,
class THLW>
157 static inline void compareMetaData
NO_SANITIZE_UNDEFINED (
const TH* hroot, THLW * hlw,
bool ignorename =
false)
164 if (hroot->GetName()[0]!=
':') {
165 test(
"GetName()",hroot->GetName(), hlw->GetName());
169 assert(hroot->GetTitle());
170 assert(hlw->GetTitle());
171 test(
"GetTitle()",hroot->GetTitle(), hlw->GetTitle());
172 int nbinsx=
int(hroot->GetNbinsX());
173 test(
"GetNbinsX()",
int(hroot->GetNbinsX()),
int(hlw->GetNbinsX()));
174 test(
"Integral()",hroot->Integral(), hlw->Integral());
176 test(
"GetXaxis()->GetBinCenter(-2)",hroot->GetXaxis()->GetBinCenter(-2),hlw->GetXaxis()->GetBinCenter(-2));
177 test(
"GetXaxis()->GetBinCenter(0)",hroot->GetXaxis()->GetBinCenter(0),hlw->GetXaxis()->GetBinCenter(0));
178 test(
"GetXaxis()->GetBinCenter(1)",hroot->GetXaxis()->GetBinCenter(1),hlw->GetXaxis()->GetBinCenter(1));
179 test(
"GetXaxis()->GetBinCenter(nbinsx/2)",hroot->GetXaxis()->GetBinCenter(nbinsx/2),hlw->GetXaxis()->GetBinCenter(nbinsx/2));
180 test(
"GetXaxis()->GetBinCenter(nbinsx-2)",hroot->GetXaxis()->GetBinCenter(nbinsx-2),hlw->GetXaxis()->GetBinCenter(nbinsx-2));
181 test(
"GetXaxis()->GetBinCenter(nbinsx-1)",hroot->GetXaxis()->GetBinCenter(nbinsx-1),hlw->GetXaxis()->GetBinCenter(nbinsx-1));
182 test(
"GetXaxis()->GetBinCenter(nbinsx)",hroot->GetXaxis()->GetBinCenter(nbinsx),hlw->GetXaxis()->GetBinCenter(nbinsx));
183 test(
"GetXaxis()->GetBinCenter(nbinsx+1)",hroot->GetXaxis()->GetBinCenter(nbinsx+1),hlw->GetXaxis()->GetBinCenter(nbinsx+1));
184 test(
"GetXaxis()->GetBinCenter(nbinsx+2)",hroot->GetXaxis()->GetBinCenter(nbinsx+2),hlw->GetXaxis()->GetBinCenter(nbinsx+2));
186 if (
dynamic_cast<const TH2*
>(hroot)) {
187 test(
"GetYaxis()->GetBinCenter(-200)",hroot->GetYaxis()->GetBinCenter(-200),hlw->GetYaxis()->GetBinCenter(-200));
188 test(
"GetYaxis()->GetBinCenter(0)",hroot->GetYaxis()->GetBinCenter(0),hlw->GetYaxis()->GetBinCenter(0));
189 test(
"GetYaxis()->GetBinCenter(1)",hroot->GetYaxis()->GetBinCenter(1),hlw->GetYaxis()->GetBinCenter(1));
190 test(
"GetYaxis()->GetBinCenter(17)",hroot->GetYaxis()->GetBinCenter(17),hlw->GetYaxis()->GetBinCenter(17));
191 test(
"GetYaxis()->GetBinCenter(100)",hroot->GetYaxis()->GetBinCenter(100),hlw->GetYaxis()->GetBinCenter(100));
192 test(
"GetYaxis()->GetBinCenter(500)",hroot->GetYaxis()->GetBinCenter(500),hlw->GetYaxis()->GetBinCenter(500));
195 const TH1_FieldsAccess * hroot_1daccess(
static_cast<const TH1_FieldsAccess*
>(
static_cast<const TH1*
>(hroot)));
196 test(
"Entries",hroot_1daccess->access_fEntries(), hlw->GetEntries());
198 if (
dynamic_cast<const TH2*
>(hroot)) {
199 const TH2* hroot2d =
static_cast<const TH2*
>(
static_cast<const TH1*
>(hroot));
202 test(
"GetNbinsY()",
int(hroot2d->GetNbinsY()),
int(hlw2d->
GetNbinsY()));
203 const TH1_FieldsAccess * hroot_1daccess(
static_cast<const TH1_FieldsAccess*
>(
static_cast<const TH1*
>(hroot2d)));
204 const TH2_FieldsAccess * hroot_2daccess(
static_cast<const TH2_FieldsAccess*
>(hroot2d));
205 double sumW, sumW2, sumWX, sumWX2;
206 double sumWY, sumWY2, sumWXY;
207 hlw2d->
getSums(sumW, sumW2, sumWX, sumWX2,sumWY, sumWY2, sumWXY);
208 test(
"sumw",hroot_1daccess->access_fTsumw(), sumW);
209 test(
"sumw2",hroot_1daccess->access_fTsumw2(), sumW2);
210 test(
"sumwx",hroot_1daccess->access_fTsumwx(), sumWX);
211 test(
"sumwx2",hroot_1daccess->access_fTsumwx2(), sumWX2);
212 test(
"sumwy",hroot_2daccess->access_fTsumwy(), sumWY);
213 test(
"sumwy2",hroot_2daccess->access_fTsumwy2(), sumWY2);
214 test(
"sumwxy",hroot_2daccess->access_fTsumwxy(), sumWXY);
220 test(
"GetNbinsY()",
int(hrootprof2d->GetNbinsY()),
int(hlwprof2d->
GetNbinsY()));
221 const TH1_FieldsAccess * hroot_1daccess(
static_cast<const TH1_FieldsAccess*
>(
static_cast<const TH1*
>(hroot2d)));
222 const TH2_FieldsAccess * hroot_2daccess(
static_cast<const TH2_FieldsAccess*
>(hroot2d));
223 const TProfile2D_FieldsAccess * hroot_prof2daccess(
static_cast<const TProfile2D_FieldsAccess*
>(hroot2d));
224 double sumW, sumW2, sumWX, sumWX2;
225 double sumWY, sumWY2, sumWXY;
226 double sumWZ, sumWZ2;
227 hlwprof2d->
getSums(sumW, sumW2, sumWX, sumWX2,sumWY, sumWY2, sumWXY,sumWZ, sumWZ2);
228 test(
"sumw",hroot_1daccess->access_fTsumw(), sumW);
229 test(
"sumw2",hroot_1daccess->access_fTsumw2(), sumW2);
230 test(
"sumwx",hroot_1daccess->access_fTsumwx(), sumWX);
231 test(
"sumwx2",hroot_1daccess->access_fTsumwx2(), sumWX2);
232 test(
"sumwy",hroot_2daccess->access_fTsumwy(), sumWY);
233 test(
"sumwy2",hroot_2daccess->access_fTsumwy2(), sumWY2);
234 test(
"sumwxy",hroot_2daccess->access_fTsumwxy(), sumWXY);
235 test(
"sumwz",hroot_prof2daccess->access_fTsumwz(), sumWZ);
236 test(
"sumwz2",hroot_prof2daccess->access_fTsumwz2(), sumWZ2);
241 double sumW, sumW2, sumWX, sumWX2;
242 hlw1d->
getSums(sumW, sumW2, sumWX, sumWX2);
243 test(
"sumw",hroot_1daccess->access_fTsumw(), sumW);
244 test(
"sumw2",hroot_1daccess->access_fTsumw2(), sumW2);
245 test(
"sumwx",hroot_1daccess->access_fTsumwx(), sumWX);
246 test(
"sumwx2",hroot_1daccess->access_fTsumwx2(), sumWX2);
250 const TProfile_FieldsAccess * hroot_profileaccess(
static_cast<const TProfile_FieldsAccess*
>(
static_cast<const TH1*
>(hroot)));
251 double sumW, sumW2, sumWX, sumWX2,sumWY, sumWY2;
252 hlwprof->
getSums(sumW, sumW2, sumWX, sumWX2,sumWY, sumWY2);
253 test(
"sumw",hroot_1daccess->access_fTsumw(), sumW);
254 test(
"sumw2",hroot_1daccess->access_fTsumw2(), sumW2);
255 test(
"sumwx",hroot_1daccess->access_fTsumwx(), sumWX);
256 test(
"sumwx2",hroot_1daccess->access_fTsumwx2(), sumWX2);
257 test(
"sumwy",hroot_profileaccess->access_fTsumwy(), sumWY);
258 test(
"sumwy2",hroot_profileaccess->access_fTsumwy2(), sumWY2);
270 TListIter next1(hroot->GetXaxis()->GetLabels());
272 while ((obj1=(TObjString*)next1())) {
273 int bin1 = obj1->GetUniqueID();
275 unsigned bin =
static_cast<unsigned>(
bin1);
276 const std::string
label(obj1->GetString().Data());
277 const char * label_lw = hlw->GetXaxis()->GetBinLabel(
bin);
279 testfailed(
"GetXaxis()->GetBinLabel(..) (NULL)");
280 test(
"GetXaxis()->GetBinLabel(..)",
label.c_str(),label_lw);
282 TListIter next2(hroot->GetYaxis()->GetLabels());
284 while ((
obj2=(TObjString*)next2())) {
287 unsigned bin =
static_cast<unsigned>(
bin1);
288 std::string
label(
obj2->GetString().Data());
289 const char * label_lw = hlw->GetYaxis()->GetBinLabel(
bin);
291 testfailed(
"GetYaxis()->GetBinLabel(..) (NULL)");
292 test(
"GetYaxis()->GetBinLabel(..)",
label.c_str(),label_lw);
297 template <
class T1,
class T2>
298 static void compareBinContents_1D(
const T1*
t1,
const T2 *
t2,
bool relaxedErrorComparison =
false)
300 test(
"GetNbinsX()",
int(
t1->GetNbinsX()),
int(
t2->GetNbinsX()));
301 int n =
t1->GetNbinsX();
306 for (
int i=0;
i<=
n+1;++
i) {
308 std::ostringstream
s;
309 s <<
"["<<
typeid(T1).
name()<<
" vs. "<<
typeid(T2).
name()<<
"] GetBinContent("<<
i<<
", nbins="<<
n<<
", ninternalbins="<<
n+2<<
")";
310 test(
s.str(),
t1->GetBinContent(
i),
t2->GetBinContent(
i));
313 for (
int i=0;
i<=
n+1;++
i) {
314 if (!(relaxedErrorComparison
317 std::ostringstream
s;
318 s <<
"["<<
typeid(T1).
name()<<
" vs. "<<
typeid(T2).
name()<<
"] GetBinError("<<
i<<
", nbins="<<
n<<
", ninternalbins="<<
n+2<<
")";
319 test(
s.str(),
t1->GetBinError(
i),
t2->GetBinError(
i));
324 template <
class T1,
class T2>
325 static void compareBinContents_2D(
const T1*
t1,
const T2 *
t2,
bool relaxedErrorComparison =
false)
329 test(
"GetNbinsX()",
int(
t1->GetNbinsX()),
int(
t2->GetNbinsX()));
330 test(
"GetNbinsY()",
int(
t1->GetNbinsY()),
int(
t2->GetNbinsY()));
331 const int nx =
t1->GetNbinsX();
332 const int ny =
t1->GetNbinsY();
333 for (
int ix=0;ix<=nx+1;++ix)
334 for (
int iy=0;iy<=ny+1;++iy) {
335 if (!
compatible(
t1->GetBinContent(ix,iy),
t2->GetBinContent(ix,iy))) {
336 std::ostringstream
s;
337 s <<
"GetBinContent("<<ix<<
", "<<iy<<
")";
338 test(
s.str(),
t1->GetBinContent(ix,iy),
t2->GetBinContent(ix,iy));
341 for (
int ix=0;ix<=nx+1;++ix)
342 for (
int iy=0;iy<=ny+1;++iy) {
343 if (!(relaxedErrorComparison
346 std::ostringstream
s;
347 s <<
"GetBinError("<<ix<<
", "<<iy<<
")";
348 test(
s.str(),
t1->GetBinError(ix,iy),
t2->GetBinError(ix,iy));