Skip to content

Commit ba1b98e

Browse files
author
Bhawani Singh
committed
[WIP] QC:adds histogram for cluster occupancy
2 parents 009b234 + e039c1c commit ba1b98e

File tree

6 files changed

+113
-10
lines changed

6 files changed

+113
-10
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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
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": {
3535
"type": "direct",
36-
"query" : "input:TPC/CLUSTERNATIVE"
36+
"query" : "input:TPC/CLUSTERNATIVE, grpecs:GRP/GRPECS"
3737
},
3838
"taskParameters": {
3939
"mergeableOutput": "true",
@@ -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
@@ -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;
@@ -149,12 +151,25 @@ void ClusterVisualizer::initialize(Trigger, framework::ServiceRegistryRef)
149151
mStoreMaps.size() > 1 ? mStoreMaps.at(calDetIter) : mStoreMaps.at(0));
150152
calDetIter++;
151153
}
154+
if (mIsClusters) {
155+
mCalDetCanvasVec.emplace_back(std::vector<std::unique_ptr<TCanvas>>());
156+
addAndPublish(getObjectsManager(),
157+
mCalDetCanvasVec.back(),
158+
{ "c_radial_profile_Occupancy" },
159+
mStoreMaps.size() > 1 ? mStoreMaps.at(calDetIter) : mStoreMaps.at(0));
160+
}
152161
}
153162

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

167+
for (auto& vec : mCalDetCanvasVec) {
168+
for (auto& canvas : vec) {
169+
canvas.get()->Clear();
170+
}
171+
}
172+
158173
auto calDetIter = 0;
159174

160175
auto clusterData = mCdbApi.retrieveFromTFileAny<ClustersData>(mPath,
@@ -194,6 +209,14 @@ void ClusterVisualizer::update(Trigger t, framework::ServiceRegistryRef)
194209
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
195210
o2::tpc::painter::makeSummaryCanvases(calDet, int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2), false, &vecPtr);
196211
calDetIter++;
212+
213+
calDet = clusters.getOccupancy();
214+
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
215+
o2::tpc::painter::makeSummaryCanvases(calDet, int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2), false, &vecPtr);
216+
calDetIter++;
217+
vecPtr = toVector(mCalDetCanvasVec.at(calDetIter));
218+
makeRadialProfile(calDet, vecPtr.at(0), int(mRanges[calDet.getName()].at(0)), mRanges[calDet.getName()].at(1), mRanges[calDet.getName()].at(2));
219+
calDetIter++;
197220
}
198221

199222
void ClusterVisualizer::finalize(Trigger t, framework::ServiceRegistryRef)
@@ -205,4 +228,64 @@ void ClusterVisualizer::finalize(Trigger t, framework::ServiceRegistryRef)
205228
}
206229
}
207230

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

Modules/TPC/src/Clusters.cxx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "DataFormatsTPC/ClusterNative.h"
2121
#include "TPCBase/Painter.h"
2222
#include "Framework/InputRecordWalker.h"
23+
#include "DataFormatsParameters/GRPECSObject.h"
2324

2425
// QC includes
2526
#include "QualityControl/QcInfoLogger.h"
@@ -73,13 +74,15 @@ void Clusters::initialize(InitContext& /*ctx*/)
7374
mWrapperVector.emplace_back(&mQCClusters.getClusters().getSigmaTime());
7475
mWrapperVector.emplace_back(&mQCClusters.getClusters().getSigmaPad());
7576
mWrapperVector.emplace_back(&mQCClusters.getClusters().getTimeBin());
77+
mWrapperVector.emplace_back(&mQCClusters.getClusters().getOccupancy());
7678

