@@ -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
154163void 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
199222void 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
0 commit comments