Skip to content

Commit f6b7dcc

Browse files
authored
TPC: configurable histogram ranges (#768)
Make output histogram ranges of Cluster and RawDigits task configurable via json file.
1 parent ffc7aa9 commit f6b7dcc

7 files changed

Lines changed: 88 additions & 47 deletions

File tree

Modules/TPC/include/TPC/Utility.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ void addAndPublish(std::shared_ptr<o2::quality_control::core::ObjectsManager> ob
4040
/// \return std::vector<TCanvas*>
4141
std::vector<TCanvas*> toVector(std::vector<std::unique_ptr<TCanvas>>& input);
4242

43+
/// \brief Fills std::vector<std::unique_ptr<TCanvas>> with data from calDet
44+
/// This is a convenience function to call o2::tpc::painter::makeSummaryCanvases in QC tasks to visualize the content of a CalDet object.
45+
/// \param calDet Object to be displayed in the canvases
46+
/// \param canvases Vector containing three std::unique_ptr<TCanvas>, will be filled
47+
/// \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.
48+
/// \param paramName Name of the observable that is stored in calDet
49+
void fillCanvases(const o2::tpc::CalDet<float>& calDet, std::vector<std::unique_ptr<TCanvas>>& canvases, const std::unordered_map<std::string, std::string>& params, const std::string paramName);
50+
51+
/// \brief Clears all canvases
52+
/// \param canvases Contains the canvases that will be cleared
53+
void clearCanvases(std::vector<std::unique_ptr<TCanvas>>& canvases);
54+
4355
/// \brief Converts CLUSTERNATIVE from InputRecord to ClusterNativeAccess
4456
/// Convenience funtion to make native clusters accessible when receiving them from the DPL
4557
/// \param input InputReconrd from the ProcessingContext

Modules/TPC/run/tpcQCClusters_direct.json

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,23 @@
2828
"className": "o2::quality_control_modules::tpc::Clusters",
2929
"moduleName": "QcTPC",
3030
"detectorName": "TPC",
31-
"cycleDurationSeconds": "60",
31+
"cycleDurationSeconds": "10",
3232
"maxNumberCycles": "-1",
33+
"resetAfterCycles": "5",
3334
"dataSource": {
3435
"type": "direct",
3536
"query" : "input:TPC/CLUSTERNATIVE"
3637
},
3738
"taskParameters": {
38-
"myOwnKey": "myOwnValue"
39+
"NClustersNBins": "100", "NClustersXMin": "0", "NClustersXMax": "100",
40+
"QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200",
41+
"QtotNBins": "600", "QtotXMin": "0", "QtotXMax": "600",
42+
"SigmaPadNBins": "200", "SigmaPadXMin": "0", "SigmaPadXMax": "2",
43+
"SigmaTimeNBins": "200", "SigmaTimeXMin": "0", "SigmaTimeXMax": "2",
44+
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000"
3945
},
4046
"location": "remote"
4147
}
42-
},
43-
"checks": {
44-
"QcCheckClusters": {
45-
"active": "true",
46-
"className": "o2::quality_control_modules::skeleton::SkeletonCheck",
47-
"moduleName": "QcSkeleton",
48-
"policy": "OnAny",
49-
"detectorName": "TPC",
50-
"dataSource": [{
51-
"type": "Task",
52-
"name": "Clusters",
53-
"MOs": ["example"]
54-
}]
55-
}
5648
}
5749
},
5850
"dataSamplingPolicies": [

Modules/TPC/run/tpcQCRawDigits_direct.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
"query" : "input:TPC/RAWDATA"
3636
},
3737
"taskParameters": {
38-
"myOwnKey": "myOwnValue"
38+
"NRawDigitsNBins": "100", "NRawDigitsXMin": "0", "NRawDigitsXMax": "100",
39+
"QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200",
40+
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000"
3941
},
4042
"location": "remote"
4143
}

