Skip to content

Commit e039c1c

Browse files
committed
TPC: add occupancy plot to Cluster task
1 parent 91a6a5f commit e039c1c

6 files changed

Lines changed: 106 additions & 7 deletions

File tree

Modules/TPC/include/TPC/ClusterVisualizer.h

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

69+
template <class T>
70+
void makeRadialProfile(o2::tpc::CalDet<T>& calDet, TCanvas* canv, int nbinsY, float yMin, float yMax);
71+
72+
template <class T>
73+
void fillRadialHisto(TH2D& h2D, const o2::tpc::CalDet<T>& calDet, const o2::tpc::Side side);
74+
6975
private:
7076
o2::ccdb::CcdbApi mCdbApi;
7177
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: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"className": "o2::quality_control_modules::tpc::Clusters",
2929
"moduleName": "QcTPC",
3030
"detectorName": "TPC",
31-
"cycleDurationSeconds": "10",
31+
"cycleDurationSeconds": "60",
3232
"maxNumberCycles": "-1",
3333
"resetAfterCycles": "5",
3434
"dataSource": {
@@ -42,7 +42,8 @@
4242
"QtotNBins": "600", "QtotXMin": "0", "QtotXMax": "600",
4343
"SigmaPadNBins": "200", "SigmaPadXMin": "0", "SigmaPadXMax": "2",
4444
"SigmaTimeNBins": "200", "SigmaTimeXMin": "0", "SigmaTimeXMax": "2",
45-
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000"
45+
"TimeBinNBins": "1000", "TimeBinXMin": "0", "TimeBinXMax": "100000",
46+
"OccupancyNBins": "1000", "OccupancyXMin": "0", "OccupancyXMax": "0.00001"
4647
},
4748
"location": "local",
4849
"localMachines": [

Modules/TPC/src/ClusterVisualizer.cxx

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,16 @@ void ClusterVisualizer::configure(std::string name, const boost::property_tree::
118118
"Q_Tot",
119119
"Sigma_Pad",
120120
"Sigma_Time",
121-
"Time_Bin"
121+
"Time_Bin",
122+
"Occupancy"
122123
};
123124
} else if (type == "raw") {
124125
mIsClusters = false;
125126
mObservables = {
126127
"N_RawDigits",
127128
"Q_Max",
128-
"Time_Bin"
129+
"Time_Bin",
130+
"Occupancy"
129131
};
130132
} else {
131133
ILOG(Error, Support) << "No valid data type given. 'dataType' has to be either 'clusters' or 'raw'." << ENDM;
@@ -147,12 +149,25 @@ void ClusterVisualizer::initialize(Trigger, framework::ServiceRegistryRef)
147149
mStoreMaps.size() > 1 ? mStoreMaps.at(calDetIter) : mStoreMaps.at(0));
148150
calDetIter++;
149151
}
152+
if (mIsClusters) {
153+
mCalDetCanvasVec.emplace_back(std::vector<std::unique_ptr<TCanvas>>());
154+
addAndPublish(getObjectsManager(),
155+
mCalDetCanvasVec.back(),
156+
{ "c_radial_profile_Occupancy" },
157+
mStoreMaps.size() > 1 ? mStoreMaps.at(calDetIter) : mStoreMaps.at(0));
158+
}
150159
}
151160

152161
void ClusterVisualizer::update(Trigger t, framework::ServiceRegistryRef)
153162
{
154163
ILOG(Info, Support) << "Trigger type is: " << t.triggerType << ", the timestamp is " << t.timestamp << ENDM;
155164

165+
for (auto& vec : mCalDetCanvasVec) {
166+
for (auto& canvas : vec) {
167+
canvas.get()->Clear();
168+
}
169+
}
170+
156171
auto calDetIter = 0;
157172

158173
auto clusterData = mCdbApi.retrieveFromTFileAny<ClustersData>(mPath,
@@ -192,6 +207,14 @@ void ClusterVisualizer::update(Trigger t, framework::ServiceRegistryRef)
192207
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
193208
o2::tpc::painter::makeSummaryCanvases(calDet, int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2), false, &vecPtr);
194209
calDetIter++;
210+
211+
calDet = clusters.getOccupancy();
212+
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
213+
o2::tpc::painter::makeSummaryCanvases(calDet, int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2), false, &vecPtr);
214+
calDetIter++;
215+
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
216+
makeRadialProfile(calDet, vecPtr.at(0), int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2));
217+
calDetIter++;
195218
}
196219

197220
void ClusterVisualizer::finalize(Trigger t, framework::ServiceRegistryRef)
@@ -203,4 +226,64 @@ void ClusterVisualizer::finalize(Trigger t, framework::ServiceRegistryRef)
203226
}
204227
}
205228

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

Modules/TPC/src/Clusters.cxx

Lines changed: 7 additions & 0 deletions
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);
@@ -113,6 +115,7 @@ void Clusters::processClusterNative(InputRecord& inputs)
113115
}
114116
}
115117
}
118+
mQCClusters.getClusters().endTF();
116119
}
117120

118121
void Clusters::processKrClusters(InputRecord& inputs)
@@ -128,6 +131,7 @@ void Clusters::processKrClusters(InputRecord& inputs)
128131
mQCClusters.getClusters().processCluster(cl, Sector(cl.sector), int(cl.meanRow));
129132
}
130133
}
134+
mQCClusters.getClusters().endTF();
131135
}
132136

133137
void Clusters::monitorData(ProcessingContext& ctx)
@@ -146,12 +150,14 @@ void Clusters::monitorData(ProcessingContext& ctx)
146150
fillCanvases(mQCClusters.getClusters().getSigmaTime(), mSigmaTimeCanvasVec, mCustomParameters, "SigmaPad");
147151
fillCanvases(mQCClusters.getClusters().getSigmaPad(), mSigmaPadCanvasVec, mCustomParameters, "SigmaTime");
148152
fillCanvases(mQCClusters.getClusters().getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin");
153+
fillCanvases(mQCClusters.getClusters().getTimeBin(), mOccupancyCanvasVec, mCustomParameters, "Occupancy");
149154
}
150155
}
151156

152157
void Clusters::endOfCycle()
153158
{
154159
ILOG(Info, Support) << "endOfCycle" << ENDM;
160+
ILOG(Info, Support) << "Processed TFs: " << mQCClusters.getClusters().getProcessedTFs() << ENDM;
155161

156162
if (mIsMergeable) {
157163
mQCClusters.getClusters().normalize();
@@ -178,6 +184,7 @@ void Clusters::reset()
178184
clearCanvases(mSigmaTimeCanvasVec);
179185
clearCanvases(mSigmaPadCanvasVec);
180186
clearCanvases(mTimeBinCanvasVec);
187+
clearCanvases(mOccupancyCanvasVec);
181188
}
182189
}
183190

0 commit comments

Comments
 (0)