@@ -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
152161void 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
197220void 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
0 commit comments