From 85fc630d2305d835029588178645e2a6dc420112 Mon Sep 17 00:00:00 2001 From: Thomas Klemenz Date: Thu, 15 Jul 2021 11:18:50 +0200 Subject: [PATCH] TPC: configurable histogram ranges Make output histogram ranges of Cluster and RawDigits task configurable via json file. --- Modules/TPC/include/TPC/Utility.h | 12 ++++++++ Modules/TPC/run/tpcQCClusters_direct.json | 24 ++++++---------- Modules/TPC/run/tpcQCRawDigits_direct.json | 4 ++- Modules/TPC/run/tpcQCTasks_multinode.json | 13 +++++++-- Modules/TPC/src/Clusters.cxx | 33 +++++++++------------- Modules/TPC/src/RawDigits.cxx | 16 +++++------ Modules/TPC/src/Utility.cxx | 33 ++++++++++++++++++++++ 7 files changed, 88 insertions(+), 47 deletions(-) diff --git a/Modules/TPC/include/TPC/Utility.h b/Modules/TPC/include/TPC/Utility.h index 53a65a50ad..86e830b321 100644 --- a/Modules/TPC/include/TPC/Utility.h +++ b/Modules/TPC/include/TPC/Utility.h @@ -40,6 +40,18 @@ void addAndPublish(std::shared_ptr ob /// \return std::vector std::vector toVector(std::vector>& input); +/// \brief Fills std::vector> with data from calDet +/// This is a convenience function to call o2::tpc::painter::makeSummaryCanvases in QC tasks to visualize the content of a CalDet object. +/// \param calDet Object to be displayed in the canvases +/// \param canvases Vector containing three std::unique_ptr, will be filled +/// \param params Information about the ranges of the histograms that will be drawn on the canvases. The params can be set via 'taskParameters' in the config file of corresponding the task. +/// \param paramName Name of the observable that is stored in calDet +void fillCanvases(const o2::tpc::CalDet& calDet, std::vector>& canvases, const std::unordered_map& params, const std::string paramName); + +/// \brief Clears all canvases +/// \param canvases Contains the canvases that will be cleared +void clearCanvases(std::vector>& canvases); + /// \brief Converts CLUSTERNATIVE from InputRecord to ClusterNativeAccess /// Convenience funtion to make native clusters accessible when receiving them from the DPL /// \param input InputReconrd from the ProcessingContext diff --git a/Modules/TPC/run/tpcQCClusters_direct.json b/Modules/TPC/run/tpcQCClusters_direct.json index 4aac66fcd0..46f3cb24c1 100644 --- a/Modules/TPC/run/tpcQCClusters_direct.json +++ b/Modules/TPC/run/tpcQCClusters_direct.json @@ -28,31 +28,23 @@ "className": "o2::quality_control_modules::tpc::Clusters", "moduleName": "QcTPC", "detectorName": "TPC", - "cycleDurationSeconds": "60", + "cycleDurationSeconds": "10", "maxNumberCycles": "-1", + "resetAfterCycles": "5", "dataSource": { "type": "direct", "query" : "input:TPC/CLUSTERNATIVE" }, "taskParameters": { - "myOwnKey": "myOwnValue" + "NClustersNBins": "100", "NClustersXMin": "0", "NClustersXMax": "100", + "QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200", + "QtotNBins": "600", "QtotXMin": "0", "QtotXMax": "600", + "SigmaPadNBins": "200", "SigmaPadXMin": "0", "SigmaPadXMax": "2", + "SigmaTimeNBins": "200", "SigmaTimeXMin": "0", "SigmaTimeXMax": "2", + "TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000" }, "location": "remote" } - }, - "checks": { - "QcCheckClusters": { - "active": "true", - "className": "o2::quality_control_modules::skeleton::SkeletonCheck", - "moduleName": "QcSkeleton", - "policy": "OnAny", - "detectorName": "TPC", - "dataSource": [{ - "type": "Task", - "name": "Clusters", - "MOs": ["example"] - }] - } } }, "dataSamplingPolicies": [ diff --git a/Modules/TPC/run/tpcQCRawDigits_direct.json b/Modules/TPC/run/tpcQCRawDigits_direct.json index 7c0e16059c..af1ef46e31 100644 --- a/Modules/TPC/run/tpcQCRawDigits_direct.json +++ b/Modules/TPC/run/tpcQCRawDigits_direct.json @@ -35,7 +35,9 @@ "query" : "input:TPC/RAWDATA" }, "taskParameters": { - "myOwnKey": "myOwnValue" + "NRawDigitsNBins": "100", "NRawDigitsXMin": "0", "NRawDigitsXMax": "100", + "QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200", + "TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000" }, "location": "remote" } diff --git a/Modules/TPC/run/tpcQCTasks_multinode.json b/Modules/TPC/run/tpcQCTasks_multinode.json index de5e721dc1..59f637c072 100644 --- a/Modules/TPC/run/tpcQCTasks_multinode.json +++ b/Modules/TPC/run/tpcQCTasks_multinode.json @@ -34,7 +34,11 @@ "type": "dataSamplingPolicy", "name": "random-rawdata" }, - "taskParameters": {}, + "taskParameters": { + "NRawDigitsNBins": "100", "NRawDigitsXMin": "0", "NRawDigitsXMax": "100", + "QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200", + "TimeBinNBins": "600", "TimeBinXMin": "0", "TimeBinXMax": "600" + }, "location": "remote" }, "Clusters_EPN": { @@ -49,7 +53,12 @@ "name": "random-clusters" }, "taskParameters": { - "myOwnKey": "myOwnValue" + "NClustersNBins": "100", "NClustersXMin": "0", "NClustersXMax": "100", + "QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200", + "QtotNBins": "600", "QtotXMin": "0", "QtotXMax": "600", + "SigmaPadNBins": "200", "SigmaPadXMin": "0", "SigmaPadXMax": "2", + "SigmaTimeNBins": "200", "SigmaTimeXMin": "0", "SigmaTimeXMax": "2", + "TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000" }, "location": "remote" }, diff --git a/Modules/TPC/src/Clusters.cxx b/Modules/TPC/src/Clusters.cxx index 12345c462e..cdf5430a10 100644 --- a/Modules/TPC/src/Clusters.cxx +++ b/Modules/TPC/src/Clusters.cxx @@ -50,7 +50,6 @@ void Clusters::initialize(o2::framework::InitContext& /*ctx*/) for (auto& wrapper : mWrapperVector) { getObjectsManager()->startPublishing(&wrapper); - getObjectsManager()->addMetadata(wrapper.getObj()->getName().data(), "custom", "87"); } } @@ -80,23 +79,12 @@ void Clusters::monitorData(o2::framework::ProcessingContext& ctx) mQCClusters.analyse(); - auto vecPtrNClusters = toVector(mNClustersCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mQCClusters.getNClusters(), 300, 0, 0, true, &vecPtrNClusters); - - auto vecPtrQMax = toVector(mQMaxCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mQCClusters.getQMax(), 300, 0, 0, true, &vecPtrQMax); - - auto vecPtrQTot = toVector(mQTotCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mQCClusters.getQTot(), 300, 0, 0, true, &vecPtrQTot); - - auto vecPtrSigmaTime = toVector(mSigmaTimeCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mQCClusters.getSigmaTime(), 300, 0, 0, true, &vecPtrSigmaTime); - - auto vecPtrSigmaPad = toVector(mSigmaPadCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mQCClusters.getSigmaPad(), 300, 0, 0, true, &vecPtrSigmaPad); - - auto vecPtrTimeBin = toVector(mTimeBinCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mQCClusters.getTimeBin(), 300, 0, 0, true, &vecPtrTimeBin); + fillCanvases(mQCClusters.getNClusters(), mNClustersCanvasVec, mCustomParameters, "NClusters"); + fillCanvases(mQCClusters.getQMax(), mQMaxCanvasVec, mCustomParameters, "Qmax"); + fillCanvases(mQCClusters.getQTot(), mQTotCanvasVec, mCustomParameters, "Qtot"); + fillCanvases(mQCClusters.getSigmaTime(), mSigmaTimeCanvasVec, mCustomParameters, "SigmaPad"); + fillCanvases(mQCClusters.getSigmaPad(), mSigmaPadCanvasVec, mCustomParameters, "SigmaTime"); + fillCanvases(mQCClusters.getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin"); } void Clusters::endOfCycle() @@ -113,7 +101,14 @@ void Clusters::reset() { // clean all the monitor objects here - QcInfoLogger::GetInstance() << "Resetting the histogram" << AliceO2::InfoLogger::InfoLogger::endm; + QcInfoLogger::GetInstance() << "Resetting the canvases" << AliceO2::InfoLogger::InfoLogger::endm; + + clearCanvases(mNClustersCanvasVec); + clearCanvases(mQMaxCanvasVec); + clearCanvases(mQTotCanvasVec); + clearCanvases(mSigmaTimeCanvasVec); + clearCanvases(mSigmaPadCanvasVec); + clearCanvases(mTimeBinCanvasVec); } } // namespace o2::quality_control_modules::tpc diff --git a/Modules/TPC/src/RawDigits.cxx b/Modules/TPC/src/RawDigits.cxx index 5619e7a994..d24bb82e2b 100644 --- a/Modules/TPC/src/RawDigits.cxx +++ b/Modules/TPC/src/RawDigits.cxx @@ -46,7 +46,6 @@ void RawDigits::initialize(o2::framework::InitContext& /*ctx*/) for (auto& wrapper : mWrapperVector) { getObjectsManager()->startPublishing(&wrapper); - getObjectsManager()->addMetadata(wrapper.getObj()->getName().data(), "custom", "87"); } mRawReader.setLinkZSCallback([this](int cru, int rowInSector, int padInRow, int timeBin, float adcValue) -> bool { @@ -72,14 +71,9 @@ void RawDigits::monitorData(o2::framework::ProcessingContext& ctx) mRawDigitQC.analyse(); - auto vecPtrNRawDigits = toVector(mNRawDigitsCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mRawDigitQC.getNClusters(), 300, 0, 0, true, &vecPtrNRawDigits); - - auto vecPtrQMax = toVector(mQMaxCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mRawDigitQC.getQMax(), 300, 0, 0, true, &vecPtrQMax); - - auto vecPtrTimeBin = toVector(mTimeBinCanvasVec); - o2::tpc::painter::makeSummaryCanvases(mRawDigitQC.getTimeBin(), 300, 0, 0, true, &vecPtrTimeBin); + fillCanvases(mRawDigitQC.getNClusters(), mNRawDigitsCanvasVec, mCustomParameters, "NRawDigits"); + fillCanvases(mRawDigitQC.getQMax(), mQMaxCanvasVec, mCustomParameters, "Qmax"); + fillCanvases(mRawDigitQC.getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin"); } void RawDigits::endOfCycle() @@ -97,6 +91,10 @@ void RawDigits::reset() // clean all the monitor objects here QcInfoLogger::GetInstance() << "Resetting the histogram" << AliceO2::InfoLogger::InfoLogger::endm; + + clearCanvases(mNRawDigitsCanvasVec); + clearCanvases(mQMaxCanvasVec); + clearCanvases(mTimeBinCanvasVec); } } // namespace o2::quality_control_modules::tpc diff --git a/Modules/TPC/src/Utility.cxx b/Modules/TPC/src/Utility.cxx index e6561962c9..0e1fd4c4b3 100644 --- a/Modules/TPC/src/Utility.cxx +++ b/Modules/TPC/src/Utility.cxx @@ -19,6 +19,8 @@ #include "Framework/InputRecordWalker.h" #include "DataFormatsTPC/ClusterNativeHelper.h" #include "DataFormatsTPC/TPCSectorHeader.h" +#include "TPCBase/CalDet.h" +#include "TPCBase/Painter.h" // QC includes #include "TPC/Utility.h" @@ -53,6 +55,37 @@ std::vector toVector(std::vector>& input) return output; } +void fillCanvases(const o2::tpc::CalDet& calDet, std::vector>& canvases, const std::unordered_map& params, const std::string paramName) +{ + const std::string parNBins = paramName + "NBins"; + const std::string parXMin = paramName + "XMin"; + const std::string parXMax = paramName + "XMax"; + int nbins = 300; + float xmin = 0; + float xmax = 0; + const auto last = params.end(); + const auto itNBins = params.find(parNBins); + const auto itXMin = params.find(parXMin); + const auto itXMax = params.find(parXMax); + if ((itNBins == last) || (itXMin == last) || (itXMax == last)) { + LOGP(warning, "missing parameter {}, {} or {}, falling back to auto scaling", parNBins, parXMin, parXMax); + LOGP(warning, "Please add '{}': '', '{}': '', '{}': '' to the 'taskParameters'.", parNBins, parXMin, parXMax); + } else { + nbins = std::stoi(itNBins->second); + xmin = std::stof(itXMin->second); + xmax = std::stof(itXMax->second); + } + auto vecPtr = toVector(canvases); + o2::tpc::painter::makeSummaryCanvases(calDet, nbins, xmin, xmax, true, &vecPtr); +} + +void clearCanvases(std::vector>& canvases) +{ + for (const auto& canvas : canvases) { + canvas->Clear(); + } +} + o2::tpc::ClusterNativeAccess clusterHandler(o2::framework::InputRecord& input) { using namespace o2::tpc;