Modules/TPC/run/tpcQCTasks_multinode.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@
3434
"type": "dataSamplingPolicy",
3535
"name": "random-rawdata"
3636
},
37-
"taskParameters": {},
37+
"taskParameters": {
38+
"NRawDigitsNBins": "100", "NRawDigitsXMin": "0", "NRawDigitsXMax": "100",
39+
"QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200",
40+
"TimeBinNBins": "600", "TimeBinXMin": "0", "TimeBinXMax": "600"
41+
},
3842
"location": "remote"
3943
},
4044
"Clusters_EPN": {
@@ -49,7 +53,12 @@
4953
"name": "random-clusters"
5054
},
5155
"taskParameters": {
52-
"myOwnKey": "myOwnValue"
56+
"NClustersNBins": "100", "NClustersXMin": "0", "NClustersXMax": "100",
57+
"QmaxNBins": "200", "QmaxXMin": "0", "QmaxXMax": "200",
58+
"QtotNBins": "600", "QtotXMin": "0", "QtotXMax": "600",
59+
"SigmaPadNBins": "200", "SigmaPadXMin": "0", "SigmaPadXMax": "2",
60+
"SigmaTimeNBins": "200", "SigmaTimeXMin": "0", "SigmaTimeXMax": "2",
61+
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000"
5362
},
5463
"location": "remote"
5564
},

Modules/TPC/src/Clusters.cxx

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ void Clusters::initialize(o2::framework::InitContext& /*ctx*/)
5050

5151
for (auto& wrapper : mWrapperVector) {
5252
getObjectsManager()->startPublishing(&wrapper);
53-
getObjectsManager()->addMetadata(wrapper.getObj()->getName().data(), "custom", "87");
5453
}
5554
}
5655

@@ -80,23 +79,12 @@ void Clusters::monitorData(o2::framework::ProcessingContext& ctx)
8079

8180
mQCClusters.analyse();
8281

83-
auto vecPtrNClusters = toVector(mNClustersCanvasVec);
84-
o2::tpc::painter::makeSummaryCanvases(mQCClusters.getNClusters(), 300, 0, 0, true, &vecPtrNClusters);
85-
86-
auto vecPtrQMax = toVector(mQMaxCanvasVec);
87-
o2::tpc::painter::makeSummaryCanvases(mQCClusters.getQMax(), 300, 0, 0, true, &vecPtrQMax);
88-
89-
auto vecPtrQTot = toVector(mQTotCanvasVec);
90-
o2::tpc::painter::makeSummaryCanvases(mQCClusters.getQTot(), 300, 0, 0, true, &vecPtrQTot);
91-
92-
auto vecPtrSigmaTime = toVector(mSigmaTimeCanvasVec);
93-
o2::tpc::painter::makeSummaryCanvases(mQCClusters.getSigmaTime(), 300, 0, 0, true, &vecPtrSigmaTime);
94-
95-
auto vecPtrSigmaPad = toVector(mSigmaPadCanvasVec);
96-
o2::tpc::painter::makeSummaryCanvases(mQCClusters.getSigmaPad(), 300, 0, 0, true, &vecPtrSigmaPad);
97-
98-
auto vecPtrTimeBin = toVector(mTimeBinCanvasVec);
99-
o2::tpc::painter::makeSummaryCanvases(mQCClusters.getTimeBin(), 300, 0, 0, true, &vecPtrTimeBin);
82+
fillCanvases(mQCClusters.getNClusters(), mNClustersCanvasVec, mCustomParameters, "NClusters");
83+
fillCanvases(mQCClusters.getQMax(), mQMaxCanvasVec, mCustomParameters, "Qmax");
84+
fillCanvases(mQCClusters.getQTot(), mQTotCanvasVec, mCustomParameters, "Qtot");
85+
fillCanvases(mQCClusters.getSigmaTime(), mSigmaTimeCanvasVec, mCustomParameters, "SigmaPad");
86+
fillCanvases(mQCClusters.getSigmaPad(), mSigmaPadCanvasVec, mCustomParameters, "SigmaTime");
87+
fillCanvases(mQCClusters.getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin");
10088
}
10189

10290
void Clusters::endOfCycle()
@@ -113,7 +101,14 @@ void Clusters::reset()
113101
{
114102
// clean all the monitor objects here
115103

116-
QcInfoLogger::GetInstance() << "Resetting the histogram" << AliceO2::InfoLogger::InfoLogger::endm;
104+
QcInfoLogger::GetInstance() << "Resetting the canvases" << AliceO2::InfoLogger::InfoLogger::endm;
105+
106+
clearCanvases(mNClustersCanvasVec);
107+
clearCanvases(mQMaxCanvasVec);
108+
clearCanvases(mQTotCanvasVec);
109+
clearCanvases(mSigmaTimeCanvasVec);
110+
clearCanvases(mSigmaPadCanvasVec);
111+
clearCanvases(mTimeBinCanvasVec);
117112
}
118113

119114
} // namespace o2::quality_control_modules::tpc

Modules/TPC/src/RawDigits.cxx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ void RawDigits::initialize(o2::framework::InitContext& /*ctx*/)
4646

