Skip to content

Commit 76a92df

Browse files
tklemenzBhawani Singh
authored andcommitted
TPC: add occupancy plot to Cluster task
1 parent ea7ad31 commit 76a92df

File tree

6 files changed

+108
-8
lines changed

6 files changed

+108
-8
lines changed

Modules/TPC/include/TPC/ClusterVisualizer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ class ClusterVisualizer final : public quality_control::postprocessing::PostProc
6565
/// \param services Interface containing optional interfaces, for example DatabaseInterface
6666
void finalize(quality_control::postprocessing::Trigger, framework::ServiceRegistryRef) override;
6767

68+
template <class T>
69+
void makeRadialProfile(o2::tpc::CalDet<T>& calDet, TCanvas* canv, int nbinsY, float yMin, float yMax);
70+
71+
template <class T>
72+
void fillRadialHisto(TH2D& h2D, const o2::tpc::CalDet<T>& calDet, const o2::tpc::Side side);
73+
6874
private:
6975
o2::ccdb::CcdbApi mCdbApi;
7076
std::string mHost;

Modules/TPC/include/TPC/Clusters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class Clusters /*final*/ : public TaskInterface // todo add back the "final" whe
6363
std::vector<std::unique_ptr<TCanvas>> mSigmaTimeCanvasVec{}; ///< summary canvases of the SigmaTime object
6464
std::vector<std::unique_ptr<TCanvas>> mSigmaPadCanvasVec{}; ///< summary canvases of the SigmaPad object
6565
std::vector<std::unique_ptr<TCanvas>> mTimeBinCanvasVec{}; ///< summary canvases of the TimeBin object
66+
std::vector<std::unique_ptr<TCanvas>> mOccupancyCanvasVec{}; ///< summary canvases of the Occupancy object
6667

6768
void processClusterNative(o2::framework::InputRecord& inputs);
6869
void processKrClusters(o2::framework::InputRecord& inputs);

Modules/TPC/run/tpcQCClusterVisualizer.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,19 @@
6060
{ "Q_Tot" : [ "600", "0", "600" ] },
6161
{ "Sigma_Time" : [ "200", "0", "2" ] },
6262
{ "Sigma_Pad" : [ "200", "0", "2" ] },
63-
{ "Time_Bin" : [ "1000", "0", "100000" ] }
63+
{ "Time_Bin" : [ "1000", "0", "100000" ] },
64+
{ "Occupancy" : [ "100", "0", "0.001" ] }
6465
],
6566
"path_comment": "This is the path of the ClustersData object that shall be visualized.",
66-
"path": "TPC/MO/Clusters/ClusterData",
67+
"path": "qc/TPC/MO/Clusters/ClusterData",
6768
"dataType_comment": "This is the switch for 'RawDigits' or 'Clusters' task. Choose 'raw' or 'clusters'.",
6869
"dataType": "clusters",
6970
"initTrigger": [
7071
"once"
7172
],
7273
"updateTrigger_comment": "To trigger on a specific file being updated, use e.g. 'newobject:qcdb:TPC/Calib/Noise'",
7374
"updateTrigger": [
74-
"newobject:qcdb:TPC/MO/Clusters/ClusterData"
75+
"newobject:ccdb:qc/TPC/MO/Clusters/ClusterData"
7576
],
7677
"stopTrigger": [
7778
"userorcontrol"

Modules/TPC/run/tpcQCClusters_direct.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"className": "o2::quality_control_modules::tpc::Clusters",
2929
"moduleName": "QcTPC",
3030
"detectorName": "TPC",
31-
"cycleDurationSeconds": "10",
31+
"cycleDurationSeconds": "60",
32+
"maxNumberCycles": "-1",
3233
"resetAfterCycles": "5",
3334
"dataSource": {
3435
"type": "direct",
@@ -41,7 +42,8 @@
4142
"QtotNBins": "600", "QtotXMin": "0", "QtotXMax": "600",
4243
"SigmaPadNBins": "200", "SigmaPadXMin": "0", "SigmaPadXMax": "2",
4344
"SigmaTimeNBins": "200", "SigmaTimeXMin": "0", "SigmaTimeXMax": "2",
44-
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000"
45+
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000",
46+
"OccupancyNBins": "1000", "OccupancyXMin": "0", "OccupancyXMax": "0.00001"
4547
},
4648
"location": "local",
4749
"localMachines": [

Modules/TPC/src/ClusterVisualizer.cxx

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,16 @@ void ClusterVisualizer::configure(const boost::property_tree::ptree& config)
120120
"Q_Tot",
121121
"Sigma_Pad",
122122
"Sigma_Time",
123-
"Time_Bin"
123+
"Time_Bin",
124+
"Occupancy"
124125
};
125126
} else if (type == "raw") {
126127
mIsClusters = false;
127128
mObservables = {
128129
"N_RawDigits",
129130
"Q_Max",
130-
"Time_Bin"
131+
"Time_Bin",
132+
"Occupancy"
131133
};
132134
} else {
133135
ILOG(Error, Support) << "No valid data type given. 'dataType' has to be either 'clusters' or 'raw'." << ENDM;
@@ -153,12 +155,25 @@ void ClusterVisualizer::initialize(Trigger, framework::ServiceRegistryRef)
153155
mStoreMaps.size() > 1 ? mStoreMaps.at(calDetIter) : mStoreMaps.at(0));
154156
calDetIter++;
155157
}
158+
if (mIsClusters) {
159+
mCalDetCanvasVec.emplace_back(std::vector<std::unique_ptr<TCanvas>>());
160+
addAndPublish(getObjectsManager(),
161+
mCalDetCanvasVec.back(),
162+
{ "c_radial_profile_Occupancy" },
163+
mStoreMaps.size() > 1 ? mStoreMaps.at(calDetIter) : mStoreMaps.at(0));
164+
}
156165
}
157166

