diff --git a/core/qa/CbmQaIO.cxx b/core/qa/CbmQaIO.cxx index a5f91d42c7c823ca9352b7a791232ad83c397f40..426e3e57f3a20c55a99a4c5c806955572aa85549 100644 --- a/core/qa/CbmQaIO.cxx +++ b/core/qa/CbmQaIO.cxx @@ -53,7 +53,7 @@ void CbmQaIO::SetTH2Properties(TH2* pHist) const pHist->SetOption("colz"); pHist->SetStats(false); - pHist->GetYaxis()->SetLabelOffset(0.95); + //pHist->GetYaxis()->SetLabelOffset(0.95); /* TPaveStats* stats = cbm::qa::util::GetHistStats(pHist); assert(stats); diff --git a/core/qa/checker/CbmQaCheckerCore.h b/core/qa/checker/CbmQaCheckerCore.h index de0d419119ae034f71f49709568c5201a4f634ec..5390e4f3873028d04c382dd2e41d8d0a91000d32 100644 --- a/core/qa/checker/CbmQaCheckerCore.h +++ b/core/qa/checker/CbmQaCheckerCore.h @@ -60,6 +60,9 @@ namespace cbm::qa::checker /// @brief Runs checking routine /// @param opt Option: /// "B": suppress canvas creation + /// "F": forces canvas creation (even if there is no difference) + /// "R": draw ratio on canvas + /// "D": draw difference on canvas /// "P": enables bin-by-bin comparison /// "S": enables statistical hypothesis test, where is possible /// "U": enables interval comparison, where is possible diff --git a/core/qa/checker/CbmQaCheckerFileHandler.cxx b/core/qa/checker/CbmQaCheckerFileHandler.cxx index 140c24f711ae143d7c493b33db1a22d0b1a0c658..5f935242ccad50baee55b405b2710c77edcd4905 100644 --- a/core/qa/checker/CbmQaCheckerFileHandler.cxx +++ b/core/qa/checker/CbmQaCheckerFileHandler.cxx @@ -92,6 +92,7 @@ void FileHandler::Process(Option_t* opt) ch = std::tolower(ch); } bool bSuppressCanvases = sOption.find("b") != std::string::npos; + bool bForceCanvases = sOption.find("c") != std::string::npos; bool bCmpPointByPoint = sOption.find("p") != std::string::npos; bool bCmpStatAny = sOption.find("s") != std::string::npos; @@ -164,8 +165,8 @@ void FileHandler::Process(Option_t* opt) areDifferent = true; } } - if (areDifferent) { - pObjHandler->CreateCanvases(); + if (areDifferent || bForceCanvases) { + pObjHandler->CreateCanvases(opt); } } pObjHandler->Write(); diff --git a/core/qa/checker/CbmQaCheckerHist1DHandler.cxx b/core/qa/checker/CbmQaCheckerHist1DHandler.cxx index e27e32afb49132c1be929671f819d81d79bf9976..e107920b3e105e0a4bba3ff7758a2f1060394a2e 100644 --- a/core/qa/checker/CbmQaCheckerHist1DHandler.cxx +++ b/core/qa/checker/CbmQaCheckerHist1DHandler.cxx @@ -9,7 +9,6 @@ #include "CbmQaCheckerHist1DHandler.h" -#include "CbmQaCanvas.h" #include "CbmQaCheckerTypedefs.h" #include "Logger.h" #include "TCanvas.h" @@ -44,6 +43,15 @@ CmpResult_t Hist1DHandler::Compare(const TNamed* pNum, const TNamed* pDenom) con std::bitset<sizeof(CmpResult_t) * 8> res; auto* pNumerator = static_cast<const TH1*>(pNum); auto* pDenominator = static_cast<const TH1*>(pDenom); + if (pNumerator->GetNbinsX() != pDenominator->GetNbinsX() || pNumerator->GetNbinsY() != pDenominator->GetNbinsY() + || pNumerator->GetNbinsZ() != pDenominator->GetNbinsZ()) { + res[EFlags::kPOINT] = false; + res[EFlags::kRATIO] = false; + res[EFlags::kCHI2] = false; + res[EFlags::kKOLM] = false; + return res.to_ulong(); + } + if (fOptionBits[EFlags::kPOINT] && ComparePointToPoint(pNumerator, pDenominator)) { res[EFlags::kPOINT] = true; } @@ -61,24 +69,51 @@ CmpResult_t Hist1DHandler::Compare(const TNamed* pNum, const TNamed* pDenom) con // --------------------------------------------------------------------------------------------------------------------- // -void Hist1DHandler::CreateCanvases() +void Hist1DHandler::CreateCanvases(Option_t* opt) { int nVersions = fpObjDB->GetNofVersions(); int iDef = fpObjDB->GetDefaultID(); + // ----- Option parsing + std::string sOption = opt; + for (auto& ch : sOption) { + ch = std::tolower(ch); + } + bool bDrawRatio = sOption.find("r") != std::string::npos; + bool bDrawDiff = sOption.find("d") != std::string::npos; + int nPads = static_cast<int>(bDrawRatio) + static_cast<int>(bDrawDiff) + 1; + // ----- Canvas: comparison of original histograms, ratios and subtractions std::string sCanvName = fsBaseName + "_cmp_canvas"; std::string sCanvTitle = "Comparison result for \"" + fsBaseName + "\""; - fpCanvas = std::make_shared<CbmQaCanvas>(sCanvName.data(), sCanvTitle.data(), 1500, 500); + fpCanvas = std::make_shared<TCanvas>(sCanvName.data(), sCanvTitle.data(), 500 * nPads, 500); fpCanvas->cd(); - auto* pPadOrig = new TPad("p1", "p1", 0.0, 0.0, 0.3333, 1.0); + + TPad* pPadOrig = nullptr; + TPad* pPadRatio = nullptr; + TPad* pPadDiff = nullptr; + + double xPadSize = 1.0 / nPads; + double xNext = 0.; + + pPadOrig = new TPad("p1", "p1", 0.0, 0.0, xPadSize, 1.0); pPadOrig->SetMargin(0.20, 0.05, 0.20, 0.10); fpCanvas->cd(); - auto* pPadRatio = new TPad("p2", "p2", 0.3333, 0.0, 0.6666, 1.0); - pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10); - fpCanvas->cd(); - auto* pPadDiff = new TPad("p3", "p3", 0.6666, 0.0, 1.0, 1.0); - pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10); + xNext += xPadSize; + + if (bDrawRatio) { + pPadRatio = new TPad("p2", "p2", xNext, 0.0, xNext + xPadSize, 1.0); + pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10); + fpCanvas->cd(); + xNext += xPadSize; + } + + if (bDrawDiff) { + pPadDiff = new TPad("p3", "p3", xNext, 0.0, xNext + xPadSize, 1.0); + pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10); + fpCanvas->cd(); + xNext += xPadSize; + } // Title definitions const char* title = fvpObjects[0]->GetTitle(); @@ -104,54 +139,58 @@ void Hist1DHandler::CreateCanvases() auto* pDefault = static_cast<TH1*>(fvpObjects[iDef]); // Histogram ratios to default - pPadRatio->cd(); - auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio); - for (int iV = 0; iV < nVersions; ++iV) { - if (iV == iDef) { - continue; - } - auto* pRatio = static_cast<TH1*>(fvpObjects[iV]->Clone()); - pRatio->SetDirectory(fpOutDir); - auto currErrorLevel = gErrorIgnoreLevel; - gErrorIgnoreLevel = kError; - auto* pCopy = new TGraphAsymmErrors(pRatio, pDefault, "pois"); - gErrorIgnoreLevel = currErrorLevel; - pCopy->SetMarkerStyle(20); - pMultiGraphRatio->Add(pCopy, "P"); - if (pRatio) { - delete pRatio; - pRatio = nullptr; + if (bDrawRatio) { + pPadRatio->cd(); + auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio); + for (int iV = 0; iV < nVersions; ++iV) { + if (iV == iDef) { + continue; + } + auto* pRatio = static_cast<TH1*>(fvpObjects[iV]->Clone()); + pRatio->SetDirectory(fpOutDir); + auto currErrorLevel = gErrorIgnoreLevel; + gErrorIgnoreLevel = kError; + auto* pCopy = new TGraphAsymmErrors(pRatio, pDefault, "pois"); + gErrorIgnoreLevel = currErrorLevel; + pCopy->SetMarkerStyle(20); + pMultiGraphRatio->Add(pCopy, "P"); + if (pRatio) { + delete pRatio; + pRatio = nullptr; + } } + pMultiGraphRatio->GetYaxis()->SetTitle("ratio"); + pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle); + pMultiGraphRatio->Draw("A pmc plc"); } - pMultiGraphRatio->GetYaxis()->SetTitle("ratio"); - pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle); - pMultiGraphRatio->Draw("A pmc plc"); - // Histogram ratios to default - pPadDiff->cd(); - auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff); - for (int iV = 0; iV < nVersions; ++iV) { - if (iV == iDef) { - continue; - } - auto* pDiff = static_cast<TH1*>(fvpObjects[iV]->Clone()); - pDiff->SetDirectory(fpOutDir); - pDiff->Add(pDefault, -1.); - auto* pCopy = new TGraphAsymmErrors(pDiff); - pCopy->SetMarkerStyle(20); - pMultiGraphDiff->Add(pCopy, "P"); - if (pDiff) { - delete pDiff; - pDiff = nullptr; + // Histogram differences to default + if (bDrawDiff) { + pPadDiff->cd(); + auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff); + for (int iV = 0; iV < nVersions; ++iV) { + if (iV == iDef) { + continue; + } + auto* pDiff = static_cast<TH1*>(fvpObjects[iV]->Clone()); + pDiff->SetDirectory(fpOutDir); + pDiff->Add(pDefault, -1.); + auto* pCopy = new TGraphAsymmErrors(pDiff); + pCopy->SetMarkerStyle(20); + pMultiGraphDiff->Add(pCopy, "P"); + if (pDiff) { + delete pDiff; + pDiff = nullptr; + } } + pMultiGraphDiff->GetYaxis()->SetTitle("difference"); + pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle); + pMultiGraphDiff->Draw("A pmc plc"); } - pMultiGraphDiff->GetYaxis()->SetTitle("difference"); - pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle); - pMultiGraphDiff->Draw("A pmc plc"); fpCanvas->cd(); pPadOrig->Draw(); - pPadRatio->Draw(); - pPadDiff->Draw(); + if (pPadRatio) pPadRatio->Draw(); + if (pPadDiff) pPadDiff->Draw(); } // --------------------------------------------------------------------------------------------------------------------- diff --git a/core/qa/checker/CbmQaCheckerHist1DHandler.h b/core/qa/checker/CbmQaCheckerHist1DHandler.h index 9193f6e9f9c76ca60319e83db86b157352403d98..bef26ff20a4699a86f34cdca816ded510e3a789a 100644 --- a/core/qa/checker/CbmQaCheckerHist1DHandler.h +++ b/core/qa/checker/CbmQaCheckerHist1DHandler.h @@ -47,7 +47,8 @@ namespace cbm::qa::checker ~Hist1DHandler() = default; /// @brief Creates object comparison canvas - void CreateCanvases(); + /// @param opt Canvas options + void CreateCanvases(Option_t* opt = "") override; /// @brief Compares objects to default /// @param pNum Pointer to "numerator" object @@ -63,7 +64,7 @@ namespace cbm::qa::checker /// 1: Comparison based on the ratio deviation /// 2: Statistical test comparison with chi2-test /// 3: Statistical test comparison with Kolmogorov test - CmpResult_t Compare(const TNamed* pNum, const TNamed* pDenom) const; + CmpResult_t Compare(const TNamed* pNum, const TNamed* pDenom) const override; private: /// @brief Compares two histograms point-to-point diff --git a/core/qa/checker/CbmQaCheckerHist2DHandler.cxx b/core/qa/checker/CbmQaCheckerHist2DHandler.cxx index e0ee23f9c3ee9988fc34180161b1780d991f64e8..56e14b9a22bd4a1c6110d8b5daa5461630b3f601 100644 --- a/core/qa/checker/CbmQaCheckerHist2DHandler.cxx +++ b/core/qa/checker/CbmQaCheckerHist2DHandler.cxx @@ -9,8 +9,38 @@ #include "CbmQaCheckerHist2DHandler.h" +#include "TCanvas.h" +#include "TH2.h" + using cbm::qa::checker::Hist2DHandler; // --------------------------------------------------------------------------------------------------------------------- // Hist2DHandler::Hist2DHandler(int iObject, int iFile, int iDataset) : Hist1DHandler(iObject, iFile, iDataset) {} + +// --------------------------------------------------------------------------------------------------------------------- +// +void Hist2DHandler::CreateCanvases(Option_t*) +{ + std::string sCanvName = fsBaseName + "_cmp_canvas"; + + // Title definitions + const char* title = fvpObjects[0]->GetTitle(); + const char* xAxisTitle = static_cast<TH1*>(fvpObjects[0])->GetXaxis()->GetTitle(); + const char* yAxisTitle = static_cast<TH1*>(fvpObjects[0])->GetYaxis()->GetTitle(); + const char* zAxisTitle = static_cast<TH1*>(fvpObjects[0])->GetZaxis()->GetTitle(); + + int nVersions = fpObjDB->GetNofVersions(); + fpCanvas = std::make_shared<TCanvas>(sCanvName.data(), title, 1500, 700); + fpCanvas->DivideSquare(nVersions); + for (int iVer = 0; iVer < nVersions; ++iVer) { + fpCanvas->cd(iVer + 1); + gPad->SetMargin(0.20, 0.20, 0.20, 0.10); + auto* pCopy = static_cast<TH2*>(static_cast<TH2*>(fvpObjects[iVer])->Clone()); + pCopy->SetTitle(Form("%s: %s", title, fpObjDB->GetVersionLabel(iVer).c_str())); + pCopy->GetXaxis()->SetTitle(xAxisTitle); + pCopy->GetYaxis()->SetTitle(yAxisTitle); + pCopy->GetZaxis()->SetTitle(zAxisTitle); + pCopy->Draw("colz"); + } +} diff --git a/core/qa/checker/CbmQaCheckerHist2DHandler.h b/core/qa/checker/CbmQaCheckerHist2DHandler.h index dbd6aaa73a5744492f05a8eecada63b756946ad1..8ee2ceeeee08bd619995602a19dead1dae69f33f 100644 --- a/core/qa/checker/CbmQaCheckerHist2DHandler.h +++ b/core/qa/checker/CbmQaCheckerHist2DHandler.h @@ -28,7 +28,8 @@ namespace cbm::qa::checker ~Hist2DHandler() = default; /// @brief Creates object comparison canvas - void CreateCanvases(){}; + /// @param opt Canvas options + void CreateCanvases(Option_t* opt = "") override; }; } // namespace cbm::qa::checker diff --git a/core/qa/checker/CbmQaCheckerObjectHandler.cxx b/core/qa/checker/CbmQaCheckerObjectHandler.cxx index e7feabf6602548bf63eaff706e465d88c29d0007..f28573caec5137e8c0b77482b8d1c29ce697bb50 100644 --- a/core/qa/checker/CbmQaCheckerObjectHandler.cxx +++ b/core/qa/checker/CbmQaCheckerObjectHandler.cxx @@ -9,8 +9,8 @@ #include "CbmQaCheckerObjectHandler.h" -#include "CbmQaCanvas.h" #include "Logger.h" +#include "TCanvas.h" #include "TDirectory.h" #include "TNamed.h" diff --git a/core/qa/checker/CbmQaCheckerObjectHandler.h b/core/qa/checker/CbmQaCheckerObjectHandler.h index 7990060dea5a201d0f62ff9c0fc4bb019e87ff90..2d188b0bbedb1aae8e75bba85479e755b3df445c 100644 --- a/core/qa/checker/CbmQaCheckerObjectHandler.h +++ b/core/qa/checker/CbmQaCheckerObjectHandler.h @@ -21,7 +21,6 @@ class TDirectory; class TNamed; class TObject; class TCanvas; -class CbmQaCanvas; namespace cbm::qa::checker { @@ -47,7 +46,8 @@ namespace cbm::qa::checker void AddObjects(const std::vector<TNamed*>& vpObj); /// @brief Creates object comparison canvas - virtual void CreateCanvases(){}; + /// @param opt Canvas options + virtual void CreateCanvases(Option_t*){}; /// @brief Compares two objects with different methods /// @param pNum Pointer to "numerator" object @@ -89,7 +89,7 @@ namespace cbm::qa::checker int fVerbose = 0; ///< Verbosity level TDirectory* fpOutDir = nullptr; ///< Pointer to directory std::shared_ptr<ObjectDB> fpObjDB = nullptr; ///< Pointer to object database - std::shared_ptr<CbmQaCanvas> fpCanvas = nullptr; ///< Comparison canvas + std::shared_ptr<TCanvas> fpCanvas = nullptr; ///< Comparison canvas std::bitset<sizeof(CmpResult_t) * 8> fOptionBits; ///< Bitset for option std::string fsObjType = ""; ///< Base type of the object to be handled diff --git a/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx b/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx index 683c751229018966fd42ab9688214c3e51b0f92f..2d861ad7f4b2b6f43812a85c3b741951de0a7dfe 100644 --- a/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx +++ b/core/qa/checker/CbmQaCheckerProfile1DHandler.cxx @@ -9,7 +9,6 @@ #include "CbmQaCheckerProfile1DHandler.h" -#include "CbmQaCanvas.h" #include "CbmQaCheckerHist1DHandler.h" #include "CbmQaCheckerTypedefs.h" #include "Logger.h" @@ -35,24 +34,51 @@ Profile1DHandler::Profile1DHandler(int iObject, int iFile, int iDataset) : Hist1 // --------------------------------------------------------------------------------------------------------------------- // -void Profile1DHandler::CreateCanvases() +void Profile1DHandler::CreateCanvases(Option_t* opt) { int nVersions = fpObjDB->GetNofVersions(); int iDef = fpObjDB->GetDefaultID(); + // ----- Option parsing + std::string sOption = opt; + for (auto& ch : sOption) { + ch = std::tolower(ch); + } + bool bDrawRatio = sOption.find("r") != std::string::npos; + bool bDrawDiff = sOption.find("d") != std::string::npos; + int nPads = static_cast<int>(bDrawRatio) + static_cast<int>(bDrawDiff) + 1; + // ----- Canvas: comparison of original histograms, ratios and subtractions std::string sCanvName = fsBaseName + "_cmp_canvas"; std::string sCanvTitle = "Comparison result for \"" + fsBaseName + "\""; - fpCanvas = std::make_shared<CbmQaCanvas>(sCanvName.data(), sCanvTitle.data(), 1500, 500); + fpCanvas = std::make_shared<TCanvas>(sCanvName.data(), sCanvTitle.data(), 1500, 500); fpCanvas->cd(); - auto* pPadOrig = new TPad("p1", "p1", 0.0, 0.0, 0.3333, 1.0); + + TPad* pPadOrig = nullptr; + TPad* pPadRatio = nullptr; + TPad* pPadDiff = nullptr; + + double xPadSize = 1.0 / nPads; + double xNext = 0.; + + pPadOrig = new TPad("p1", "p1", 0.0, 0.0, xPadSize, 1.0); pPadOrig->SetMargin(0.20, 0.05, 0.20, 0.10); fpCanvas->cd(); - auto* pPadRatio = new TPad("p2", "p2", 0.3333, 0.0, 0.6666, 1.0); - pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10); - fpCanvas->cd(); - auto* pPadDiff = new TPad("p3", "p3", 0.6666, 0.0, 1.0, 1.0); - pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10); + xNext += xPadSize; + + if (bDrawRatio) { + pPadRatio = new TPad("p2", "p2", xNext, 0.0, xNext + xPadSize, 1.0); + pPadRatio->SetMargin(0.20, 0.05, 0.20, 0.10); + fpCanvas->cd(); + xNext += xPadSize; + } + + if (bDrawDiff) { + pPadDiff = new TPad("p3", "p3", xNext, 0.0, xNext + xPadSize, 1.0); + pPadDiff->SetMargin(0.20, 0.05, 0.20, 0.10); + fpCanvas->cd(); + xNext += xPadSize; + } const char* title = fvpObjects[0]->GetTitle(); const char* titleRatio = Form("Ratio to %s", fpObjDB->GetVersionLabel(iDef).data()); @@ -79,55 +105,60 @@ void Profile1DHandler::CreateCanvases() auto* pDefault = static_cast<TProfile*>(fvpObjects[iDef])->ProjectionX(); // Histogram ratios to default - pPadRatio->cd(); - auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio); - for (int iV = 0; iV < nVersions; ++iV) { - if (iV == iDef) { - continue; - } - auto* pRatio = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX(); - auto currErrorLevel = gErrorIgnoreLevel; - gErrorIgnoreLevel = kError; - auto* pCopy = new TGraphAsymmErrors(pRatio, pDefault, "pois"); - gErrorIgnoreLevel = currErrorLevel; - pCopy->SetMarkerStyle(20); - pMultiGraphRatio->Add(pCopy, "P"); - - if (pRatio) { - delete pRatio; - pRatio = nullptr; + if (bDrawRatio) { + pPadRatio->cd(); + auto* pMultiGraphRatio = new TMultiGraph((fsBaseName + "_ratio").data(), titleRatio); + for (int iV = 0; iV < nVersions; ++iV) { + if (iV == iDef) { + continue; + } + auto* pRatio = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX(); + auto currErrorLevel = gErrorIgnoreLevel; + gErrorIgnoreLevel = kError; + auto* pCopy = new TGraphAsymmErrors(pRatio, pDefault, "pois"); + gErrorIgnoreLevel = currErrorLevel; + pCopy->SetMarkerStyle(20); + pMultiGraphRatio->Add(pCopy, "P"); + + if (pRatio) { + delete pRatio; + pRatio = nullptr; + } } + pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle); + pMultiGraphRatio->GetYaxis()->SetTitle("ratio"); + pMultiGraphRatio->Draw("A pmc plc"); } - pMultiGraphRatio->GetXaxis()->SetTitle(xAxisTitle); - pMultiGraphRatio->GetYaxis()->SetTitle("ratio"); - pMultiGraphRatio->Draw("A pmc plc"); // Histogram ratios to default - pPadDiff->cd(); - auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff); - for (int iV = 0; iV < nVersions; ++iV) { - if (iV == iDef) { - continue; - } - auto* pDiff = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX(); - pDiff->Add(pDefault, -1.); - auto* pCopy = new TGraphAsymmErrors(pDiff); - pCopy->GetYaxis()->SetTitle("difference"); - pCopy->SetMarkerStyle(20); - pMultiGraphDiff->Add(pCopy, "P"); - - if (pDiff) { - delete pDiff; - pDiff = nullptr; + if (bDrawDiff) { + pPadDiff->cd(); + auto* pMultiGraphDiff = new TMultiGraph((fsBaseName + "_diff").data(), titleDiff); + for (int iV = 0; iV < nVersions; ++iV) { + if (iV == iDef) { + continue; + } + auto* pDiff = static_cast<TProfile*>(fvpObjects[iV])->ProjectionX(); + pDiff->Add(pDefault, -1.); + auto* pCopy = new TGraphAsymmErrors(pDiff); + pCopy->GetYaxis()->SetTitle("difference"); + pCopy->SetMarkerStyle(20); + pMultiGraphDiff->Add(pCopy, "P"); + + if (pDiff) { + delete pDiff; + pDiff = nullptr; + } } + pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle); + pMultiGraphDiff->GetYaxis()->SetTitle("difference"); + pMultiGraphDiff->Draw("A pmc plc"); } - pMultiGraphDiff->GetXaxis()->SetTitle(xAxisTitle); - pMultiGraphDiff->GetYaxis()->SetTitle("difference"); - pMultiGraphDiff->Draw("A pmc plc"); + fpCanvas->cd(); pPadOrig->Draw(); - pPadRatio->Draw(); - pPadDiff->Draw(); + if (pPadRatio) pPadRatio->Draw(); + if (pPadDiff) pPadDiff->Draw(); if (pDefault) { delete pDefault; diff --git a/core/qa/checker/CbmQaCheckerProfile1DHandler.h b/core/qa/checker/CbmQaCheckerProfile1DHandler.h index 7a2de22d8cbbeb4b8e6389ecf38fcd4c556cb6c8..b962569886bfc94f6d04475be0f1a2b20f874ae2 100644 --- a/core/qa/checker/CbmQaCheckerProfile1DHandler.h +++ b/core/qa/checker/CbmQaCheckerProfile1DHandler.h @@ -28,7 +28,8 @@ namespace cbm::qa::checker ~Profile1DHandler() = default; /// @brief Creates object comparison canvas - void CreateCanvases(); + /// @param opt Options + void CreateCanvases(Option_t* opt = "") override; }; } // namespace cbm::qa::checker diff --git a/macro/qa/qa_compare_ca.C b/macro/qa/qa_compare_ca.C index 3bc59effd5b419a213df06a3f32c8ef16d909923..00c65783e164affe5b685c9f1a88e92f2e3a528d 100644 --- a/macro/qa/qa_compare_ca.C +++ b/macro/qa/qa_compare_ca.C @@ -36,7 +36,7 @@ int qa_compare_ca( pQaChecker->SetFromYAML(configName); // Read file-object map //// ----- Run comparision routine - pQaChecker->Process("P"); + pQaChecker->Process("PR"); // P - //// ----- Scan results bool res = pQaChecker->Scan(); // true - objects are the same, false - objects differ