@@ -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
158167void 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
204227void 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
0 commit comments