ATLAS Offline Software
Loading...
Searching...
No Matches
MMRawDataMonAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
5// Package : MMRawDataMonAlg
6// Authors: M. Biglietti, E. Rossi (Roma Tre)
7//
8// DESCRIPTION:
9// Subject: MM-->Offline Muon Data Quality
11
17
18#include "MMRawDataMonAlg.h"
19
28#include <stdexcept>
29
30
31namespace {
32
33 //1e=1.6X10-4 fC
34 static constexpr double conversion_charge=1.6E-04;
35
36 static const std::array<std::string,2> MM_Side = {"CSide", "ASide"};
37 static const std::array<std::string,2> EtaSector = {"1", "2"};
38
39 struct MMOverviewHistogramStruct {
40 std::vector<int> statEta_strip;
41 std::vector<float> charge_all;
42 std::vector<int> strp_times;
43 std::vector<float> cl_times;
44 std::vector<int> strip_number;
45 std::vector<int> numberofstrips_percluster;
46 std::vector<float> R_mon;
47 std::vector<float> z_mon;
48 std::vector<float> x_mon;
49 std::vector<float> y_mon;
50
51 std::vector<int> stationPhi_ASide_ontrack;
52 std::vector<int> stationPhi_CSide_ontrack;
53 std::vector<int> sector_ASide_ontrack;
54 std::vector<int> sector_CSide_ontrack;
55 std::vector<int> stationPhi_CSide;
56 std::vector<int> stationPhi_ASide;
57 std::vector<int> sector_CSide;
58 std::vector<int> sector_ASide;
59 std::vector<int> stationPhi_ASide_onseg;
60 std::vector<int> stationPhi_CSide_onseg;
61 std::vector<int> sector_ASide_onseg;
62 std::vector<int> sector_CSide_onseg;
63
64 };
65
66 struct MMByPhiStruct {
67 std::vector<int> sector_lb;
68 std::vector<int> sector_lb_ontrack;
69 std::vector<int> sector_lb_onseg;
70 };
71
72 struct MMSummaryHistogramStruct {
73 std::vector<int> cl_size;
74 std::vector<int> pcb;
75 std::vector<int> pcb_strip;
76 std::vector<int> strip_number;
77 std::vector<int> sector_strip;
78 std::vector<float> charge;
79 std::vector<int> strp_times;
80 std::vector<float> cl_times;
81 std::vector<float> x_ontrack;
82 std::vector<float> y_ontrack;
83 std::vector<float> residuals;
84 };
85
86 struct MMEfficiencyHistogramStruct {
87 std::vector<int> num;
88 std::vector<int> nGaps;
89 };
90}
91
93// *********************************************************************
94// Public Methods
95// *********************************************************************
96
97MMRawDataMonAlg::MMRawDataMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) :
98 AthMonitorAlgorithm(name,pSvcLocator)
99{ }
100
101/*---------------------------------------------------------*/
103/*---------------------------------------------------------*/
104{
105 //init message stream
106 ATH_MSG_DEBUG("initialize MMRawDataMonAlg");
107 ATH_MSG_DEBUG("******************");
108 ATH_MSG_DEBUG("doMMESD: " << m_doMMESD );
109 ATH_MSG_DEBUG("******************");
110
112 ATH_CHECK(m_DetectorManagerKey.initialize());
113 ATH_CHECK(m_idHelperSvc.retrieve());
114
115 ATH_MSG_INFO(" Found the MuonIdHelperSvc ");
116 ATH_CHECK(m_muonKey.initialize());
117 ATH_CHECK(m_MMContainerKey.initialize());
118 ATH_CHECK(m_meTrkKey.initialize());
119 ATH_CHECK(m_segm_type.initialize());
120 ATH_CHECK(m_mmtpRdoKey.initialize());
121
122 ATH_MSG_DEBUG(" end of initialize " );
123 ATH_MSG_INFO("MMRawDataMonAlg initialization DONE " );
124
125 return StatusCode::SUCCESS;
126}
127
128StatusCode MMRawDataMonAlg::fillHistograms(const EventContext& ctx) const
129{
130 int lumiblock = -1;
131 lumiblock = GetEventInfo(ctx)->lumiBlock();
132 ATH_MSG_DEBUG("MMRawDataMonAlg::MM RawData Monitoring Histograms being filled" );
133
135 ATH_MSG_DEBUG("****** mmContainer->size() : " << mm_container->size());
136
137 if(m_doMMESD) {
138 MMOverviewHistogramStruct overviewPlots;
139 MMSummaryHistogramStruct summaryPlots[2][16][2][2][4];
140 MMByPhiStruct occupancyPlots[16][2];
141
142 //loop in MMPrepDataContainer
143 for(const Muon::MMPrepDataCollection* coll : *mm_container) {
144 for(const Muon::MMPrepData* prd : *coll) {
145 ATH_CHECK(fillMMOverviewVects(prd, overviewPlots, occupancyPlots));
146 ATH_CHECK(fillMMSummaryVects(prd, summaryPlots));
148 }
149 }
150
151 if(m_do_mm_overview) fillMMOverviewHistograms(overviewPlots, occupancyPlots, lumiblock);
152
153 ATH_CHECK(fillMMSummaryHistograms(summaryPlots));
155 if (!meTPContainer.isValid()) {
156 ATH_MSG_FATAL("Nope. Could not retrieve "<<m_meTrkKey.fullKey());
157 return StatusCode::FAILURE;
158 }
159 clusterFromTrack(meTPContainer.cptr(),lumiblock);
160 MMEfficiency(meTPContainer.cptr());
161
162
163
164 //trigger
166 if (not rdos.isValid()) {
167 ATH_MSG_INFO("NSW MMTP failed. Skipping");
168 // return StatusCode::SUCCESS;
169 } else fillMMTrigger(rdos.cptr(),lumiblock);
170
172
173 if (!segms.isValid()) {
174 ATH_MSG_INFO("evtStore() does not contain MM segms Collection with name " << m_segm_type);
175 // return StatusCode::FAILURE;
176 }else
177 clusterFromSegments(segms.cptr(),lumiblock);
178 }
179
180
181 return StatusCode::SUCCESS;
182}
183
184StatusCode MMRawDataMonAlg::fillMMOverviewVects( const Muon::MMPrepData* prd, MMOverviewHistogramStruct& vects, MMByPhiStruct (&occupancyPlots)[16][2] ) const
185{
186 Identifier Id = prd->identify();
187 const std::vector<Identifier>& stripIds = prd->rdoList();
188 unsigned int nStrips = stripIds.size(); // number of strips in this cluster (cluster size)
189 const std::vector<uint16_t>& stripNumbers = prd->stripNumbers();
190
191 std::string stName = m_idHelperSvc->mmIdHelper().stationNameString(m_idHelperSvc->mmIdHelper().stationName(Id));
192 int gas_gap = m_idHelperSvc->mmIdHelper().gasGap(Id);
193 int stationEta = m_idHelperSvc->mmIdHelper().stationEta(Id);
194 int stationPhi = m_idHelperSvc->mmIdHelper().stationPhi(Id);
195 int multiplet = m_idHelperSvc->mmIdHelper().multilayer(Id);
196 int channel = m_idHelperSvc->mmIdHelper().channel(Id);
197
198 // Returns the charge (number of electrons) converted in fC
199 float charge = prd->charge()*conversion_charge;
200 // Returns the times of each strip (in ns)
201 std::vector<short int> strip_times = prd->stripTimes();
202
203 Amg::Vector3D pos = prd->globalPosition();
204 float R = std::hypot(pos.x(),pos.y());
205
206 // MM gaps are back to back, so the direction of the drift (time) is different for the even and odd gaps -> flip for the even gaps
207
208 vects.charge_all.push_back(charge);
209 vects.numberofstrips_percluster.push_back(nStrips);
210 vects.x_mon.push_back(pos.x());
211 vects.y_mon.push_back(pos.y());
212 vects.z_mon.push_back(pos.z());
213 vects.R_mon.push_back(R);
214
215 // 16 phi sectors, 8 stationPhi times 2 stName, MMS and MML
216 int sectorPhi = get_sectorPhi_from_stationPhi_stName(stationPhi,stName);
217
218 // Occupancy plots with PCB granularity further divided for each eta sector: -2, -1, 1, 2
219 // CSide and ASide
220 int iside = (stationEta>0) ? 1 : 0;
221
222 auto& thisSect = occupancyPlots[sectorPhi-1][iside];
223 const int gap_offset=4;
224 int gas_gap8 = (multiplet==1) ? gas_gap : gas_gap + gap_offset;
225 int FEB = get_FEB_from_channel(channel, stationEta);
226
227 int bin = get_bin_for_feb_occ(gas_gap8,FEB);
228
229 thisSect.sector_lb.push_back(bin);
230
231 if(stationEta<0) {
232 vects.sector_CSide.push_back(bin);
233 vects.stationPhi_CSide.push_back(sectorPhi);
234 } else {
235 vects.sector_ASide.push_back(bin);
236 vects.stationPhi_ASide.push_back(sectorPhi);
237 }
238
239 // loop on each strip
240 int sIdx = 0; // index-counter for the vector of Id's
241 float cluster_time = 0;
242 for(const Identifier& id: stripIds) {
243
244 std::string stName_strip = m_idHelperSvc->mmIdHelper().stationNameString(m_idHelperSvc->mmIdHelper().stationName(id));
245 int stationEta_strip = m_idHelperSvc->mmIdHelper().stationEta(id);
246 vects.statEta_strip.push_back(stationEta_strip);
247 vects.strip_number.push_back(stripNumbers[sIdx]);
248 vects.strp_times.push_back(strip_times.at(sIdx));
249 cluster_time += strip_times.at(sIdx);
250 ++sIdx;
251 }
252 cluster_time /= strip_times.size();
253 vects.cl_times.push_back(cluster_time);
254
255 return StatusCode::SUCCESS;
256}
257
258void MMRawDataMonAlg::fillMMOverviewHistograms( const MMOverviewHistogramStruct& vects, MMByPhiStruct (&occupancyPlots)[16][2], int lb ) const
259{
260 auto charge_all = Monitored::Collection("charge_all", vects.charge_all);
261 auto numberofstrips_percluster = Monitored::Collection("numberofstrips_percluster", vects.numberofstrips_percluster);
262 fill("mmMonitor", charge_all, numberofstrips_percluster);
263
264 auto strip_times = Monitored::Collection("strip_times", vects.strp_times);
265 auto cluster_times = Monitored::Collection("cluster_times", vects.cl_times);
266 auto strip_number = Monitored::Collection("strip_number", vects.strip_number);
267 auto statEta_strip = Monitored::Collection("statEta_strip", vects.statEta_strip);
268 fill("mmMonitor", strip_times, cluster_times, strip_number, statEta_strip);
269
270 auto x_mon = Monitored::Collection("x_mon", vects.x_mon);
271 auto y_mon = Monitored::Collection("y_mon", vects.y_mon);
272 auto z_mon = Monitored::Collection("z_mon", vects.z_mon);
273 auto R_mon = Monitored::Collection("R_mon", vects.R_mon);
274 fill("mmMonitor", x_mon, y_mon, z_mon, R_mon);
275
276 auto lb_mon = Monitored::Scalar<int>("lb_mon", lb);
277
278 for(int statPhi=0; statPhi<16; ++statPhi) {
279 for(int iside=0; iside<2; ++iside) {
280 auto& occ_lb = occupancyPlots[statPhi][iside];
281 auto sector_lb = Monitored::Collection("sector_lb_"+MM_Side[iside]+"_phi"+std::to_string(statPhi+1),occ_lb.sector_lb);
282 std::string MM_sideGroup = "MM_sideGroup" + MM_Side[iside];
283 fill(MM_sideGroup, lb_mon, sector_lb);
284 }
285 }
286 auto sector_CSide = Monitored::Collection("sector_CSide",vects.sector_CSide);
287 auto sector_ASide = Monitored::Collection("sector_ASide",vects.sector_ASide);
288 auto stationPhi_CSide = Monitored::Collection("stationPhi_CSide",vects.stationPhi_CSide);
289 auto stationPhi_ASide = Monitored::Collection("stationPhi_ASide",vects.stationPhi_ASide);
290
291 fill("mmMonitor", sector_CSide, sector_ASide, stationPhi_CSide, stationPhi_ASide );
292}
293
294StatusCode MMRawDataMonAlg::fillMMSummaryVects( const Muon::MMPrepData* prd, MMSummaryHistogramStruct (&vects)[2][16][2][2][4]) const
295{
296 Identifier Id = prd->identify();
297 const std::vector<Identifier>& stripIds = prd->rdoList();
298
299 std::string stName = m_idHelperSvc->mmIdHelper().stationNameString(m_idHelperSvc->mmIdHelper().stationName(Id));
300 int thisStationEta = m_idHelperSvc->mmIdHelper().stationEta(Id);
301 int thisStationPhi = m_idHelperSvc->mmIdHelper().stationPhi(Id);
302 int thisMultiplet = m_idHelperSvc->mmIdHelper().multilayer(Id);
303 int thisGasgap = m_idHelperSvc->mmIdHelper().gasGap(Id);
304 int ch = m_idHelperSvc->mmIdHelper().channel(Id);
305 float thisCharge=prd->charge()*conversion_charge;
306 std::vector<short int> strip_times = prd->stripTimes();
307
308
309 int phi=get_sectorPhi_from_stationPhi_stName(thisStationPhi ,stName);
310
311 // CSide and ASide
312 int iside = (thisStationEta>0) ? 1 : 0;
313
314 // 2 eta sectors depending on Eta=+-1 (0) and +-2 (1)
315 int sectorEta=get_sectorEta_from_stationEta(thisStationEta);
316 unsigned int csize = stripIds.size();
317 int PCB = get_PCB_from_channel(ch);
318 auto& Vectors = vects[iside][phi-1][sectorEta][thisMultiplet-1][thisGasgap-1];
319
320 // loop on strips
321 int sIdx = 0;
322 const std::vector<uint16_t>& stripNumbers=prd->stripNumbers();
323 float cluster_time = 0;
324 for ( const Identifier& id : stripIds) {
325
326 int stationEta = m_idHelperSvc->mmIdHelper().stationEta(id);
327 int gas_gap = m_idHelperSvc->mmIdHelper().gasGap(Id);
328 int multiplet = m_idHelperSvc->mmIdHelper().multilayer(Id);
329 // Filling Vectors for both sides, considering each strip
331 Vectors.strp_times.push_back(strip_times.at(sIdx));
332 cluster_time += strip_times.at(sIdx);
333 }
334 Vectors.strip_number.push_back(stripNumbers[sIdx]);
335 Vectors.pcb_strip.push_back( get_PCB_from_channel(stripNumbers[sIdx]));
336 ++sIdx;
337 if(iside==1) Vectors.sector_strip.push_back(get_bin_for_occ_ASide_hist(stationEta,multiplet,gas_gap));
338 if(iside==0) Vectors.sector_strip.push_back(get_bin_for_occ_CSide_hist(stationEta,multiplet,gas_gap));
339 }
341 Vectors.cl_size.push_back(csize);
342 Vectors.pcb.push_back(PCB);
343 cluster_time /= strip_times.size();
344 Vectors.cl_times.push_back(cluster_time);
345 Vectors.charge.push_back(thisCharge);
346 }
347 return StatusCode::SUCCESS;
348}
349
350StatusCode MMRawDataMonAlg::fillMMSummaryHistograms( const MMSummaryHistogramStruct (&vects)[2][16][2][2][4]) const {
351
352 for(int iside=0; iside<2; ++iside) {
353 std::string MM_sideGroup = "MM_sideGroup" + MM_Side[iside];
354
355
356
357 for(int statPhi=0; statPhi<16; ++statPhi) {
358 for(int multiplet=0; multiplet<2; ++multiplet) {
359
360
361 for(int statEta=0; statEta<2; ++statEta) {
362
363 for(int gas_gap=0; gas_gap<4; ++gas_gap) {
364 auto& Vectors = vects[iside][statPhi][statEta][multiplet][gas_gap];
365 auto sector_strip = Monitored::Collection("sector_strip_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1), Vectors.sector_strip);
366 auto strip_number = Monitored::Collection("strip_number_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1), Vectors.strip_number);
368 if(!Vectors.strip_number.empty())
369 {
370 auto cluster_size = Monitored::Collection("cluster_size_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.cl_size);
371 auto strip_times = Monitored::Collection("strp_time_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.strp_times);
372 auto cluster_time = Monitored::Collection("cluster_time_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.cl_times);
373 auto charge_perPCB = Monitored::Collection("charge_perPCB_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.charge);
374 auto charge_perlayer = Monitored::Collection("charge_perlayer_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.charge);
375 auto cluster_size_perlayer = Monitored::Collection("cluster_size_perlayer_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.cl_size);
376 auto pcb_mon = Monitored::Collection("pcb_mon_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.pcb);
377 auto pcb_strip_mon = Monitored::Collection("pcb_strip_mon_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), Vectors.pcb_strip);
378 fill(MM_sideGroup, cluster_size, strip_times, cluster_time, charge_perPCB, pcb_mon, pcb_strip_mon, charge_perlayer, cluster_size_perlayer);
379 }
380 }
381
382 fill(MM_sideGroup, strip_number, sector_strip);
383 }
384 }
385 }
386 }
387 }
388
389 return StatusCode::SUCCESS;
390}
391
393 return StatusCode::SUCCESS;
394}
395
397
398 auto lb_tri=Monitored::Scalar<int>("lb_tri",lb);
399
400 for (const auto* rdo : *mmtp) {
401 auto sourceID = rdo->sourceID();
402 auto moduleID = rdo->moduleID();
403 int s_side = (sourceID >> 16) == 107 ? 1:-1; // 1 for A; -1 for C
404 auto side = Monitored::Scalar<int>("tri_side", s_side);
405 int iside= s_side>0 ? s_side : 0;
406 uint s_sector = (moduleID & 0xF) + 1; //0-15 --> 1-16
407 int oct = (int)((s_sector-1)/2.);
408 float sector_pos=(45/180.)*M_PI*oct; //large
409 if(s_sector%2==0 ) sector_pos=(45*oct+22.5)*M_PI/180.; //small
410 if(sector_pos>M_PI) sector_pos=sector_pos-2*M_PI;
411
412 auto trig_sector = Monitored::Scalar<int>("trig_sector", s_sector*s_side);
413
414 auto event_bcid=rdo->ROD_BCID();
415
416 auto bcid=Monitored::Scalar<int>("bcid",event_bcid);
417
418 std::vector<short unsigned int> art_bcids = rdo->art_BCID();
419 std::vector<unsigned char> layers=rdo->art_layer();
420 auto channels=rdo->art_channel();
421
422 fill("mmTrigger", trig_sector, lb_tri);
423
424 for (long unsigned int i=0; i< rdo->art_BCID().size(); i++ ){
425 auto art_layer=static_cast<unsigned int>(layers[i]);
426 auto art_channel = Monitored::Scalar<int>("art_channel", channels[i]);
427 auto art_sector_layer = Monitored::Scalar<int>("art_sector_layer", s_side*8*(s_sector-1)+art_layer);
428
429 const int rollover=3564;
430 int art_bc=art_bcids[i];
431 int relative = art_bc - event_bcid;;
432 if (relative > rollover / 2) {
433 relative -= rollover;
434 } else if (relative <= -rollover / 2) {
435 relative += rollover;
436 }
437 if (relative > (rollover-2048) / 2) {
438 relative -= (rollover-2048);
439 }
440 auto art_deltaBC=Monitored::Scalar<int>("art_deltaBC",relative);
441 auto art_deltaBC_perSector=Monitored::Scalar<int>("art_deltaBC_"+MM_Side[iside]+"_s"+std::to_string(s_sector),relative);
442 auto art_bc_mon=Monitored::Scalar<int>("art_bc",art_bc);
443
444 fill("mmTrigger", art_channel, trig_sector, art_sector_layer, art_deltaBC, art_bc_mon, bcid, lb_tri, art_deltaBC_perSector);
445 }
446
447 auto bcids =rdo->trig_BCID();
448 auto dthetas=rdo->trig_dTheta();
449 auto rids=rdo->trig_ROI_rID();
450 auto phiids=rdo->trig_ROI_phiID() ;
451
452
453 std::unordered_map<int, int> NROIPerBC;
454 for (int bc : bcids) NROIPerBC[bc]++;
455 for (const auto& [value, count] : NROIPerBC) {
456 auto nROIPerBC=Monitored::Scalar<int>("nROIPerBC",count);
457 fill("mmTrigger_roi", nROIPerBC, trig_sector);
458 }
459
460 int nROI=rdo->trig_BCID().size();
461 for (int i=0; i< nROI; i++ ){
462 auto phiID = (phiids[i] & 0b11111) * ((phiids[i] >> 5) ? 1 : -1);
463 int sign = phiID > 0 ? 1 : -1;
464 auto phi_conv = (phiID-0.5*sign)*(16./31.)*M_PI/180. + sector_pos;
465 if(phi_conv> M_PI)phi_conv = phi_conv - 2*M_PI;
466
467 const float z_ref=7824.46;
468 const float r_step=(5000-900)/256.;
469 auto rID = static_cast<unsigned int>(rids[i]);
470 float r_conv=r_step*rID+900;
471 float eta_conv=-log(0.5*atan(r_conv/z_ref))*s_side;
472 // auto dTheta=Monitored::Scalar<float>("dTheta_roi",static_cast<float>(dthetas[i]));
473 auto deltaBC= Monitored::Scalar<int>("deltaBC", bcids[i]-event_bcid);
474 auto deltaBC_perSector= Monitored::Scalar<int>("deltaBC_"+MM_Side[iside]+"_s"+std::to_string(s_sector), bcids[i]-event_bcid);
475 auto rid=Monitored::Scalar<int>("rid",rID);
476 auto phiid=Monitored::Scalar<int>("phiid",phiID);
477 auto rid_sector=Monitored::Scalar<int>("rid_"+MM_Side[iside]+"_s"+std::to_string(s_sector),rID);
478 auto phiid_sector=Monitored::Scalar<int>("phiid_"+MM_Side[iside]+"_s"+std::to_string(s_sector),phiID);
479 auto r_roi=Monitored::Scalar<float>("r_roi",r_conv);
480 auto phi_roi=Monitored::Scalar<float>("phi_roi",phi_conv);
481 auto eta_roi=Monitored::Scalar<float>("eta_roi",eta_conv);
482 auto x_roi_sideA=Monitored::Scalar<float>("x_roi_sideA", r_conv*cos(phi_roi));
483 auto y_roi_sideA=Monitored::Scalar<float>("y_roi_sideA", r_conv*sin(phi_roi));
484 auto x_roi_sideC=Monitored::Scalar<float>("x_roi_sideC", r_conv*cos(phi_roi) );
485 auto y_roi_sideC=Monitored::Scalar<float>("y_roi_sideC", r_conv*sin(phi_roi));
486
487 fill("mmTrigger_roi", deltaBC, phiid, rid, trig_sector, phi_roi, eta_roi,r_roi, lb_tri, rid_sector, phiid_sector, deltaBC_perSector);
488 if(s_side>0) fill("mmTrigger_roi", x_roi_sideA, y_roi_sideA);
489 if(s_side<0) fill("mmTrigger_roi", x_roi_sideC, y_roi_sideC);
490
491 }
492 }
493
494}
495
497{
498 MMSummaryHistogramStruct summaryPlots[2][2][4]; // side, multilayer, gas gap
499 MMSummaryHistogramStruct summaryPlots_full[2][16][2][2][4]; // side, phi, eta, multilayer, gas gap
500 MMSummaryHistogramStruct sumPlots[2][16][2][2][4]; // side, phi, eta, multilayer, gas gap
501 MMOverviewHistogramStruct overviewPlots;
502 MMByPhiStruct occupancyPlots[16][2]; // sector, side
503 int ntrk=0;
504 for(const xAOD::TrackParticle* meTP : *muonContainer) {
505
506 if(!meTP) continue;
507 auto eta_trk = Monitored::Scalar<float>("eta_trk", meTP->eta());
508 auto phi_trk = Monitored::Scalar<float>("phi_trk", meTP->phi());
509 auto pt_trk = Monitored::Scalar<float>("pt_trk", meTP->pt()/1000.);
510
511 //retrieve the original track
512 const Trk::Track* meTrack = meTP->track();
513
514 if(!meTrack) continue;
515
516 // get the vector of measurements on track
518 bool isMM=false;
519 for(const Trk::MeasurementBase* it : *meas) {
520 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(it);
521 if(!rot) continue;
522 Identifier rot_id = rot->identify();
523 if(!m_idHelperSvc->isMM(rot_id)) continue;
524 isMM=true;
525 const Muon::MMClusterOnTrack* cluster = dynamic_cast<const Muon::MMClusterOnTrack*>(rot);
526 if(!cluster) continue;
527
528 std::string stName = m_idHelperSvc->mmIdHelper().stationNameString(m_idHelperSvc->mmIdHelper().stationName(rot_id));
529 int stEta = m_idHelperSvc->mmIdHelper().stationEta(rot_id);
530 int stPhi = m_idHelperSvc->mmIdHelper().stationPhi(rot_id);
531 int multi = m_idHelperSvc->mmIdHelper().multilayer(rot_id);
532 int gap = m_idHelperSvc->mmIdHelper().gasGap(rot_id);
533 int ch = m_idHelperSvc->mmIdHelper().channel(rot_id);
534
535 // MMS and MML phi sectors
536 // int phisec = (stNumber%2==0) ? 1 : 0;
537 int sectorPhi = get_sectorPhi_from_stationPhi_stName(stPhi,stName); // 1->16
538 int PCB = get_PCB_from_channel(ch);
539 int iside = (stEta > 0) ? 1 : 0;
540 auto& vects = overviewPlots;
541 auto& thisSect = occupancyPlots[sectorPhi-1][iside];
542
543
544 const Muon::MMPrepData* prd = cluster->prepRawData();
545 const std::vector<Identifier>& stripIds = prd->rdoList();
546 unsigned int csize = stripIds.size();
547 const std::vector<uint16_t>& stripNumbers = prd->stripNumbers();
548 float charge = prd->charge()*conversion_charge;
549 std::vector<short int> s_times = prd->stripTimes();
550
551 vects.charge_all.push_back(charge);
552
553 float c_time = 0;
554 for(unsigned int sIdx=0; sIdx<stripIds.size(); ++sIdx){
555 vects.strp_times.push_back(s_times.at(sIdx));
556 c_time += s_times.at(sIdx);
557 }
558 c_time /= s_times.size();
559 vects.cl_times.push_back(c_time);
560
562 auto& vect = sumPlots[iside][sectorPhi-1][std::abs(stEta)-1][multi-1][gap-1];
563 vect.cl_size.push_back(csize);
564 vect.pcb.push_back(PCB);
565 for(unsigned int sIdx=0; sIdx<stripIds.size(); ++sIdx)
566 {
567 vect.strip_number.push_back(stripNumbers[sIdx]);
568 vect.strp_times.push_back(s_times.at(sIdx));
569 vect.pcb_strip.push_back(get_PCB_from_channel(stripNumbers[sIdx]));
570 }
571 vect.cl_times.push_back(c_time);
572 vect.charge.push_back(charge);
573 }
574
575
576 const int gap_offset=4;
577 int gas_gap8 = (multi==1) ? gap : gap + gap_offset;
578
579 int FEB = get_FEB_from_channel(ch, stEta);
580 int bin = get_bin_for_feb_occ(gas_gap8,FEB);
581 thisSect.sector_lb_ontrack.push_back(bin);
582 // Occupancy plots with FEB granularity further divided for each eta sector: -2, -1, 1, 2
583 // Filling Vectors for stationEta=-1 - cluster on track
584 if(stEta<0) {
585 vects.sector_CSide_ontrack.push_back(bin);
586 vects.stationPhi_CSide_ontrack.push_back(sectorPhi);
587 } else {
588 vects.sector_ASide_ontrack.push_back(bin);
589 vects.stationPhi_ASide_ontrack.push_back(sectorPhi);
590 }
591
592 float x = cluster->localParameters()[Trk::loc1];
593 for(const Trk::TrackStateOnSurface* trkState : *meTrack->trackStateOnSurfaces()) {
594
595 if(!(trkState)) continue;
596 if (!trkState->type(Trk::TrackStateOnSurface::Measurement)) continue;
597
598 Identifier surfaceId = (trkState)->surface().associatedDetectorElementIdentifier();
599 if(!m_idHelperSvc->isMM(surfaceId)) continue;
600
601 int trk_stEta = m_idHelperSvc->mmIdHelper().stationEta(surfaceId);
602 int trk_stPhi = m_idHelperSvc->mmIdHelper().stationPhi(surfaceId);
603 int trk_multi = m_idHelperSvc->mmIdHelper().multilayer(surfaceId);
604 int trk_gap = m_idHelperSvc->mmIdHelper().gasGap(surfaceId);
605
606 if( (trk_stPhi == stPhi) && (trk_stEta == stEta) && (trk_multi == multi) && (trk_gap == gap)) {
607 double x_trk = trkState->trackParameters()->parameters()[Trk::loc1];
608 int sectorPhi = get_sectorPhi_from_stationPhi_stName(trk_stPhi,stName); // 1->16
609 int side = (stEta > 0) ? 1 : 0;
610 float res_stereo = (x - x_trk);
612 float stereo_angle = ((multi == 1 && gap < 3) || (multi == 2 && gap > 2)) ? 0 : 0.02618;
613 double y_trk = trkState->trackParameters()->parameters()[Trk::locY];
614 float stereo_correction = ( (multi == 1 && gap < 3) || (multi == 2 && gap > 2) ) ? 0 : ( ((multi == 1 && gap == 3) || (multi == 2 && gap ==1 )) ? (-std::sin(stereo_angle)*y_trk) : std::sin(stereo_angle)*y_trk );
615 res_stereo = (x - x_trk)*std::cos(stereo_angle) - stereo_correction;
616 }
617 auto residual_mon = Monitored::Scalar<float>("residual", res_stereo);
618 auto stPhi_mon = Monitored::Scalar<float>("stPhi_mon",sectorPhi);
619
620 fill("mmMonitor", residual_mon, eta_trk, phi_trk, stPhi_mon);
621 int abs_stEta = get_sectorEta_from_stationEta(stEta); // 0 or 1
622
624 auto& vectors = summaryPlots_full[side][sectorPhi-1][abs_stEta][multi-1][gap-1];
625 vectors.residuals.push_back(res_stereo);
626 }
627 }
628 }//TrackStates
629
630 } // loop on meas
631 if(isMM) {
632 ++ntrk;
633 fill("mmMonitor", pt_trk);
634 }
635
637 for(int iside = 0; iside < 2; ++iside) {
638 std::string MM_sideGroup = "MM_sideGroup" + MM_Side[iside];
639 for(int statPhi = 0; statPhi < 16; ++statPhi) {
640 // for(int statEta = 0; statEta < 2; ++statEta) {
641 for(int multiplet = 0; multiplet < 2; ++multiplet) {
642 for(int gas_gap = 0; gas_gap < 4; ++gas_gap) {
643 auto layer=gas_gap+multiplet*4;
644 MMSummaryHistogramStruct vects;
645 for(int statEta = 0; statEta < 2; ++statEta) {
646 vects = summaryPlots_full[iside][statPhi][statEta][multiplet][gas_gap];
647 auto residuals_gap = Monitored::Collection("residuals_"+MM_Side[iside]+"_phi"+std::to_string(statPhi+1)+"_stationEta"+EtaSector[statEta]+"_multiplet"+std::to_string(multiplet+1)+"_gas_gap"+std::to_string(gas_gap+1),vects.residuals);
648 auto residuals_layer = Monitored::Collection("residuals_"+MM_Side[iside]+"_phi"+std::to_string(statPhi+1)+"_layer"+std::to_string(layer+1),vects.residuals);
649
650 fill(MM_sideGroup, residuals_gap,residuals_layer);
651 }
652 }
653 }
654 }
655 }
656 }
657
658 for(const Trk::TrackStateOnSurface* trkState : *meTrack->trackStateOnSurfaces()) {
659 if(!(trkState)) continue;
660 if (!trkState->type(Trk::TrackStateOnSurface::Measurement)) continue;
661 Identifier surfaceId = (trkState)->surface().associatedDetectorElementIdentifier();
662 if(!m_idHelperSvc->isMM(surfaceId)) continue;
663
664 const Trk::MeasurementBase* meas = trkState->measurementOnTrack() ;
665 if(!meas) continue;
666
667 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(meas);
668 if(!rot) continue;
669 Identifier rot_id = rot->identify();
670 if(!m_idHelperSvc->isMM(rot_id)) continue;
671
672 const Amg::Vector3D& pos = (trkState)->trackParameters()->position();
673 int stEta = m_idHelperSvc->mmIdHelper().stationEta(surfaceId);
674 int multi = m_idHelperSvc->mmIdHelper().multilayer(surfaceId);
675 int gap = m_idHelperSvc->mmIdHelper().gasGap(surfaceId);
676
677 // CSide and ASide
678 int iside = (stEta > 0) ? 1 : 0;
679 auto& Vectors = summaryPlots[iside][multi-1][gap-1];
680
681 // Filling x-y position vectors using the trackStateonSurface
682 Vectors.x_ontrack.push_back(pos.x());
683 Vectors.y_ontrack.push_back(pos.y());
684 }
685 } // loop on muonContainer
686
687 auto ntrack = Monitored::Scalar<int>("ntrk",ntrk);
688 fill("mmMonitor", ntrack);
689
690 auto& vects = overviewPlots;
691 auto stationPhi_CSide_ontrack = Monitored::Collection("stationPhi_CSide_ontrack",vects.stationPhi_CSide_ontrack);
692 auto stationPhi_ASide_ontrack = Monitored::Collection("stationPhi_ASide_ontrack",vects.stationPhi_ASide_ontrack);
693 auto sector_ASide_ontrack = Monitored::Collection("sector_ASide_ontrack",vects.sector_ASide_ontrack);
694 auto sector_CSide_ontrack = Monitored::Collection("sector_CSide_ontrack",vects.sector_CSide_ontrack);
695
696 auto lb_ontrack = Monitored::Scalar<int>("lb_ontrack", lb);
697 auto csize = Monitored::Collection("nstrips_ontrack", vects.numberofstrips_percluster);
698 auto charge = Monitored::Collection("charge_ontrack", vects.charge_all);
699 auto stime = Monitored::Collection("strip_time_on_track", vects.strp_times);
700 auto ctime = Monitored::Collection("cluster_time_on_track", vects.cl_times);
701
702 fill("mmMonitor", csize, charge, stime, ctime, stationPhi_CSide_ontrack, stationPhi_ASide_ontrack, sector_CSide_ontrack,sector_ASide_ontrack, lb_ontrack);
703
704 for(int iside = 0; iside < 2; ++iside) {
705 std::string MM_sideGroup = "MM_sideGroup" + MM_Side[iside];
706 for(int statPhi = 0; statPhi < 16; ++statPhi) {
707 for(int statEta = 0; statEta < 2; ++statEta) {
708 for(int multiplet = 0; multiplet < 2; ++multiplet) {
709 for(int gas_gap = 0; gas_gap < 4; ++gas_gap) {
710 auto& vects = sumPlots[iside][statPhi][statEta][multiplet][gas_gap];
712 if(!vects.strip_number.empty())
713 {
714 auto clus_size = Monitored::Collection("cluster_size_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.cl_size);
715 auto strip_times = Monitored::Collection("strp_time_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.strp_times);
716 auto cluster_time = Monitored::Collection("cluster_time_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.cl_times);
717 auto charge_perPCB = Monitored::Collection("charge_perPCB_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.charge);
718 auto charge_perlayer = Monitored::Collection("charge_perlayer_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.charge);
719 auto clus_size_perlayer = Monitored::Collection("cluster_size_perlayer_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.cl_size);
720 auto pcb_mon = Monitored::Collection("pcb_mon_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.pcb);
721 auto pcb_strip_mon = Monitored::Collection("pcb_strip_mon_ontrack_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), vects.pcb_strip);
722
723 fill(MM_sideGroup, clus_size, strip_times, cluster_time, charge_perPCB, pcb_mon, pcb_strip_mon,charge_perlayer,clus_size_perlayer);
724 }
725 }
726
727 }
728 }
729 }
730 auto& occ_lb = occupancyPlots[statPhi][iside];
731 auto sector_lb_ontrack = Monitored::Collection("sector_lb_"+MM_Side[iside]+"_phi"+std::to_string(statPhi+1)+"_ontrack",occ_lb.sector_lb_ontrack);
732 fill(MM_sideGroup, lb_ontrack, sector_lb_ontrack);
733 }
734 for(int multiplet=0; multiplet<2; ++multiplet) {
735 for(int gas_gap=0; gas_gap<4; ++gas_gap) {
736 auto& Vectors = summaryPlots[iside][multiplet][gas_gap];
737 auto x_ontrack = Monitored::Collection("x_"+MM_Side[iside]+"_multiplet"+std::to_string(multiplet+1)+"_gas_gap_"+std::to_string(gas_gap+1)+"_ontrack", Vectors.x_ontrack);
738 auto y_ontrack = Monitored::Collection("y_"+MM_Side[iside]+"_multiplet"+std::to_string(multiplet+1)+"_gas_gap_"+std::to_string(gas_gap+1)+"_ontrack", Vectors.y_ontrack);
739 fill(MM_sideGroup, x_ontrack, y_ontrack);
740 }
741 }
742 }
743
744}
745
747{
748 MMEfficiencyHistogramStruct effPlots[2][2][16][2][4];
749 MMEfficiencyHistogramStruct Gaps[2][2][16][2];
750
751 static const std::array<std::string,2> MM_Side = {"CSide", "ASide"};
752 static const std::array<std::string,2> EtaSector = {"1","2"};
753
754 for (const xAOD::TrackParticle* meTP : *muonContainer) {
755 if (!meTP) continue;
756 auto eta_trk = Monitored::Scalar<float>("eta_trk", meTP->eta());
757 auto phi_trk = Monitored::Scalar<float>("phi_trk", meTP->phi());
758
759 float pt_trk = meTP->pt();
760 if(pt_trk < m_cut_pt) continue;
761 // retrieve the original track
762 const Trk::Track* meTrack = meTP->track();
763 if(!meTrack) continue;
764 // get the vector of measurements on track
766
767 for(const Trk::MeasurementBase* it: *meas) {
768 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(it);
769 if (!rot) continue;
770 Identifier rot_id = rot->identify();
771 if (!m_idHelperSvc->isMM(rot_id)) continue;
772
773 const Muon::MMClusterOnTrack* cluster = dynamic_cast<const Muon::MMClusterOnTrack*>(rot);
774 if (!cluster) continue;
775 std::string stName = m_idHelperSvc->mmIdHelper().stationNameString(m_idHelperSvc->mmIdHelper().stationName(rot_id));
776 int stEta= m_idHelperSvc->mmIdHelper().stationEta(rot_id);
777 int stPhi= m_idHelperSvc->mmIdHelper().stationPhi(rot_id);
778 int phi = get_sectorPhi_from_stationPhi_stName(stPhi,stName);
779 int multi = m_idHelperSvc->mmIdHelper().multilayer(rot_id);
780 int gap= m_idHelperSvc->mmIdHelper().gasGap(rot_id);
781 int ch= m_idHelperSvc->mmIdHelper().channel(rot_id);
782 int pcb=get_PCB_from_channel(ch);
783 int abs_stEta= get_sectorEta_from_stationEta(stEta);
784 int iside = (stEta > 0) ? 1 : 0;
785 if( ! (std::find( Gaps[iside][abs_stEta][phi-1][multi-1].nGaps.begin(), Gaps[iside][abs_stEta][phi-1][multi-1].nGaps.end(), gap ) != Gaps[iside][abs_stEta][phi-1][multi-1].nGaps.end()) )
786 Gaps[iside][abs_stEta][phi-1][multi-1].nGaps.push_back(gap);
787 //numerator
788 if(effPlots[iside][abs_stEta][phi-1][multi-1][gap-1].num.size()==0) effPlots[iside][abs_stEta][phi-1][multi-1][gap-1].num.push_back(pcb-1);
789 }
790 } // loop on tracks
791
792 unsigned int nGaptag=3;
793
794 for(int s=0; s<2; ++s) {
795 std::string MM_sideGroup = "MM_sideGroup"+MM_Side[s];
796 for(int e=0; e<2; ++e) {
797 for(int p=0; p<16; ++p) {
798 for(int m=0; m<2; ++m) {
799 if(Gaps[s][e][p][m].nGaps.size()<nGaptag) continue;
800 if(Gaps[s][e][p][m].nGaps.size()>4) continue;
801 //find the missing gap
802 int gapsum=0;
803 for (unsigned int g=0; g<Gaps[s][e][p][m].nGaps.size(); ++g)
804 gapsum+= Gaps[s][e][p][m].nGaps.at(g);
805 int missing_gap=10-gapsum-1;
806 //if missing gap = -1 --> nGaps=4 --> all efficient
807 if(Gaps[s][e][p][m].nGaps.size()==4){
808 for (unsigned int ga=0; ga<Gaps[s][e][p][m].nGaps.size(); ++ga){
809 for (unsigned int i=0; i<effPlots[s][e][p][m][ga].num.size(); ++i){
810 int pcb = effPlots[s][e][p][m][ga].num.at(i);
811 auto traversed_pcb = Monitored::Scalar<int>("pcb_eta"+std::to_string(e+1)+"_"+MM_Side[s]+"_phi"+std::to_string(p)+"_multiplet"+std::to_string(m+1)+"_gas_gap"+std::to_string(ga+1),pcb);
812 int layer=ga+4*m+8*p;
813
814 auto traversed_gap = Monitored::Scalar<int>(MM_Side[s]+"_eta"+std::to_string(e+1),layer);
815 auto isHit = 1;
816 auto hitcut = Monitored::Scalar<int>("hitcut", (int)isHit);
817 fill(MM_sideGroup, traversed_pcb, traversed_gap, hitcut);
818 }
819 }
820 } else {// 3 gaps, the fourth is inefficient
821 int ref_gap = missing_gap+1;
822 if(missing_gap==3) ref_gap=0;
823 if (ref_gap>3){
824 ATH_MSG_FATAL("ref_gap is out of range in MMRawDataMonAlg::MMEfficiency");
825 return;
826 }
827 int ref_pcb=effPlots[s][e][p][m][ref_gap].num.at(0);
828 auto traversed_pcb = Monitored::Scalar<int>("pcb_eta"+std::to_string(e+1)+"_"+MM_Side[s]+"_phi"+std::to_string(p)+"_multiplet"+std::to_string(m+1)+"_gas_gap"+std::to_string(missing_gap+1), ref_pcb);
829 int layer=missing_gap+4*m+8*p;
830 auto traversed_gap = Monitored::Scalar<int>(MM_Side[s]+"_eta"+std::to_string(e+1),layer);
831 auto isHit = 0;
832 auto hitcut = Monitored::Scalar<int>("hitcut", (int)isHit);
833 fill(MM_sideGroup, traversed_pcb, traversed_gap, hitcut);
834 }
835
836
837 }
838 }
839 }
840 }
841}
842
843
845{
846 MMOverviewHistogramStruct overviewPlots;
847 MMByPhiStruct occupancyPlots[16][2];
848 MMSummaryHistogramStruct summaryPlots[2][16][2][2][4];
849 int nseg=0;
850
851 for (Trk::SegmentCollection::const_iterator s = segms->begin(); s != segms->end(); ++s) {
852 const Muon::MuonSegment* segment = dynamic_cast<const Muon::MuonSegment*>(*s);
853 if (segment == nullptr) {
854 ATH_MSG_DEBUG("no pointer to segment!!!");
855 break;
856 }
857 bool isMM=false;
858 for(unsigned int irot=0;irot<segment->numberOfContainedROTs();irot++){
859 const Trk::RIO_OnTrack* rot = segment->rioOnTrack(irot);
860 if(!rot) continue;
861 Identifier rot_id = rot->identify();
862 if(!m_idHelperSvc->isMM(rot_id)) continue;
863 isMM=true;
864 const Muon::MMClusterOnTrack* cluster = dynamic_cast<const Muon::MMClusterOnTrack*>(rot);
865 if(!cluster) continue;
866
867 std::string stName = m_idHelperSvc->mmIdHelper().stationNameString(m_idHelperSvc->mmIdHelper().stationName(rot_id));
868 int stEta = m_idHelperSvc->mmIdHelper().stationEta(rot_id);
869 int stPhi = m_idHelperSvc->mmIdHelper().stationPhi(rot_id);
870 int multi = m_idHelperSvc->mmIdHelper().multilayer(rot_id);
871 int gap = m_idHelperSvc->mmIdHelper().gasGap(rot_id);
872 int ch = m_idHelperSvc->mmIdHelper().channel(rot_id);
873
874 // MMS and MML phi sectors
875 int sectorPhi = get_sectorPhi_from_stationPhi_stName(stPhi,stName);
876 int PCB = get_PCB_from_channel(ch);
877 int iside = (stEta > 0) ? 1 : 0;
878
879 const Muon::MMPrepData* prd = cluster->prepRawData();
880 const std::vector<Identifier>& stripIds = prd->rdoList();
881 unsigned int csize = stripIds.size();
882 const std::vector<uint16_t>& stripNumbers = prd->stripNumbers();
883
884 auto& pcb_vects = summaryPlots[iside][sectorPhi-1][std::abs(stEta)-1][multi-1][gap-1];
885 pcb_vects.cl_size.push_back(csize);
886 pcb_vects.pcb.push_back(PCB);
887 std::vector<short int> s_times = prd->stripTimes();
888 float c_time = 0;
889 for(unsigned int sIdx=0; sIdx<csize; ++sIdx) {
890 pcb_vects.strp_times.push_back(s_times.at(sIdx));
891 pcb_vects.pcb_strip.push_back( get_PCB_from_channel(stripNumbers[sIdx]));
892 c_time += s_times.at(sIdx);
893 }
894 c_time /= s_times.size();
895 pcb_vects.cl_times.push_back(c_time);
896
897 float charge = prd->charge()*conversion_charge;
898 pcb_vects.charge.push_back(charge);
899
900 auto& vects = overviewPlots;
901
902 auto& thisSect = occupancyPlots[sectorPhi-1][iside];
903
904 const int gap_offset=4;
905 int gas_gap8 = (multi==1) ? gap : gap + gap_offset;
906 int FEB = get_FEB_from_channel(ch, stEta);
907
908 int bin=get_bin_for_feb_occ(gas_gap8,FEB);
909 thisSect.sector_lb_onseg.push_back(bin);
910
911 if(stEta<0) {
912 vects.sector_CSide_onseg.push_back(bin);
913 vects.stationPhi_CSide_onseg.push_back(sectorPhi);
914 } else {
915 vects.sector_ASide_onseg.push_back(bin);
916 vects.stationPhi_ASide_onseg.push_back(sectorPhi);
917 }
918
919 } // loop on ROT container
920 if (isMM==true) ++nseg;
921
922 } // loop on segment collection
923 auto nsegs = Monitored::Scalar<int>("nseg",nseg);
924 fill("mmMonitor", nsegs);
925
926 auto& vects = overviewPlots;
927 auto stationPhi_CSide_onseg = Monitored::Collection("stationPhi_CSide_onseg",vects.stationPhi_CSide_onseg);
928 auto stationPhi_ASide_onseg = Monitored::Collection("stationPhi_ASide_onseg",vects.stationPhi_ASide_onseg);
929 auto sector_ASide_onseg = Monitored::Collection("sector_ASide_onseg",vects.sector_ASide_onseg);
930 auto sector_CSide_onseg = Monitored::Collection("sector_CSide_onseg",vects.sector_CSide_onseg);
931
932 auto lb_onseg = Monitored::Scalar<int>("lb_onseg", lb);
933
934 fill("mmMonitor", stationPhi_CSide_onseg, stationPhi_ASide_onseg, sector_CSide_onseg, sector_ASide_onseg, lb_onseg);
935
936 for(int iside = 0; iside < 2; ++iside) {
937 std::string MM_sideGroup = "MM_sideGroup" + MM_Side[iside];
938 for(int statPhi=0; statPhi<16; ++statPhi) {
939 auto& occ_lb = occupancyPlots[statPhi][iside];
940 auto sector_lb_onseg = Monitored::Collection("sector_lb_"+MM_Side[iside]+"_phi"+std::to_string(statPhi+1)+"_onseg",occ_lb.sector_lb_onseg);
941 fill(MM_sideGroup, lb_onseg, sector_lb_onseg);
942
943 for(int statEta = 0; statEta < 2; ++statEta) {
944 for(int multiplet = 0; multiplet < 2; ++multiplet) {
945 for(int gas_gap = 0; gas_gap < 4; ++gas_gap) {
946 auto& pcb_vects = summaryPlots[iside][statPhi][statEta][multiplet][gas_gap];
947
948 if(pcb_vects.pcb.empty()) continue;
950 auto pcb_mon = Monitored::Collection("pcb_mon_onseg_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), pcb_vects.pcb);
951 auto pcb_strip_mon = Monitored::Collection("pcb_strip_mon_onseg_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), pcb_vects.pcb_strip);
952 auto strip_times = Monitored::Collection("strp_time_onseg_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), pcb_vects.strp_times);
953 auto cluster_time = Monitored::Collection("cluster_time_onseg_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), pcb_vects.cl_times);
954 auto clus_size = Monitored::Collection("cluster_size_onseg_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), pcb_vects.cl_size);
955 auto charge_perPCB = Monitored::Collection("charge_perPCB_onseg_" + MM_Side[iside] + "_phi" + std::to_string(statPhi+1) + "_eta" + std::to_string(statEta+1) + "_ml" + std::to_string(multiplet+1) + "_gap" + std::to_string(gas_gap+1), pcb_vects.charge);
956
957 fill(MM_sideGroup, clus_size, strip_times, charge_perPCB, cluster_time, pcb_mon, pcb_strip_mon);
958 }
959 auto clus_size_all = Monitored::Collection("cluster_size_onseg", pcb_vects.cl_size);
960 auto charge_all = Monitored::Collection("charge_onseg", pcb_vects.charge);
961 auto strip_times_all = Monitored::Collection("strp_time_onseg", pcb_vects.strp_times);
962 fill("mmMonitor", clus_size_all, charge_all, strip_times_all);
963 }
964 }
965 }
966 }
967 }
968}
#define M_PI
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:1003
unsigned int uint
size_t size() const
Number of registered mappings.
int sign(int a)
xAOD::MuonContainer * muonContainer
#define x
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.).
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
void clusterFromTrack(const xAOD::TrackParticleContainer *, const int lb) const
int get_bin_for_occ_ASide_hist(const int stationEta, const int multiplet, const int gas_gap) const
void MMEfficiency(const xAOD::TrackParticleContainer *) const
int get_FEB_from_channel(const int channel, const int stEta) const
int get_bin_for_occ_CSide_hist(const int stationEta, const int multiplet, const int gas_gap) const
SG::ReadHandleKey< xAOD::NSWMMTPRDOContainer > m_mmtpRdoKey
void fillMMOverviewHistograms(const MMOverviewHistogramStruct &vects, MMByPhiStruct(&occupancyPlots)[16][2], const int lb) const
Gaudi::Property< bool > m_doMMESD
SG::ReadHandleKey< Muon::MMPrepDataContainer > m_MMContainerKey
MMRawDataMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode fillMMSummaryVects(const Muon::MMPrepData *, MMSummaryHistogramStruct(&vects)[2][16][2][2][4]) const
StatusCode fillMMHistograms(const Muon::MMPrepData *) const
int get_sectorEta_from_stationEta(const int stationEta) const
StatusCode fillMMOverviewVects(const Muon::MMPrepData *, MMOverviewHistogramStruct &vects, MMByPhiStruct(&occupancyPlots)[16][2]) const
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
int get_sectorPhi_from_stationPhi_stName(const int stationPhi, const std::string &stName) const
SG::ReadHandleKey< xAOD::MuonContainer > m_muonKey
Gaudi::Property< float > m_cut_pt
virtual StatusCode initialize() override
initialize
SG::ReadHandleKey< Trk::SegmentCollection > m_segm_type
int get_bin_for_feb_occ(const int gas_gap, const int FEB) const
Gaudi::Property< bool > m_do_stereoCorrection
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_DetectorManagerKey
void fillMMTrigger(const xAOD::NSWMMTPRDOContainer *, const int) const
StatusCode fillMMSummaryHistograms(const MMSummaryHistogramStruct(&vects)[2][16][2][2][4]) const
Gaudi::Property< bool > m_do_mm_overview
int get_PCB_from_channel(const int channel) const
void clusterFromSegments(const Trk::SegmentCollection *, const int lb) const
Gaudi::Property< bool > m_doDetailedHists
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_meTrkKey
Declare a monitored scalar variable.
Class to represent calibrated clusters formed from TGC strips.
virtual const MMPrepData * prepRawData() const
Returns the MMPrepData - is a TRT_DriftCircle in this scope.
Class to represent MM measurements.
Definition MMPrepData.h:22
const std::vector< uint16_t > & stripNumbers() const
returns the list of strip numbers
Definition MMPrepData.h:247
const std::vector< short int > & stripTimes() const
returns the list of times
Definition MMPrepData.h:252
virtual const Amg::Vector3D & globalPosition() const override final
Returns the global position.
Definition MMPrepData.h:211
int charge() const
Returns the AD.
Definition MMPrepData.h:227
This is the common class for 3D segments used in the muon spectrometer.
const Trk::RIO_OnTrack * rioOnTrack(unsigned int) const
returns the RIO_OnTrack (also known as ROT) objects depending on the integer
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
This class is the pure abstract base class for all fittable tracking measurements.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
Identifier identify() const
return the identifier
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
Identifier identify() const
return the identifier -extends MeasurementBase
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
std::string stime()
return the current data and time
int lb
Definition globals.cxx:23
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:148
Eigen::Matrix< double, 3, 1 > Vector3D
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
MuonPrepDataCollection< MMPrepData > MMPrepDataCollection
DataVector< Trk::Segment > SegmentCollection
@ locY
local cartesian
Definition ParamDefs.h:38
@ loc1
Definition ParamDefs.h:34
TrackParticle_v1 TrackParticle
Reference the current persistent version:
NSWMMTPRDOContainer_v1 NSWMMTPRDOContainer
Define the version of the NSW MM RDO container.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".