ATLAS Offline Software
Loading...
Searching...
No Matches
StgcRawDataMonAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6// Package : sTgcRawDataMonAlg
7// Author: Sebastian Fuenzalida Garrido
8// Local supervisor: Edson Carquin Lopez
9// Technical supervisor: Gerardo Vasquez
10//
11// DESCRIPTION:
12// Subject: sTgc --> sTgc raw data monitoring
14
16
18// *********************************************************************
19// Public Methods
20// *********************************************************************
22
23sTgcRawDataMonAlg::sTgcRawDataMonAlg(const std::string& name, ISvcLocator* pSvcLocator) : AthMonitorAlgorithm(name, pSvcLocator) {
24 //Declare the property
25}
26
29 ATH_CHECK(m_idHelperSvc.retrieve());
30 ATH_CHECK(m_sTgcContainerKey.initialize());
31 ATH_CHECK(m_detectorManagerKey.initialize());
32 ATH_CHECK(m_meTrkKey.initialize());
34 ATH_CHECK(m_muonKey.initialize());
36
37 return StatusCode::SUCCESS;
38}
39
40StatusCode sTgcRawDataMonAlg::fillHistograms(const EventContext& ctx) const {
41 const int lumiblock = GetEventInfo(ctx) -> lumiBlock();
42
47
48 if (!meTPContainer.isValid()) {
49 ATH_MSG_FATAL("Could not get track particle container: " << m_meTrkKey.fullKey());
50 return StatusCode::FAILURE;
51 }
52
53 if (!muonContainer.isValid()) {
54 ATH_MSG_FATAL("Could not get muon container: " << m_muonKey.fullKey());
55 return StatusCode::FAILURE;
56 }
57
58 if(!m_rdoKey.key().empty()){
60 if (!NSWpadTriggerContainer.isValid()) {
61 ATH_MSG_FATAL("Could not get pad trigger data container: " << m_rdoKey.fullKey());
62 return StatusCode::FAILURE;
63 }
64 fillsTgcPadTriggerDataHistograms(muonContainer.cptr(), NSWpadTriggerContainer.cptr(), lumiblock);
65 fillsTgcPadTriggerEfficiencyHistograms(muonContainer.cptr(), NSWpadTriggerContainer.cptr(), detectorManagerKey.cptr());
66 }
67
68 ATH_MSG_DEBUG("Lumiblock: " << lumiblock);
69
71 fillsTgcEfficiencyHistograms(muonContainer.cptr(), detectorManagerKey.cptr());
72 fillsTgcOccupancyHistograms(sTgcContainer.cptr(), detectorManagerKey.cptr(), lumiblock);
73 fillsTgcLumiblockHistograms(sTgcContainer.cptr(), lumiblock);
74
75 return StatusCode::SUCCESS;
76}
77
78void sTgcRawDataMonAlg::fillsTgcOccupancyHistograms(const Muon::sTgcPrepDataContainer* sTgcContainer, const MuonGM::MuonDetectorManager* muonDetectorManagerObject, int lb) const {
79 ATH_MSG_DEBUG("ON fillsTgcOccupancyHistograms");
80 for(const Muon::sTgcPrepDataCollection* coll : *sTgcContainer) {
81 for (const Muon::sTgcPrepData* prd : *coll) {
82 Identifier id = prd -> identify();
83
84 if(!id.is_valid()) {
85 ATH_MSG_WARNING("Invalid identifier found in Muon::sTgcPrepData");
86 return;
87 }
88
89 std::string stationName = m_idHelperSvc -> stgcIdHelper().stationNameString(m_idHelperSvc -> stgcIdHelper().stationName(id));
90 int stationEta = m_idHelperSvc -> stgcIdHelper().stationEta(id);
91 int stationPhi = m_idHelperSvc -> stgcIdHelper().stationPhi(id);
92 int multiplet = m_idHelperSvc -> stgcIdHelper().multilayer(id);
93 int gasGap = m_idHelperSvc -> stgcIdHelper().gasGap(id);
94 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(id);
95 int sector = m_idHelperSvc -> sector(id);
96 std::string sectorStr = std::to_string(sector);
97 int sectorsTotal = getSectors(id);
98 int layer = getLayer(multiplet, gasGap);
99 int stationEtaAbs = std::abs(stationEta);
100 std::string layerStr = std::to_string(layer);
101 int iside = (stationEta > 0) ? 1 : 0;
102 std::string side = GeometricSectors::sTgcSide[iside];
103 std::string channelName = "";
104
105 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) {
106 channelName = "pad";
107 int padNumber = m_idHelperSvc -> stgcIdHelper().channel(id);
108 Identifier idPadQ1 = m_idHelperSvc -> stgcIdHelper().channelID(stationName, 1, stationPhi, multiplet, gasGap, channelType, 1);
109 Identifier idPadQ2 = m_idHelperSvc -> stgcIdHelper().channelID(stationName, 2, stationPhi, multiplet, gasGap, channelType, 1);
110 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectPadQ1 = muonDetectorManagerObject -> getsTgcReadoutElement(idPadQ1);
111 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectPadQ2 = muonDetectorManagerObject -> getsTgcReadoutElement(idPadQ2);
112 int maxPadNumberQ1 = sTgcReadoutObjectPadQ1 -> maxPadNumber(idPadQ1);
113 int maxPadNumberQ2 = sTgcReadoutObjectPadQ2 -> maxPadNumber(idPadQ2);
114
115 if (stationEtaAbs == 2) padNumber = padNumber + maxPadNumberQ1;
116 else if (stationEtaAbs == 3) padNumber = padNumber + maxPadNumberQ1 + maxPadNumberQ2;
117
118 auto sectorMon = Monitored::Scalar<int>("sector_layer_" + layerStr, sectorsTotal);
119 auto padNumberMon = Monitored::Scalar<int>("padNumber_layer_" + layerStr, padNumber);
120 auto padLbMon = Monitored::Scalar<int>(channelName + "Lb", lb);
121 auto padsectMon = Monitored::Scalar<int>(channelName + "Sector", sectorsTotal);
122
123 fill("Occupancy", sectorMon, padNumberMon);
124
125 auto layerMon = Monitored::Scalar<int>(channelName+"layer_" + side + sectorStr, layer);
126 auto quadMon = Monitored::Scalar<int>(channelName+"quad_" + side + sectorStr, stationEtaAbs);
127 fill("Occupancy", layerMon, quadMon);
128 }
129
130 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) {
131 channelName = "strip";
132 int stripNumber = m_idHelperSvc -> stgcIdHelper().channel(id);
133 Identifier idStripQ1 = m_idHelperSvc -> stgcIdHelper().channelID(stationName, 1, stationPhi, multiplet, gasGap, channelType, 1);
134 Identifier idStripQ2 = m_idHelperSvc -> stgcIdHelper().channelID(stationName, 2, stationPhi, multiplet, gasGap, channelType, 1);
135 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectStripQ1 = muonDetectorManagerObject -> getsTgcReadoutElement(idStripQ1);
136 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectStripQ2 = muonDetectorManagerObject -> getsTgcReadoutElement(idStripQ2);
137 int maxStripNumberQ1 = sTgcReadoutObjectStripQ1 -> numberOfStrips(idStripQ1);
138 int maxStripNumberQ2 = sTgcReadoutObjectStripQ2 -> numberOfStrips(idStripQ2);
139
140 if (stationEtaAbs == 2) stripNumber = stripNumber + maxStripNumberQ1 + 1;
141 else if (stationEtaAbs == 3) stripNumber = stripNumber + maxStripNumberQ1 + maxStripNumberQ2 + 1;
142
143 auto sectorMon = Monitored::Scalar<int>("sector_layer_" + layerStr, sectorsTotal);
144 auto stripNumberMon = Monitored::Scalar<int>("stripNumber_layer_" + layerStr, stripNumber);
145 auto stripLbMon = Monitored::Scalar<int>(channelName + "Lb", lb);
146 auto stripsectMon = Monitored::Scalar<int>(channelName + "Sector", sectorsTotal);
147
148 fill("Occupancy", sectorMon, stripNumberMon);
149
150 auto layerMon = Monitored::Scalar<int>(channelName+"layer_" + side + sectorStr, layer);
151 auto quadMon = Monitored::Scalar<int>(channelName+"quad_" + side + sectorStr, stationEtaAbs);
152 fill("Occupancy", layerMon, quadMon);
153 }
154
155 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) {
156 channelName = "wire";
157 int wireGroupNumber = m_idHelperSvc -> stgcIdHelper().channel(id);
158 Identifier idWireGroupQ3 = m_idHelperSvc -> stgcIdHelper().channelID("STL", 3, stationPhi, 1, 3, channelType, 1);
159 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectWireGroupQ3 = muonDetectorManagerObject -> getsTgcReadoutElement(idWireGroupQ3);
160 int maxWireGroupNumberQ3 = sTgcReadoutObjectWireGroupQ3 -> numberOfStrips(idWireGroupQ3);
161
162 auto stationEtaMon = Monitored::Scalar<int>("stationEta_layer_" + layerStr, stationEta);
163 auto wireGroupNumberMon = Monitored::Scalar<int>("wireGroupNumber_layer_" + layerStr, wireGroupNumber + (sector - 1)*maxWireGroupNumberQ3);
164 auto wireLbMon = Monitored::Scalar<int>(channelName + "Lb", lb);
165 auto wiresectMon = Monitored::Scalar<int>(channelName + "Sector", sectorsTotal);
166 fill("Occupancy", stationEtaMon, wireGroupNumberMon);
167
168 auto layerMon = Monitored::Scalar<int>(channelName+"layer_" + side + sectorStr, layer);
169 auto quadMon = Monitored::Scalar<int>(channelName+"quad_" + side + sectorStr, stationEtaAbs);
170 fill("Occupancy", layerMon, quadMon);
171 }
172 auto sectorMon = Monitored::Scalar<int>(channelName+"Sector", sectorsTotal);
173 auto febMon = Monitored::Scalar<int>(channelName+"Feb", getFEBs(stationEta,layer));
174 auto lbMon = Monitored::Scalar<int>(channelName+"Lb", lb);
175
176 fill("Occupancy", sectorMon, febMon);
177 fill("LBShifterGroup", lbMon, sectorMon);
178 }
179 }
180 ATH_MSG_DEBUG("Off fillsTgcOccupancyHistograms");
181}
182
183
185 ATH_MSG_DEBUG("On fillsTgcLumiblockHistograms");
186 for(const Muon::sTgcPrepDataCollection* coll : *sTgcContainer) {
187 for (const Muon::sTgcPrepData* prd : *coll) {
188 Identifier id = prd -> identify();
189
190
191 std::string stationName = m_idHelperSvc -> stgcIdHelper().stationNameString(m_idHelperSvc -> stgcIdHelper().stationName(id));
192 int stationEta = m_idHelperSvc -> stgcIdHelper().stationEta(id);
193 int multiplet = m_idHelperSvc -> stgcIdHelper().multilayer(id);
194 int gasGap = m_idHelperSvc -> stgcIdHelper().gasGap(id);
195 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(id);
196 int sector = m_idHelperSvc -> sector(id);
197 std::string sectorStr = std::to_string(sector);
198 int sectorsTotal = getSectors(id);
199 int numberOfHits = coll->size();
200 int layer = getLayer(multiplet, gasGap);
201 std::string layerStr = std::to_string(layer);
202 int iside = (stationEta > 0) ? 1 : 0;
203 std::string side = GeometricSectors::sTgcSide[iside];
204 int feb = getFEBs(stationEta,layer);
205 std::string channelName = "";
206
207 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) channelName = "pad";
208 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) channelName = "strip";
209 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) channelName = "wire";
210
211 auto febMon = Monitored::Scalar<int>(channelName+"FEBsector"+side+sectorStr, feb);
212 auto lbMon = Monitored::Scalar<int>(channelName+"LBsector"+side+sectorStr, lb);
213 auto sectorMon = Monitored::Scalar<int>(channelName+"Sector", sectorsTotal);
214 auto lbbMon = Monitored::Scalar<int>(channelName+"Lb", lb);
215 auto numberOfHitsMon = Monitored::Scalar<int>(channelName+"NumberOfHits", numberOfHits);
216
217 fill("LBExpertGroup", lbMon, febMon);
218 }
219 }
220 ATH_MSG_DEBUG("Off fillsTgcLumiblockHistograms");
221}
222
223
225 ATH_MSG_DEBUG("On fillsTgcClusterFromTrackHistograms");
226 for (const xAOD::TrackParticle* meTP : *trkPartCont) {
227 const Trk::Track* meTrack = meTP -> track();
228 if(!meTrack) continue;
229 for (const Trk::TrackStateOnSurface* trkState : *meTrack -> trackStateOnSurfaces()) {
230 std::optional<std::tuple<Identifier, const Trk::RIO_OnTrack*>> status = getRotIdAndRotObject(trkState);
231 if (!status.has_value()) continue;
232 std::tuple<Identifier, const Trk::RIO_OnTrack*> rotIDtuple = status.value();
233
234 Identifier rot_id = std::get<Identifier>(rotIDtuple);
235
236 const Muon::sTgcClusterOnTrack* cluster = dynamic_cast<const Muon::sTgcClusterOnTrack*>(std::get<const Trk::RIO_OnTrack*>(rotIDtuple));
237 if(!cluster) continue;
238
239 const Muon::sTgcPrepData* prd = cluster -> prepRawData();
240 if (!prd) continue;
241
242 const MuonGM::sTgcReadoutElement* rdoEl = prd->detectorElement();
243 if (!rdoEl) continue;
244
245 const Amg::Vector2D& localPos = prd->localPosition();
246
247 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
248 int stEta = m_idHelperSvc -> stgcIdHelper().stationEta(rot_id);
249 int multi = m_idHelperSvc -> stgcIdHelper().multilayer(rot_id);
250 int gap = m_idHelperSvc -> stgcIdHelper().gasGap(rot_id);
251 int sector = m_idHelperSvc -> sector(rot_id);
252 int sectorsTotal = getSectors(rot_id);
253 int layer = getLayer(multi, gap);
254 int iside = (stEta > 0) ? 1 : 0;
255 std::string side = GeometricSectors::sTgcSide[iside];
256 std::string channelName = "";
257 std::string sectorStr = std::to_string(sector);
258
259 std::string quadLabel = "";
260 bool isInner = false;
261 bool isQ1 = (std::abs(stEta) == 1);
262 if (isQ1) {
263 isInner = rdoEl->isEtaZero(rot_id, localPos);
264 quadLabel = isInner ? "Q1Inner" : "Q1Outer";
265 } else {
266 quadLabel = "Q" + std::to_string(std::abs(stEta));
267 }
268
269 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) {
270 float padCharge = prd -> charge();
271 auto padChargeMon = Monitored::Scalar<float>("padTrackCharge_" + side + "_quad_" + quadLabel + "_sector_" + std::to_string(sector) + "_layer_" + std::to_string(layer), padCharge);
272 fill("padCharge_" + side + std::to_string(sector) + "_quad_" + quadLabel, padChargeMon);
273
274 short int padTiming = prd -> time();
275 auto padSectorSidedMon = Monitored::Scalar<int>("padTrackSectorSided_layer_" + std::to_string(layer), sectorsTotal);
276 auto padTimingMon = Monitored::Scalar<float>("padTrackTiming_layer_" + std::to_string(layer), padTiming);
277 fill("sTgcTiming", padSectorSidedMon, padTimingMon);
278
279 auto padSectorSidedExpertMon = Monitored::Scalar<int>("padTrackSectorSided_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), sectorsTotal);
280 auto padTimingExpertMon = Monitored::Scalar<float>("padTrackTiming_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), padTiming);
281 fill("padTiming_quad_" + std::to_string(std::abs(stEta)), padSectorSidedExpertMon, padTimingExpertMon);
282
283 ATH_MSG_DEBUG("Pad Timing: " << padTiming);
284
285 auto febMon = Monitored::Scalar<int>("padFEB"+ side + sectorStr, getFEBs(stEta,layer));
286 auto timeMon = Monitored::Scalar<int>("padTiming"+ side + sectorStr, padTiming);
287 fill("sTgcTiming", timeMon, febMon);
288 }
289
290 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) {
291 channelName = "strip";
292 const std::vector<Identifier>& stripIds = prd->rdoList();
293 unsigned int csize = stripIds.size();
294
295 std::vector<short int> stripTimesVec = prd -> stripTimes();
296 std::vector<int> stripChargesVec = prd -> stripCharges();
297
298 float stripClusterTimes = 0;
299 float stripClusterCharges = 0;
300
301 for (unsigned int sIdx = 0; sIdx < csize; ++sIdx) {
302 stripClusterTimes += stripTimesVec.at(sIdx);
303 stripClusterCharges += stripChargesVec.at(sIdx);
304 }
305
306 stripClusterTimes /= stripTimesVec.size();
307
308 auto stripClusterChargesPerSideQuadMon = Monitored::Scalar<float>("stripTrackCharge_" + side + "_quad_" + quadLabel + "_sector_" + std::to_string(sector) + "_layer_" + std::to_string(layer), stripClusterCharges);
309 fill("stripCharge_" + side + std::to_string(sector) + "_quad_" + quadLabel, stripClusterChargesPerSideQuadMon);
310
311
312 auto stripClusterSectorSidedMon = Monitored::Scalar<int>("stripTrackSectorSided_layer_" + std::to_string(layer), sectorsTotal);
313 auto stripClusterTimesMon = Monitored::Scalar<float>("stripTrackTiming_layer_" + std::to_string(layer), stripClusterTimes);
314 auto stripClusterSizeMon = Monitored::Scalar<unsigned int>("stripTrackClusterSize_layer_" + std::to_string(layer), csize);
315 fill("sTgcTiming", stripClusterSectorSidedMon, stripClusterTimesMon);
316 fill("padTriggerExpert", stripClusterSectorSidedMon, stripClusterSizeMon);
317
318 ATH_MSG_DEBUG("Strip Timing: " << stripClusterTimes);
319
320 auto febMon = Monitored::Scalar<int>("stripFEB"+ side + sectorStr, getFEBs(stEta,layer));
321 auto timeMon = Monitored::Scalar<int>("stripTiming"+ side + sectorStr, stripClusterTimes);
322 fill("sTgcTiming", timeMon, febMon);
323
324
325 auto stripSectorSidedExpertMon = Monitored::Scalar<int>("stripTrackSectorSided_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), sectorsTotal);
326 auto stripTimingExpertMon = Monitored::Scalar<float>("stripTrackTiming_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), stripClusterTimes);
327 fill("stripTiming_quad_" + std::to_string(std::abs(stEta)), stripSectorSidedExpertMon, stripTimingExpertMon);
328
329
330 std::optional<Trk::ResidualPull> resPull(m_residualPullCalculator -> residualPull(trkState -> measurementOnTrack(), trkState -> trackParameters(), Trk::ResidualPull::ResidualType::Biased));
331
332 if (resPull) {
333 float residual = resPull -> residual()[Trk::locX];
334 auto residualMon = Monitored::Scalar<float>("residual_" + side + "_quad_" + std::to_string(std::abs(stEta)) + "_sector_" + std::to_string(sector) + "_layer_" + std::to_string(layer), residual);
335 fill("sTgcResiduals_" + side + std::to_string(sector) + "_quad_" + std::to_string(std::abs(stEta)), residualMon);
336 }
337 }
338
339 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) {
340 float wireGroupCharge = prd -> charge();
341 auto wireGroupChargeMon = Monitored::Scalar<float>("wireGroupTrackCharge_" + side + "_quad_" + std::to_string(std::abs(stEta)) + "_sector_" + std::to_string(sector) + "_layer_" + std::to_string(layer), wireGroupCharge);
342 fill("wireGroupCharge_" + side + std::to_string(sector) + "_quad_" + std::to_string(std::abs(stEta)), wireGroupChargeMon);
343
344 short int wireGroupTiming = prd -> time();
345 auto wireGroupSectorSidedMon = Monitored::Scalar<int>("wireGroupTrackSectorSided_layer_" + std::to_string(layer), sectorsTotal);
346 auto wireGroupTimingMon = Monitored::Scalar<float>("wireGroupTrackTiming_layer_" + std::to_string(layer), wireGroupTiming);
347 fill("sTgcTiming", wireGroupSectorSidedMon, wireGroupTimingMon);
348
349 auto wireSectorSidedExpertMon = Monitored::Scalar<int>("wireTrackSectorSided_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), sectorsTotal);
350 auto wireTimingExpertMon = Monitored::Scalar<float>("wireTrackTiming_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), wireGroupTiming);
351 fill("wireTiming_quad_" + std::to_string(std::abs(stEta)), wireSectorSidedExpertMon, wireTimingExpertMon);
352
353 ATH_MSG_DEBUG("Wire Timing: " << wireGroupTiming);
354
355 auto febMon = Monitored::Scalar<int>("wireFEB"+ side + sectorStr, getFEBs(stEta,layer));
356 auto timeMon = Monitored::Scalar<int>("wireTiming"+ side + sectorStr, wireGroupTiming);
357 fill("sTgcTiming", timeMon, febMon);
358 }
359 }
360 }
361 ATH_MSG_DEBUG("Off fillsTgcClusterFromTrackHistograms");
362}
363
365 ATH_MSG_DEBUG("On fillsTgcPadTriggerDataHistograms");
366 for (const Muon::NSW_PadTriggerData* rdo : *NSWpadTriggerObject) {
367 bool sideA = rdo -> sideA();
368 bool largeSector = rdo -> largeSector();
369
370 int iside = (sideA) ? 1 : 0;
371 int isize = (largeSector) ? 1 : 0;
372
373 std::string side = GeometricSectors::sTgcSide[iside];
374 std::string size = GeometricSectors::sTgcSize[isize];
375
376 size_t numberOfTriggers = rdo -> getNumberOfTriggers();
377 size_t numberOfHits = rdo -> getNumberOfHits();
378
379 for (size_t trigger = 0; trigger < numberOfTriggers; ++trigger) {
380 int triggerPhiIdsUnsigned = rdo -> getTriggerPhiIds().at(trigger);
381 int triggerBandIds = rdo -> getTriggerBandIds().at(trigger);
382 int triggerRelBCID = rdo -> getTriggerRelBcids().at(trigger);
383 int sourceId = rdo -> getSourceid();
384 int sectorNumber = sourceidToSector(sourceId, sideA);
385
386 if (triggerPhiIdsUnsigned == m_cutTriggerPhiId || triggerBandIds == m_cutTriggerBandId) continue;
387
388 int triggerPhiIds = getSignedPhiId(triggerPhiIdsUnsigned);
389
390 auto phiIdsPerSideSizeMon = Monitored::Scalar<int>("phiIds_" + side + "_" + size, triggerPhiIds);
391 auto bandIdsPerSideSizeMon = Monitored::Scalar<int>("bandIds_" + side + "_" + size, triggerBandIds);
392 fill("padTriggerExpert", phiIdsPerSideSizeMon, bandIdsPerSideSizeMon);
393
394 auto lbMon = Monitored::Scalar<int>("lb", lb);
395 auto relBCIDMon = Monitored::Scalar<int>("relBCID", triggerRelBCID);
396 auto sectorMon = Monitored::Scalar<int>("sector", sectorNumber);
397 auto numberOfTriggersMon = Monitored::Scalar<int>("numberOfTriggers", numberOfTriggers);
398 fill("Overview", lbMon, sectorMon, numberOfTriggersMon);
399 fill("padTriggerExpert", lbMon, relBCIDMon);
400
401 auto numberOfTriggersPerSectorMon = Monitored::Scalar<int>("numberOfTriggers_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), numberOfTriggers);
402 auto phiIdsSidedSizedPerSectorMon = Monitored::Scalar<int>("phiIds_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerPhiIds);
403 auto bandIdsSidedSizedPerSectorMon = Monitored::Scalar<int>("bandIds_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerBandIds);
404 auto lbPerSectorMon = Monitored::Scalar<int>("lb_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), lb);
405 auto relBCIDperSectorMon = Monitored::Scalar<int>("relBCID_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerRelBCID);
406 fill("padTriggerExpert", numberOfTriggersPerSectorMon, phiIdsSidedSizedPerSectorMon, bandIdsSidedSizedPerSectorMon, lbPerSectorMon, relBCIDperSectorMon);
407
408 auto RelBCIDPerSectorMon = Monitored::Scalar<int>("relBCID_"+ side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerRelBCID);
409 auto PhiIDPerSectorMon = Monitored::Scalar<int>("phiIds_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerPhiIds);
410 auto BandIDPerSectorMon = Monitored::Scalar<int>("bandID_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerBandIds);
411 fill("padTriggerExpert", RelBCIDPerSectorMon, PhiIDPerSectorMon, BandIDPerSectorMon);
412 }
413
414 for (size_t hits = 0; hits < numberOfHits; ++hits){
415 std::optional<Identifier> status = getPadId(rdo->getSourceid(), rdo->getHitPfebs().at(hits), rdo->getHitTdsChannels().at(hits));
416 if (!status.has_value()) continue;
417 Identifier pad_id = status.value();
418
419 for (const xAOD::Muon* mu : *muonContainer) {
420 if(mu -> pt() < m_cutPt) continue;
421 if(!(mu -> author() == xAOD::Muon::Author::MuidCo || mu -> author() == xAOD::Muon::Author::MuidSA)) continue;
422
423 const xAOD::TrackParticle* meTP = mu -> trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
424 if(meTP == nullptr) continue;
425
426 const Trk::Track* meTrack = meTP -> track();
427 if(!meTrack) continue;
428
429 for(const Trk::TrackStateOnSurface* trkState : *meTrack->trackStateOnSurfaces()) {
430 std::optional<Identifier> status = getRotId(trkState);
431 if (!status.has_value()) continue;
432 Identifier rot_id = status.value();
433
434 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
435 if (channelType != sTgcIdHelper::sTgcChannelTypes::Pad) continue;
436
437
438 if (rot_id != pad_id) continue;
439
440 int sourceIds = rdo -> getSourceid();
441 int sectorNumbers = sourceidToSector(sourceIds, sideA);
442 int hitRelBCID = rdo -> getHitRelBcids().at(hits);
443 int hitpfebs = rdo -> getHitPfebs().at(hits);
444 int hitTdsChannels = rdo->getHitTdsChannels().at(hits);
445
446 std::optional<std::tuple<int, int, std::string, std::string, int>> statusPadEtaPhi = getPadEtaPhiTuple(sourceIds, hitpfebs, hitTdsChannels);
447 if (!statusPadEtaPhi.has_value()) continue;
448 std::tuple<int, int, std::string, std::string, int> padEtaPhiTuple = statusPadEtaPhi.value();
449
450 int padPhi = std::get<0>(padEtaPhiTuple);
451 int padEta = std::get<1>(padEtaPhiTuple);
452 std::string sideName = std::get<2>(padEtaPhiTuple);
453 std::string sizeName = std::get<3>(padEtaPhiTuple);
454 int layer = std::get<4>(padEtaPhiTuple);
455
456 auto padPhiMon = Monitored::Scalar<int>("padPhi_" + sideName + "_" + sizeName + "_layer_" + std::to_string(layer), padPhi);
457 auto padEtaMon = Monitored::Scalar<int>("padEta_" + sideName + "_" + sizeName + "_layer_" + std::to_string(layer), padEta);
458 fill("padTriggerOccupancy", padPhiMon, padEtaMon);
459
460 auto hitRelBCIDmon = Monitored::Scalar<int>("hitRelBCID", hitRelBCID);
461 auto hitPfebsMon = Monitored::Scalar<int>("hitPfebs", hitpfebs);
462 auto sectorMon = Monitored::Scalar<int>("sector", sectorNumbers);
463 fill("padTriggerExpert", hitRelBCIDmon, hitPfebsMon, sectorMon);
464
465 auto hitRelBCIDPerSectorMon = Monitored::Scalar<int>("hitRelBCID_"+side+"_sector_"+std::to_string(std::abs(sectorNumbers)), hitRelBCID);
466 auto hitpfebsPerSectorMon = Monitored::Scalar<int>("hitPfebs_"+side+"_sector_"+std::to_string(std::abs(sectorNumbers)), hitpfebs);
467 fill("padTriggerExpert", hitRelBCIDPerSectorMon, hitpfebsPerSectorMon);
468 } // end TrackStateOnSurface loop
469 } // end Muon loop
470 } // end NSW_PadTriggerData loop
471 }// end Number of Hits loop
472 ATH_MSG_DEBUG("Off fillsTgcPadTriggerDataHistograms");
473}
474
476 ATH_MSG_DEBUG("On fillsTgcEfficiencyHistograms");
477 for (const xAOD::Muon* mu : *muonContainer) {
478 if (mu -> pt() < m_cutPt) continue;
479 if (!(mu -> author() == xAOD::Muon::Author::MuidCo || mu -> author() == xAOD::Muon::Author::MuidSA)) continue;
480
481 struct sTGCeff {
482 std::array<int, 8> quadMultiplet{};
483 std::array<int, 8> layerMultiplet{};
484 std::array<float, 8> xPosMultiplet{};
485 std::array<float, 8> yPosMultiplet{};
486 std::array<float, 8> zPosMultiplet{};
487 };
488
489 std::array<std::array<sTGCeff, 16>, 2> effPlots; // Store active layers per side (2) and sectors (16)
490
491 const xAOD::TrackParticle* meTP = mu -> trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
492 if(meTP == nullptr) continue;
493
494 const Trk::Track* meTrack = meTP -> track();
495 if(!meTrack) continue;
496
497 for(const Trk::TrackStateOnSurface* trkState : *meTrack->trackStateOnSurfaces()) {
498 std::optional<Identifier> status = getRotId(trkState);
499 if (!status.has_value()) continue;
500
501 Identifier rot_id = status.value();
502
503 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
504 if (channelType != sTgcIdHelper::sTgcChannelTypes::Strip) continue;
505
506 int stEta = m_idHelperSvc -> stgcIdHelper().stationEta(rot_id);
507 int iside = (stEta > 0) ? 1 : 0;
508 int sector = m_idHelperSvc -> sector(rot_id);
509 int multi = m_idHelperSvc -> stgcIdHelper().multilayer(rot_id);
510 int gap = m_idHelperSvc -> stgcIdHelper().gasGap(rot_id);
511 int layer = getLayer(multi, gap);
512
513 const Amg::Vector2D& positionsMultiplet = (trkState) -> trackParameters() -> localPosition();
514 float xPosStripInMultipletLocal = positionsMultiplet.x();
515 float yPosStripInMultipletLocal = positionsMultiplet.y();
516
517 Amg::Vector2D localPos(xPosStripInMultipletLocal, yPosStripInMultipletLocal);
518 Amg::Vector3D globalPos(Amg::Vector3D::Zero());
519 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectStrip = muonDetectorManagerObject -> getsTgcReadoutElement(rot_id);
520 sTgcReadoutObjectStrip -> surface(rot_id).localToGlobal(localPos, Amg::Vector3D::Zero(), globalPos);
521 float xPosStripInMultiplet = globalPos.x();
522 float yPosStripInMultiplet = globalPos.y();
523
524 Amg::Vector3D posStripGlobal{Amg::Vector3D::Zero()};
525 (muonDetectorManagerObject -> getsTgcReadoutElement(rot_id)) -> stripGlobalPosition(rot_id, posStripGlobal);
526 float zPosStripInMultiplet = posStripGlobal.z();
527
528 auto& sTGCelements = effPlots[iside][sector - 1];
529
530 sTGCelements.quadMultiplet.at(layer - 1) = stEta;
531 sTGCelements.layerMultiplet.at(layer - 1) = layer;
532 sTGCelements.xPosMultiplet.at(layer - 1) = xPosStripInMultiplet;
533 sTGCelements.yPosMultiplet.at(layer - 1) = yPosStripInMultiplet;
534 sTGCelements.zPosMultiplet.at(layer - 1) = zPosStripInMultiplet;
535 } // end track state loop
536
537 for (unsigned int isideIndex = 0; isideIndex <= 1; ++isideIndex) {
538 for (unsigned int sectorIndex = 1; sectorIndex <= 16; ++sectorIndex) {
539 auto& sTGCelements = effPlots[isideIndex][sectorIndex - 1];
540 bool fourOutEight = std::count_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](int i) { return i != 0; }) >= 4;
541 bool oneRefLayer = std::count_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](int i) { return i != 0; }) >= 1;
542
543 if (fourOutEight) {
544 for (auto layerIndex = static_cast<std::array<int, 8>::size_type>(1); layerIndex <= sTGCelements.layerMultiplet.size(); ++layerIndex) {
545 if (sTGCelements.layerMultiplet.at(layerIndex - 1) == 0) continue;
546
547 float xPos = sTGCelements.xPosMultiplet.at(layerIndex - 1);
548 float yPos = sTGCelements.yPosMultiplet.at(layerIndex - 1);
549 float rPos = std::hypot(xPos, yPos);
550
551 std::string side = GeometricSectors::sTgcSide[isideIndex];
552
553 auto effQuestionMon = Monitored::Scalar<bool>("hitLayer", true);
554 auto rPosStripMon = Monitored::Scalar<float>("rPosStrip_" + side + "_sector_" + std::to_string(sectorIndex) + "_layer_" + std::to_string(layerIndex), rPos);
555 fill("rPosStrip_" + side + std::to_string(sectorIndex), rPosStripMon, effQuestionMon);
556 //GlobalRGroup
557
558 auto xPosStripmon = Monitored::Scalar<float>("xPosStrip_" + side + "_layer_" + std::to_string(layerIndex), xPos);
559 auto yPosStripmon = Monitored::Scalar<float>("yPosStrip_" + side + "_layer_" + std::to_string(layerIndex), yPos);
560 fill("padTriggerShifter", xPosStripmon, yPosStripmon, effQuestionMon);
561 //StripEfficiency
562 } // End of loop over efficient layers
563 } // End of efficient case
564
565 else if (!fourOutEight && oneRefLayer) {
566 auto refLayerIndex = std::distance(sTGCelements.layerMultiplet.begin(), std::find_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](int i) {return i != 0;}));
567
568 for (auto layerIndex = static_cast<std::array<int, 8>::size_type>(1); layerIndex <= sTGCelements.layerMultiplet.size(); ++layerIndex) {
569 if (sTGCelements.layerMultiplet.at(layerIndex - 1) != 0) continue;
570 int quad = sTGCelements.quadMultiplet.at(refLayerIndex);
571 int multi = (layerIndex <= static_cast<std::array<int, 8>::size_type>(m_idHelperSvc->stgcIdHelper().gasGapMax())) ? m_idHelperSvc->stgcIdHelper().multilayerMin() : m_idHelperSvc->stgcIdHelper().multilayerMax();
572 int gap = (layerIndex <= static_cast<std::array<int, 8>::size_type>(m_idHelperSvc->stgcIdHelper().gasGapMax())) ? layerIndex : layerIndex - static_cast<std::array<int, 8>::size_type>(m_idHelperSvc->stgcIdHelper().gasGapMax());
573
574 bool isValid = false;
575 const Identifier idProbe = m_idHelperSvc -> stgcIdHelper().channelID((sectorIndex % 2 == 0) ? "STS" : "STL", quad, (sectorIndex % 2 == 0) ? sectorIndex/2 : (sectorIndex + 1)/2, multi, gap, sTgcIdHelper::sTgcChannelTypes::Strip, 1, isValid);
576
577 if (!isValid) {
578 ATH_MSG_WARNING("Identifier of probe layer is invalid");
579 continue;
580 }
581
582 Amg::Vector3D posProbe{Amg::Vector3D::Zero()};
583 (muonDetectorManagerObject -> getsTgcReadoutElement(idProbe)) -> stripGlobalPosition(idProbe, posProbe);
584 float posZprobe = posProbe.z();
585
586 float xSlope = sTGCelements.xPosMultiplet.at(refLayerIndex)/sTGCelements.zPosMultiplet.at(refLayerIndex);
587 float ySlope = sTGCelements.yPosMultiplet.at(refLayerIndex)/sTGCelements.zPosMultiplet.at(refLayerIndex);
588
589 float xPos = sTGCelements.xPosMultiplet.at(refLayerIndex) + xSlope*(posZprobe - sTGCelements.zPosMultiplet.at(refLayerIndex));
590 float yPos = sTGCelements.yPosMultiplet.at(refLayerIndex) + ySlope*(posZprobe - sTGCelements.zPosMultiplet.at(refLayerIndex));
591 float rPos = std::hypot(xPos, yPos);
592
593 std::string side = GeometricSectors::sTgcSide[isideIndex];
594
595 auto effQuestionMon = Monitored::Scalar<bool>("hitLayer", false);
596
597 auto rPosStripProbemon = Monitored::Scalar<float>("rPosStrip_" + side + "_sector_" + std::to_string(sectorIndex) + "_layer_" + std::to_string(layerIndex), rPos);
598 fill("rPosStrip_" + side + std::to_string(sectorIndex), rPosStripProbemon, effQuestionMon);
599
600 auto xPosStripProbemon = Monitored::Scalar<float>("xPosStrip_" + side + "_layer_" + std::to_string(layerIndex), xPos);
601 auto yPosStripProbemon = Monitored::Scalar<float>("yPosStrip_" + side + "_layer_" + std::to_string(layerIndex), yPos);
602 fill("padTriggerShifter", xPosStripProbemon, yPosStripProbemon, effQuestionMon);
603 } // End of loop over probe layers
604 } // End of non-efficient case
605 } // End of sector loop
606 } // End of iside loop
607 } // End muon container loop
608 ATH_MSG_DEBUG("Off fillsTgcClusterFromTrackHistograms");
609} // end stgc strip function
610
612 ATH_MSG_DEBUG("On fillsTgcPadTriggerEfficiencyHistograms");
613 for (const xAOD::Muon* mu : *muonContainer) {
614 if (!(mu -> author() == xAOD::Muon::Author::MuidCo || mu -> author() == xAOD::Muon::Author::MuidSA)) continue;
615 if (mu -> pt() < m_cutPt) continue;
616 if (std::abs(mu -> eta()) < m_cutEtaDown || std::abs(mu -> eta()) > m_cutEtaUp) continue;
617
618 double recoMuonEta = mu -> eta();
619 double recoMuonPhi = mu -> phi();
620
621 std::string sideRecoMuon = GeometricSectors::sTgcSide[recoMuonEta > 0];
622
623 std::string minSideRecoMuon = "", minSideTrigger = "";
624
625 double minTriggerEta = 999., minTriggerPhi = 999.,
626 minRecoEta = 999., minRecoPhi = 999., minDeltaR = 999.;
627
628 auto minDeltaRtrigIt = -1;
629
630 for (const Muon::NSW_PadTriggerData* rdo : *NSWpadTriggerObject) {
631 bool sideA = rdo -> sideA();
632 bool largeSector = rdo -> largeSector();
633 std::string sideTrigger = GeometricSectors::sTgcSide[sideA];
634 size_t numberOfTriggers = rdo -> getNumberOfTriggers();
635
636 for (size_t trigger = 0; trigger < numberOfTriggers; ++trigger) {
637 int triggerPhiIdsUnsigned = rdo -> getTriggerPhiIds().at(trigger);
638 int triggerBandIds = rdo -> getTriggerBandIds().at(trigger);
639 int sourceId = rdo -> getSourceid();
640
641 if (triggerPhiIdsUnsigned == m_cutTriggerPhiId || triggerBandIds == m_cutTriggerBandId) continue;
642
643 int triggerPhiIds = getSignedPhiId(triggerPhiIdsUnsigned);
644 std::optional<double> status = bandId2eta(triggerBandIds, largeSector, sideA, muonDetectorManagerObject);
645 if (!status.has_value()) continue;
646 double triggerBandIdToEta = status.value();
647 double triggerPhiIDtoPhi = triggersectorphiid2phi(sourceId, triggerPhiIds);
648 double deltaR = xAOD::P4Helpers::deltaR(recoMuonEta, recoMuonPhi, triggerBandIdToEta, triggerPhiIDtoPhi);
649
650 if (std::abs(triggerBandIdToEta) < m_cutEtaDown || std::abs(triggerBandIdToEta) > m_cutEtaUp) continue;
651
652 if (sideRecoMuon == sideTrigger) {
653 if (deltaR < minDeltaR) {
654 minSideRecoMuon = sideRecoMuon;
655 minSideTrigger = sideTrigger;
656 minTriggerEta = triggerBandIdToEta;
657 minTriggerPhi = triggerPhiIDtoPhi;
658 minRecoEta = recoMuonEta;
659 minRecoPhi = recoMuonPhi;
660 minDeltaR = deltaR;
661 minDeltaRtrigIt = trigger;
662 }
663 }
664 } // end number of triggers loop
665 } // end pad trigger data container loop
666
667 bool muonRecoTriggerMatch = false;
668
669 if (minDeltaRtrigIt != -1) {
670 if (minDeltaR < m_minDeltaR) {
671 muonRecoTriggerMatch = true;
672 }
673 }
674
675 auto deltaRmon = Monitored::Scalar<double>("deltaR", minDeltaR);
676 fill("Overview", deltaRmon);
677
678 auto etaRecoMuonMon = Monitored::Scalar<double>("etaRecoMuon", minRecoEta);
679 auto phiRecoMuonMon = Monitored::Scalar<double>("phiRecoMuon", minRecoPhi);
680 fill("Overview", etaRecoMuonMon, phiRecoMuonMon);
681
682 auto etaPadTriggerMon = Monitored::Scalar<double>("etaPadTrigger", minTriggerEta);
683 auto phiPadTriggerMon = Monitored::Scalar<double>("phiPadTrigger", minTriggerPhi);
684 fill("Overview", etaPadTriggerMon, phiPadTriggerMon);
685
686 auto phiRecoMuonSidedMon = Monitored::Scalar<double>("phiRecoMuon_" + minSideRecoMuon, minRecoPhi);
687 auto phiPadTriggerSidedMon = Monitored::Scalar<double>("phiPadTrigger_" + minSideTrigger, minTriggerPhi);
688 fill("Overview", phiRecoMuonSidedMon, phiPadTriggerSidedMon);
689
690 auto muonRecoTriggerMatchMon = Monitored::Scalar<bool>("muonRecoTriggerMatch", muonRecoTriggerMatch);
691 auto etaRecoMuonEffMon = Monitored::Scalar<double>("etaRecoMuonEff", minRecoEta);
692 auto phiRecoMuonEffMon = Monitored::Scalar<double>("phiRecoMuonEff", minRecoPhi);
693 fill("Overview", muonRecoTriggerMatchMon, etaRecoMuonEffMon, phiRecoMuonEffMon);
694
695 } // end muon container loop
696 ATH_MSG_DEBUG("Off fillsTgcPadTriggerEfficiencyHistograms");
697}
Scalar eta() const
pseudorapidity method
Scalar deltaR(const MatrixBase< Derived > &vec) const
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
size_t size() const
Number of registered mappings.
xAOD::MuonContainer * muonContainer
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.
Declare a monitored scalar variable.
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
An sTgcReadoutElement corresponds to a single STGC module; therefore typicaly a barrel muon station c...
bool isEtaZero(const Identifier &id, const Amg::Vector2D &localPosition) const
is eta=0 of QL1 or QS1?
Class to represent calibrated clusters formed from TGC strips.
Class to represent sTgc measurements.
virtual const MuonGM::sTgcReadoutElement * detectorElement() const override final
Returns the detector element corresponding to this PRD.
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const Amg::Vector2D & localPosition() const
return the local position reference
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
@ Biased
RP with track state including the hit.
represents the track state (measurement, material, fit parameters and quality) at a surface.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
std::optional< std::tuple< Identifier, const Trk::RIO_OnTrack * > > getRotIdAndRotObject(const Trk::TrackStateOnSurface *trkState) const
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< double > m_cutPt
int getLayer(const int multiplet, const int gasGap) const
SG::ReadHandleKey< Muon::NSW_PadTriggerDataContainer > m_rdoKey
int getSignedPhiId(const uint32_t phiid) const
void fillsTgcLumiblockHistograms(const Muon::sTgcPrepDataContainer *, const int lb) const
void fillsTgcOccupancyHistograms(const Muon::sTgcPrepDataContainer *, const MuonGM::MuonDetectorManager *, const int lb) const
int32_t sourceidToSector(uint32_t sourceid, bool isSideA) const
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_meTrkKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Gaudi::Property< int > m_cutTriggerBandId
void fillsTgcPadTriggerEfficiencyHistograms(const xAOD::MuonContainer *, const Muon::NSW_PadTriggerDataContainer *, const MuonGM::MuonDetectorManager *muonDetectorManagerObject) const
ToolHandle< Trk::IResidualPullCalculator > m_residualPullCalculator
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_detectorManagerKey
Gaudi::Property< double > m_cutEtaDown
double triggersectorphiid2phi(uint32_t sourceid, int trigger_phiid) const
virtual StatusCode initialize() override
initialize
void fillsTgcPadTriggerDataHistograms(const xAOD::MuonContainer *, const Muon::NSW_PadTriggerDataContainer *, const int lb) const
void fillsTgcClusterFromTrackHistograms(const xAOD::TrackParticleContainer *) const
sTgcRawDataMonAlg(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< int > m_cutTriggerPhiId
std::optional< std::tuple< int, int, std::string, std::string, int > > getPadEtaPhiTuple(uint32_t sourceid, uint32_t pfeb, uint32_t tdschan) const
std::optional< Identifier > getPadId(uint32_t sourceid, uint32_t pfeb, uint32_t tdschan) const
std::optional< Identifier > getRotId(const Trk::TrackStateOnSurface *trkState) const
std::optional< double > bandId2eta(int bandid, bool isLarge, bool isA, const MuonGM::MuonDetectorManager *muonDetectorManagerObject) const
int getSectors(const Identifier &id) const
void fillsTgcEfficiencyHistograms(const xAOD::MuonContainer *, const MuonGM::MuonDetectorManager *) const
Gaudi::Property< double > m_minDeltaR
Gaudi::Property< double > m_cutEtaUp
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_sTgcContainerKey
SG::ReadHandleKey< xAOD::MuonContainer > m_muonKey
int getFEBs(int eta, int layers) const
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.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
static const std::array< std::string, 2 > sTgcSize
static const std::array< std::string, 2 > sTgcSide
MuonPrepDataContainerT< sTgcPrepData > sTgcPrepDataContainer
MuonPrepDataCollection< sTgcPrepData > sTgcPrepDataCollection
@ locX
Definition ParamDefs.h:37
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".