7779
addAndPublish(getObjectsManager(), mNClustersCanvasVec, { "c_Sides_N_Clusters", "c_ROCs_N_Clusters_1D", "c_ROCs_N_Clusters_2D" });
7880
addAndPublish(getObjectsManager(), mQMaxCanvasVec, { "c_Sides_Q_Max", "c_ROCs_Q_Max_1D", "c_ROCs_Q_Max_2D" });
7981
addAndPublish(getObjectsManager(), mQTotCanvasVec, { "c_Sides_Q_Tot", "c_ROCs_Q_Tot_1D", "c_ROCs_Q_Tot_2D" });
8082
addAndPublish(getObjectsManager(), mSigmaTimeCanvasVec, { "c_Sides_Sigma_Time", "c_ROCs_Sigma_Time_1D", "c_ROCs_Sigma_Time_2D" });
8183
addAndPublish(getObjectsManager(), mSigmaPadCanvasVec, { "c_Sides_Sigma_Pad", "c_ROCs_Sigma_Pad_1D", "c_ROCs_Sigma_Pad_2D" });
8284
addAndPublish(getObjectsManager(), mTimeBinCanvasVec, { "c_Sides_Time_Bin", "c_ROCs_Time_Bin_1D", "c_ROCs_Time_Bin_2D" });
85+
addAndPublish(getObjectsManager(), mOccupancyCanvasVec, { "c_Sides_Occupancy", "c_ROCs_Occupancy_1D", "c_ROCs_Occupancy_2D" });
8386

8487
for (auto& wrapper : mWrapperVector) {
8588
getObjectsManager()->startPublishing(&wrapper);
@@ -123,6 +126,7 @@ void Clusters::processClusterNative(InputRecord& inputs)
123126
}
124127
}
125128
}
129+
mQCClusters.getClusters().endTF();
126130
}
127131

128132
void Clusters::processKrClusters(InputRecord& inputs)
@@ -138,30 +142,36 @@ void Clusters::processKrClusters(InputRecord& inputs)
138142
mQCClusters.getClusters().processCluster(cl, Sector(cl.sector), int(cl.meanRow));
139143
}
140144
}
145+
mQCClusters.getClusters().endTF();
141146
}
142147

143148
void Clusters::monitorData(ProcessingContext& ctx)
144149
{
145150
mQCClusters.getClusters().denormalize();
146151

152+
//get grpECS object here
153+
auto const& grpECS = ctx.inputs().get<o2::parameters::GRPECSObject*>("grpecs");
154+
mQCClusters.getClusters().setnHBFperTF(grpECS->getNHBFPerTF());
147155
processClusterNative(ctx.inputs());
148156
processKrClusters(ctx.inputs());
149157

150158
if (!mIsMergeable) {
151-
mQCClusters.getClusters().normalize();
159+
mQCClusters.getClusters().normalize(grpECS->getNHBFPerTF());
152160

153161
fillCanvases(mQCClusters.getClusters().getNClusters(), mNClustersCanvasVec, mCustomParameters, "NClusters");
154162
fillCanvases(mQCClusters.getClusters().getQMax(), mQMaxCanvasVec, mCustomParameters, "Qmax");
155163
fillCanvases(mQCClusters.getClusters().getQTot(), mQTotCanvasVec, mCustomParameters, "Qtot");
156164
fillCanvases(mQCClusters.getClusters().getSigmaTime(), mSigmaTimeCanvasVec, mCustomParameters, "SigmaPad");
157165
fillCanvases(mQCClusters.getClusters().getSigmaPad(), mSigmaPadCanvasVec, mCustomParameters, "SigmaTime");
158166
fillCanvases(mQCClusters.getClusters().getTimeBin(), mTimeBinCanvasVec, mCustomParameters, "TimeBin");
167+
fillCanvases(mQCClusters.getClusters().getTimeBin(), mOccupancyCanvasVec, mCustomParameters, "Occupancy");
159168
}
160169
}
161170

162171
void Clusters::endOfCycle()
163172
{
164-
ILOG(Debug, Devel) << "endOfCycle" << ENDM;
173+
ILOG(Info, Support) << "endOfCycle" << ENDM;
174+
ILOG(Info, Support) << "Processed TFs: " << mQCClusters.getClusters().getProcessedTFs() << ENDM;
165175

166176
if (mIsMergeable) {
167177
mQCClusters.getClusters().normalize();
@@ -188,6 +198,7 @@ void Clusters::reset()
188198
clearCanvases(mSigmaTimeCanvasVec);
189199
clearCanvases(mSigmaPadCanvasVec);
190200
clearCanvases(mTimeBinCanvasVec);
201+
clearCanvases(mOccupancyCanvasVec);
191202
}
192203
}
193204

0 commit comments

Comments
 (0)