45 auto* pNumerator =
static_cast<const TH1*
>(
fvpObjects[iVersion]);
46 auto* pDenominator =
static_cast<const TH1*
>(
fvpObjects[
fpObjDB->GetDefaultID()]);
47 if (pNumerator->GetNbinsX() != pDenominator->GetNbinsX() || pNumerator->GetNbinsY() != pDenominator->GetNbinsY()
48 || pNumerator->GetNbinsZ() != pDenominator->GetNbinsZ()) {
56 bool bEqualExactly{
true};
57 bool bEqualByRatio{
true};
62 if (bCompareExact || bCompareRatio) {
63 bool bRatioMayBeWrong =
65 for (
int iBinX{0}; iBinX <= pNumerator->GetNbinsX(); ++iBinX) {
66 for (
int iBinY{0}; iBinY <= pNumerator->GetNbinsY(); ++iBinY) {
67 for (
int iBinZ{0}; iBinZ <= pNumerator->GetNbinsZ(); ++iBinZ) {
68 auto numBinContent{pNumerator->GetBinContent(iBinX, iBinY, iBinZ)};
69 auto denBinContent{pDenominator->GetBinContent(iBinX, iBinY, iBinZ)};
70 double ratio{
static_cast<double>(numBinContent) / denBinContent};
72 if (!TMath::IsNaN(numBinContent) && !TMath::IsNaN(denBinContent)) {
73 if (numBinContent != denBinContent) {
74 bEqualExactly =
false;
76 bool numEmpty{numBinContent < 1.e-4};
77 bool denEmpty{denBinContent < 1.e-4};
78 if (numEmpty || denEmpty) {
79 bRatioMayBeWrong &= (!numEmpty || !denEmpty);
82 ratioLo = std::min(ratioLo, ratio);
83 ratioUp = std::max(ratioUp, ratio);
88 if (TMath::IsNaN(numBinContent) != TMath::IsNaN(denBinContent)) {
89 bEqualExactly =
false;
92 auto numBinError{pNumerator->GetBinError(iBinX, iBinY, iBinZ)};
93 auto denBinError{pDenominator->GetBinError(iBinX, iBinY, iBinZ)};
95 if (!TMath::IsNaN(numBinError) && !TMath::IsNaN(denBinError)) {
96 if (numBinError != denBinError) {
97 bEqualExactly =
false;
101 if (TMath::IsNaN(numBinError) != TMath::IsNaN(denBinError)) {
102 bEqualExactly =
false;
109 if (bCompareExact && bEqualExactly) {
114 if (bRatioMayBeWrong && (std::fabs(1 - 1.e-4) < ratioLo) && std::fabs(1 + 1.e+4) > ratioUp) {
116 <<
", object: " << pNumerator->GetName()
117 <<
" has a ratio equal to 1., but some of bins are still different "
118 <<
"(empty/non-empty bin case)";
122 bEqualByRatio = (ratioLo >=
fpObjDB->GetRatioRangeMin() && ratioUp <= fpObjDB->GetRatioRangeMax());
126 bool bEqualByChi2{
true};
129 auto currErrorLevel{gErrorIgnoreLevel};
130 gErrorIgnoreLevel = kFatal;
134 pVal = pDenominator->Chi2TestX(pNumerator, chi2, ndf, igood);
135 bEqualByChi2 = (pVal >=
fpObjDB->GetPvalThreshold());
136 gErrorIgnoreLevel = currErrorLevel;
142 bEqualExactly = !bCompareExact || bEqualExactly;
143 bEqualByRatio = !bCompareRatio || bEqualByRatio;
144 bEqualByChi2 = !bCompareChi2 || bEqualByChi2;
145 bool bEqualStrongly = bEqualExactly && bEqualByRatio && bEqualByChi2;
146 bool bEqualWeakly = bEqualExactly || bEqualByRatio || bEqualByChi2;
151 auto ResultMsg = [](
bool flag) -> std::string {
152 constexpr const char* kEqual =
"\e[1;32mconsistent\e[0m";
153 constexpr const char* kDiff =
"\e[1;31minconsistent\e[0m";
154 return flag ? kEqual : kDiff;
157 std::stringstream msg;
161 msg <<
"\texact -> " << ResultMsg(bEqualExactly) <<
'\n';
164 msg <<
"\tratio -> " << ResultMsg(bEqualByRatio) <<
"(lo: " << ratioLo <<
", up: " << ratioUp <<
")\n";
167 msg <<
"\tchi2 -> " << ResultMsg(bEqualByChi2) <<
"(p-val: " << pVal <<
")\n";
169 msg <<
"Inference: " <<
ToString(res);
171 LOG(info) << msg.str();
172 return Result(res, bEqualExactly, ratioLo, ratioUp, pVal);
175 return Result(res, bEqualStrongly, ratioLo, ratioUp, pVal);
183 int nVersions =
fpObjDB->GetNofVersions();
184 int iDef =
fpObjDB->GetDefaultID();
187 std::string sOption = opt;
188 for (
auto& ch : sOption) {
189 ch = std::tolower(ch);
191 bool bDrawRatio = sOption.find(
"r") != std::string::npos;
192 bool bDrawDiff = sOption.find(
"d") != std::string::npos;
195 TString xAxisTitle =
static_cast<TH1*
>(
fvpObjects[0])->GetXaxis()->GetTitle();
196 TString yAxisTitle =
static_cast<TH1*
>(
fvpObjects[0])->GetYaxis()->GetTitle();
201 TString sCanvT = TString(
"Comparison result for \"") +
fsBaseName +
"\"";
202 fpCanvasCmp = std::make_shared<TCanvas>(sCanvN, sCanvT, 500, 500);
206 for (
int iV = 0; iV < nVersions; ++iV) {
207 auto* pCopy =
new TGraphAsymmErrors((TH1*)
fvpObjects[iV]);
208 pCopy->SetMarkerStyle(20);
209 pCopy->SetTitle(
fpObjDB->GetVersionLabel(iV).c_str());
210 pMultiGraphOrig->Add(pCopy,
"P");
212 pMultiGraphOrig->GetXaxis()->SetTitle(xAxisTitle);
213 pMultiGraphOrig->GetYaxis()->SetTitle(yAxisTitle);
214 pMultiGraphOrig->Draw(
"A pmc plc");
218 auto* pDefault =
static_cast<TH1*
>(
fvpObjects[iDef]);
222 TString sCanvN =
fsBaseName +
"_ratio_canvas";
223 TString sCanvT = TString(
"Comparison result for \"") +
fsBaseName +
"\" (ratio)";
224 fpCanvasRat = std::make_shared<TCanvas>(sCanvN, sCanvT, 500, 500);
227 TString titleRatio = Form(
"Ratio to %s",
fpObjDB->GetVersionLabel(iDef).c_str());
228 auto* pMultiGraphRatio =
new TMultiGraph((
fsBaseName +
"_ratio").c_str(), titleRatio);
229 for (
int iV = 0; iV < nVersions; ++iV) {
233 auto* pRatio =
static_cast<TH1*
>(
fvpObjects[iV]->Clone());
235 auto currErrorLevel = gErrorIgnoreLevel;
236 gErrorIgnoreLevel = kError;
237 auto* pCopy =
new TGraphAsymmErrors(pRatio, pDefault,
"pois");
238 gErrorIgnoreLevel = currErrorLevel;
239 pCopy->GetYaxis()->SetTitle(
"ratio");
240 pCopy->SetTitle(
fpObjDB->GetVersionLabel(iV).c_str());
241 pCopy->SetMarkerStyle(20);
242 pMultiGraphRatio->Add(pCopy,
"P");
248 pMultiGraphRatio->GetYaxis()->SetTitle(
"ratio");
249 pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle);
250 pMultiGraphRatio->Draw(
"A pmc plc");
256 TString sCanvN =
fsBaseName +
"_difference_canvas";
257 TString sCanvT = TString(
"Comparison result for \"") +
fsBaseName +
"\" (difference)";
258 fpCanvasDiff = std::make_shared<TCanvas>(sCanvN, sCanvT, 500, 500);
261 TString titleDiff = Form(
"Difference from %s",
fpObjDB->GetVersionLabel(iDef).c_str());
262 auto* pMultiGraphDiff =
new TMultiGraph((
fsBaseName +
"_diff").c_str(), titleDiff);
263 for (
int iV = 0; iV < nVersions; ++iV) {
267 auto* pDiff =
static_cast<TH1*
>(
fvpObjects[iV]->Clone());
269 pDiff->Add(pDefault, -1.);
270 auto* pCopy =
new TGraphAsymmErrors(pDiff);
271 pCopy->GetYaxis()->SetTitle(
"difference");
272 pCopy->SetTitle(
fpObjDB->GetVersionLabel(iV).c_str());
273 pCopy->SetMarkerStyle(20);
274 pMultiGraphDiff->Add(pCopy,
"P");
280 pMultiGraphDiff->GetYaxis()->SetTitle(
"difference");
281 pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle);
282 pMultiGraphDiff->Draw(
"A pmc plc");