158167
void ClusterVisualizer::update(Trigger t, framework::ServiceRegistryRef)
159168
{
160169
ILOG(Info, Support) << "Trigger type is: " << t.triggerType << ", the timestamp is " << t.timestamp << ENDM;
161170

171+
for (auto& vec : mCalDetCanvasVec) {
172+
for (auto& canvas : vec) {
173+
canvas.get()->Clear();
174+
}
175+
}
176+
162177
auto calDetIter = 0;
163178

164179
auto clusterData = mCdbApi.retrieveFromTFileAny<ClustersData>(mPath,
@@ -199,6 +214,14 @@ void ClusterVisualizer::update(Trigger t, framework::ServiceRegistryRef)
199214
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
200215
o2::tpc::painter::makeSummaryCanvases(calDet, int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2), false, &vecPtr);
201216
calDetIter++;
217+
218+
calDet = clusters.getOccupancy();
219+
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
220+
o2::tpc::painter::makeSummaryCanvases(calDet, int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2), false, &vecPtr);
221+
calDetIter++;
222+
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
223+
makeRadialProfile(calDet, vecPtr.at(0), int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2));
224+
calDetIter++;
202225
}
203226

204227
void ClusterVisualizer::finalize(Trigger t, framework::ServiceRegistryRef)
@@ -214,4 +237,64 @@ void ClusterVisualizer::finalize(Trigger t, framework::ServiceRegistryRef)
214237
}
215238
}
216239

240+
template <class T>
241+
void ClusterVisualizer::makeRadialProfile(o2::tpc::CalDet<T>& calDet, TCanvas* canv, int nbinsY, float yMin, float yMax)
242+
{
243+
const std::string_view calName = calDet.getName();
244+
const auto radialBinning = o2::tpc::painter::getRowBinningCM();
245+
246+
auto hAside2D = new TH2D(fmt::format("h_{}_radialProfile_Aside", calName).data(), fmt::format("{}: Radial profile (A-Side)", calName).data(), radialBinning.size() - 1, radialBinning.data(), nbinsY, yMin, yMax);
247+
hAside2D->GetXaxis()->SetTitle("x (cm)");
248+
hAside2D->GetYaxis()->SetTitle(fmt::format("{}", calName).data());
249+
hAside2D->SetTitleOffset(1.05, "XY");
250+
hAside2D->SetTitleSize(0.05, "XY");
251+
hAside2D->SetStats(0);
252+
253+
auto hCside2D = new TH2D(fmt::format("h_{}_radialProfile_Cside", calName).data(), fmt::format("{}: Radial profile (C-Side)", calName).data(), radialBinning.size() - 1, radialBinning.data(), nbinsY, yMin, yMax);
254+
hCside2D->GetXaxis()->SetTitle("x (cm)");
255+
hCside2D->GetYaxis()->SetTitle(fmt::format("{}", calName).data());
256+
hCside2D->SetTitleOffset(1.05, "XY");
257+
hCside2D->SetTitleSize(0.05, "XY");
258+
hCside2D->SetStats(0);
259+
260+
fillRadialHisto(*hAside2D, calDet, o2::tpc::Side::A);
261+
fillRadialHisto(*hCside2D, calDet, o2::tpc::Side::C);
262+
263+
canv->Divide(1, 2);
264+
canv->cd(1);
265+
hAside2D->Draw("colz");
266+
hAside2D->SetStats(0);
267+
hAside2D->ProfileX("profile_ASide", 1, -1, "d,same");
268+
269+
canv->cd(2);
270+
hCside2D->Draw("colz");
271+
hCside2D->ProfileX("profile_CSide", 1, -1, "d,same");
272+
hAside2D->SetStats(0);
273+
274+
hAside2D->SetBit(TObject::kCanDelete);
275+
hCside2D->SetBit(TObject::kCanDelete);
276+
}
277+
278+
template <class T>
279+
void ClusterVisualizer::fillRadialHisto(TH2D& h2D, const o2::tpc::CalDet<T>& calDet, const o2::tpc::Side side)
280+
{
281+
const o2::tpc::Mapper& mapper = o2::tpc::Mapper::instance();
282+
283+
for (o2::tpc::ROC roc; !roc.looped(); ++roc) {
284+
if (roc.side() != side) {
285+
continue;
286+
}
287+
const int nrows = mapper.getNumberOfRowsROC(roc);
288+
for (int irow = 0; irow < nrows; ++irow) {
289+
const int npads = mapper.getNumberOfPadsInRowROC(roc, irow);
290+
const int globalRow = irow + (roc >= o2::tpc::Mapper::getNumberOfIROCs()) * o2::tpc::Mapper::getNumberOfRowsInIROC();
291+
for (int ipad = 0; ipad < npads; ++ipad) {
292+
const auto val = calDet.getValue(roc, irow, ipad);
293+
const o2::tpc::LocalPosition2D pos = mapper.getPadCentre(o2::tpc::PadPos(globalRow, ipad));
294+
h2D.Fill(pos.X(), val);
295+
}
296+
}
297+
}
298+
}
299+
217300
} // namespace o2::quality_control_modules::tpc

