21 #define xstringify(s) str(s)
22 #define stringify(s) #s
24 #define REPORT(x) { std::cout << " -> ERROR: "<<x<<std::endl; }
28 const bool var1_nan = std::isnan(var1);
29 const bool var2_nan = std::isnan(var2);
30 if (var1_nan&&var2_nan) {
32 std::cout<<
"WARNING: Spotted NaN values in parameter (but same in both of the compared histograms)!"<<std::endl;
35 if (var1_nan||var2_nan) {
37 REPORT(
"Spotted NaN values in parameter (from only one of the compared histograms)!");
40 REPORT(
"different values found: "<<var1<<
" vs. "<<var2);
46 const bool var1_nan = (var1!=var1);
47 const bool var2_nan = (var2!=var2);
48 if (var1_nan&&var2_nan) {
50 std::cout<<
"WARNING: Spotted NaN values in floating point number (but same in both of the compared histograms)!"<<std::endl;
53 if (var1_nan||var2_nan) {
55 REPORT(
"Spotted NaN values in floating point number (from only one of the compared histograms)!");
58 const double test(fabs(var1-var2)/(1.0+std::max<double>(fabs(var1),fabs(var2))));
66 template <>
bool varCompatible(
const char* var1,
const char* var2) {
return std::string(var1)==std::string(var2); }
67 template <>
bool varCompatible(TString var1,TString var2) {
return var1 == var2; }
70 template <
class TContainedType>
75 if (!
varCompatible(var1.GetMangledName(), var2.GetMangledName()))
79 if (!tlistsCompatible<TString>(var1.GetListOfMethodArgs(), var2.GetListOfMethodArgs()))
84 #define TESTSIMPLEVAR(varname) \
85 { if (!varCompatible(h1->varname,h2->varname)) { \
86 REPORT("Incompatible values of "<<stringify(varname)<<" ("<<h1->varname<<" vs. "<<h2->varname<<")"); \
89 #define TESTSIMPLEEXTVAR(var1,var2,varname) \
90 { if (!varCompatible(var1,var2)) { \
91 REPORT("Incompatible values of "<<stringify(varname)<<" ("<<var1<<" vs. "<<var2<<")"); \
94 #define TESTSIMPLEUNSUPPORTEDSTYLEVAR(varname) { if (!cfg_ignore_unsupported_style_vars) { TESTSIMPLEVAR(varname); } }
97 template <
class TArrayX>
100 REPORT(
"Incompatible arrays "<<
name<<
" (number of entries)");
103 if (a1->fArray==0&&a2->fArray==0)
105 if (a1->fArray==0||a2->fArray==0) {
106 REPORT(
"Incompatible arrays "<<
name<<
" (one NULL, one not NULL)"); \
109 for (
int i = 0;
i < a1->fN; ++
i)
111 REPORT(
"Incompatible arrays "<<
name<<
" (at least one entry incompatible)"); \
117 #define ACTUALTESTARRAY(a,b,name) \
118 { if (!arrayCompatible(a,b,name)) { \
121 #define TESTASARRAY() {ACTUALTESTARRAY(h1,h2,"")}
122 #define TESTARRAY(varname) {ACTUALTESTARRAY(&(h1->varname),&(h2->varname),stringify(varname))}
123 #define TESTARRAYPTR(varname) {ACTUALTESTARRAY((h1->varname),(h2->varname),stringify(varname))}
138 if (!tlistsCompatible<TString>((TList*)(
h1->GetLabels()),(TList*)(h2->GetLabels()))) {
139 REPORT(
"Incompatible fLabels");
160 template <
class TContainedType>
173 Int_t
sz =
h1->Capacity();
174 for (
int i = 0;
i<
sz; ++
i) {
175 TContainedType *
t1 =
dynamic_cast<TContainedType*
>(
h1->At(
i));
176 TContainedType *
t2 =
dynamic_cast<TContainedType*
>(
h1->At(
i));
202 Double_t stats1[20], stats2[20];
203 h1->GetStats(stats1);
204 h2->GetStats(stats2);
214 Int_t nlevels1 =
h1->GetContour(
nullptr);
215 Int_t nlevels2 = h2->GetContour(
nullptr);
218 TArrayD levels1 (nlevels1);
219 TArrayD levels2 (nlevels1);
220 h1->GetContour (levels1.GetArray());
221 h2->GetContour (levels2.GetArray());
225 bool test_sumw2(
true);
227 if ((
h1->GetSumw2()->fN==0||h2->GetSumw2()->fN==0) && ((
h1->GetSumw2()->fN==0)!=(h2->GetSumw2()->fN==0)))
233 if (!tlistsCompatible<TFunction>(
h1->GetListOfFunctions(),h2->GetListOfFunctions())) {
234 REPORT(
"Incompatible fXaxis");
238 REPORT(
"Incompatible fXaxis");
242 REPORT(
"Incompatible fYaxis");
246 REPORT(
"Incompatible fZaxis");
266 for (
int i=0;
i < 32;
i++)
282 Double_t stats1[20], stats2[20];
283 h1->GetStats(stats1);
284 h2->GetStats(stats2);
300 Int_t
sz =
h1->GetNcells();
301 for (Int_t
i = 0;
i <
sz;
i++)
307 Double_t stats1[20], stats2[20];
308 h1->GetStats(stats1);
309 h2->GetStats(stats2);
318 Int_t
sz =
h1->GetNcells();
319 for (Int_t
i = 0;
i <
sz;
i++)
325 Double_t stats1[20], stats2[20];
326 h1->GetStats(stats1);
327 h2->GetStats(stats2);