4747
for (auto& wrapper : mWrapperVector) {
4848
getObjectsManager()->startPublishing(&wrapper);
49-
getObjectsManager()->addMetadata(wrapper.getObj()->getName().data(), "custom", "87");
5049
}
5150

5251
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)
7271

7372
mRawDigitQC.analyse();
7473

75-
auto vecPtrNRawDigits = toVector(mNRawDigitsCanvasVec);
76-
o2::tpc::painter::makeSummaryCanvases(mRawDigitQC.getNClusters(), 300, 0, 0, true, &vecPtrNRawDigits);
77-
78-
auto vecPtrQMax = toVector(mQMaxCanvasVec);
79-
o2::tpc::painter::makeSummaryCanvases(mRawDigitQC.getQMax(), 300, 0, 0, true, &vecPtrQMax);
80-
81-
auto vecPtrTimeBin = toVector(mTimeBinCanvasVec);
82-
o2::tpc::painter::makeSummaryCanvases(mRawDigitQC.getTimeBin(), 300, 0, 0, true, &vecPtrTimeBin);
74+
fillCanvases(mRawDigitQC.getNClusters(), mNRawDigitsCanvasVec, mCustomParameters, "NRawDigits");
75+
fillCanvases(mRawDigitQC.getQMax(), mQMaxCanvasVec, mCustomParameters, "Qmax");
76+
fillCanvases(mRawDigitQC.getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin");
8377
}
8478

8579
void RawDigits::endOfCycle()
@@ -97,6 +91,10 @@ void RawDigits::reset()
9791
// clean all the monitor objects here
9892

9993
QcInfoLogger::GetInstance() << "Resetting the histogram" << AliceO2::InfoLogger::InfoLogger::endm;
94+
95+
clearCanvases(mNRawDigitsCanvasVec);
96+
clearCanvases(mQMaxCanvasVec);
97+
clearCanvases(mTimeBinCanvasVec);
10098
}
10199

102100
} // namespace o2::quality_control_modules::tpc

Modules/TPC/src/Utility.cxx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "Framework/InputRecordWalker.h"
2020
#include "DataFormatsTPC/ClusterNativeHelper.h"
2121
#include "DataFormatsTPC/TPCSectorHeader.h"
22+
#include "TPCBase/CalDet.h"
23+
#include "TPCBase/Painter.h"
2224

2325
// QC includes
2426
#include "TPC/Utility.h"
@@ -53,6 +55,37 @@ std::vector<TCanvas*> toVector(std::vector<std::unique_ptr<TCanvas>>& input)
5355
return output;
5456
}
5557

58+
void fillCanvases(const o2::tpc::CalDet<float>& calDet, std::vector<std::unique_ptr<TCanvas>>& canvases, const std::unordered_map<std::string, std::string>& params, const std::string paramName)
59+
{
60+
const std::string parNBins = paramName + "NBins";
61+
const std::string parXMin = paramName + "XMin";
62+
const std::string parXMax = paramName + "XMax";
63+
int nbins = 300;
64+
float xmin = 0;
65+
float xmax = 0;
66+
const auto last = params.end();
67+
const auto itNBins = params.find(parNBins);
68+
const auto itXMin = params.find(parXMin);
69+
const auto itXMax = params.find(parXMax);
70+
if ((itNBins == last) || (itXMin == last) || (itXMax == last)) {
71+
LOGP(warning, "missing parameter {}, {} or {}, falling back to auto scaling", parNBins, parXMin, parXMax);
72+
LOGP(warning, "Please add '{}': '<value>', '{}': '<value>', '{}': '<value>' to the 'taskParameters'.", parNBins, parXMin, parXMax);
73+
} else {
74+
nbins = std::stoi(itNBins->second);
75+
xmin = std::stof(itXMin->second);
76+
xmax = std::stof(itXMax->second);
77+
}
78+
auto vecPtr = toVector(canvases);
79+
o2::tpc::painter::makeSummaryCanvases(calDet, nbins, xmin, xmax, true, &vecPtr);
80+
}
81+
82+
void clearCanvases(std::vector<std::unique_ptr<TCanvas>>& canvases)
83+
{
84+
for (const auto& canvas : canvases) {
85+
canvas->Clear();
86+
}
87+
}
88+
5689
o2::tpc::ClusterNativeAccess clusterHandler(o2::framework::InputRecord& input)
5790
{
5891
using namespace o2::tpc;

0 commit comments

Comments
 (0)