Modules/TPC/src/Clusters.cxx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,15 @@ void Clusters::initialize(InitContext& /*ctx*/)
7373
mWrapperVector.emplace_back(&mQCClusters.getClusters().getSigmaTime());
7474
mWrapperVector.emplace_back(&mQCClusters.getClusters().getSigmaPad());
7575
mWrapperVector.emplace_back(&mQCClusters.getClusters().getTimeBin());
76+
mWrapperVector.emplace_back(&mQCClusters.getClusters().getOccupancy());
7677

7778
addAndPublish(getObjectsManager(), mNClustersCanvasVec, { "c_Sides_N_Clusters", "c_ROCs_N_Clusters_1D", "c_ROCs_N_Clusters_2D" });
7879
addAndPublish(getObjectsManager(), mQMaxCanvasVec, { "c_Sides_Q_Max", "c_ROCs_Q_Max_1D", "c_ROCs_Q_Max_2D" });
7980
addAndPublish(getObjectsManager(), mQTotCanvasVec, { "c_Sides_Q_Tot", "c_ROCs_Q_Tot_1D", "c_ROCs_Q_Tot_2D" });
8081
addAndPublish(getObjectsManager(), mSigmaTimeCanvasVec, { "c_Sides_Sigma_Time", "c_ROCs_Sigma_Time_1D", "c_ROCs_Sigma_Time_2D" });
8182
addAndPublish(getObjectsManager(), mSigmaPadCanvasVec, { "c_Sides_Sigma_Pad", "c_ROCs_Sigma_Pad_1D", "c_ROCs_Sigma_Pad_2D" });
8283
addAndPublish(getObjectsManager(), mTimeBinCanvasVec, { "c_Sides_Time_Bin", "c_ROCs_Time_Bin_1D", "c_ROCs_Time_Bin_2D" });
84+
addAndPublish(getObjectsManager(), mOccupancyCanvasVec, { "c_Sides_Occupancy", "c_ROCs_Occupancy_1D", "c_ROCs_Occupancy_2D" });
8385

8486
for (auto& wrapper : mWrapperVector) {
8587
getObjectsManager()->startPublishing(&wrapper);
@@ -123,6 +125,7 @@ void Clusters::processClusterNative(InputRecord& inputs)
123125
}
124126
}
125127
}
128+
mQCClusters.getClusters().endTF();
126129
}
127130

128131
void Clusters::processKrClusters(InputRecord& inputs)
@@ -138,6 +141,7 @@ void Clusters::processKrClusters(InputRecord& inputs)
138141
mQCClusters.getClusters().processCluster(cl, Sector(cl.sector), int(cl.meanRow));
139142
}
140143
}
144+
mQCClusters.getClusters().endTF();
141145
}
142146

143147
void Clusters::monitorData(ProcessingContext& ctx)
@@ -156,12 +160,14 @@ void Clusters::monitorData(ProcessingContext& ctx)
156160
fillCanvases(mQCClusters.getClusters().getSigmaTime(), mSigmaTimeCanvasVec, mCustomParameters, "SigmaPad");
157161
fillCanvases(mQCClusters.getClusters().getSigmaPad(), mSigmaPadCanvasVec, mCustomParameters, "SigmaTime");
158162
fillCanvases(mQCClusters.getClusters().getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin");
163+
fillCanvases(mQCClusters.getClusters().getTimeBin(), mOccupancyCanvasVec, mCustomParameters, "Occupancy");
159164
}
160165
}
161166

162167
void Clusters::endOfCycle()
163168
{
164-
ILOG(Debug, Devel) << "endOfCycle" << ENDM;
169+
ILOG(Info, Support) << "endOfCycle" << ENDM;
170+
ILOG(Info, Support) << "Processed TFs: " << mQCClusters.getClusters().getProcessedTFs() << ENDM;
165171

166172
if (mIsMergeable) {
167173
mQCClusters.getClusters().normalize();
@@ -188,6 +194,7 @@ void Clusters::reset()
188194
clearCanvases(mSigmaTimeCanvasVec);
189195
clearCanvases(mSigmaPadCanvasVec);
190196
clearCanvases(mTimeBinCanvasVec);
197+
clearCanvases(mOccupancyCanvasVec);
191198
}
192199
}
193200

0 commit comments

Comments
 (0)