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 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
243 int stEta = m_idHelperSvc -> stgcIdHelper().stationEta(rot_id);
244 int multi = m_idHelperSvc -> stgcIdHelper().multilayer(rot_id);
245 int gap = m_idHelperSvc -> stgcIdHelper().gasGap(rot_id);
246 int sector = m_idHelperSvc -> sector(rot_id);
247 int sectorsTotal = getSectors(rot_id);
248 int layer = getLayer(multi, gap);
249 int iside = (stEta > 0) ? 1 : 0;
250 std::string side = GeometricSectors::sTgcSide[iside];
251 std::string channelName = "";
252 std::string sectorStr = std::to_string(sector);
253
254 if (channelType == sTgcIdHelper::sTgcChannelTypes::Pad) {
255 float padCharge = prd -> charge();
256 auto padChargeMon = Monitored::Scalar<float>("padTrackCharge_" + side + "_quad_" + std::to_string(std::abs(stEta)) + "_sector_" + std::to_string(sector) + "_layer_" + std::to_string(layer), padCharge);
257 fill("padCharge_" + side + std::to_string(sector) + "_quad_" + std::to_string(std::abs(stEta)), padChargeMon);
258
259 short int padTiming = prd -> time();
260 auto padSectorSidedMon = Monitored::Scalar<int>("padTrackSectorSided_layer_" + std::to_string(layer), sectorsTotal);
261 auto padTimingMon = Monitored::Scalar<float>("padTrackTiming_layer_" + std::to_string(layer), padTiming);
262 fill("sTgcTiming", padSectorSidedMon, padTimingMon);
263
264 auto padSectorSidedExpertMon = Monitored::Scalar<int>("padTrackSectorSided_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), sectorsTotal);
265 auto padTimingExpertMon = Monitored::Scalar<float>("padTrackTiming_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), padTiming);
266 fill("padTiming_quad_" + std::to_string(std::abs(stEta)), padSectorSidedExpertMon, padTimingExpertMon);
267
268 ATH_MSG_DEBUG("Pad Timing: " << padTiming);
269
270 auto febMon = Monitored::Scalar<int>("padFEB"+ side + sectorStr, getFEBs(stEta,layer));
271 auto timeMon = Monitored::Scalar<int>("padTiming"+ side + sectorStr, padTiming);
272 fill("sTgcTiming", timeMon, febMon);
273 }
274
275 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Strip) {
276 channelName = "strip";
277 const std::vector<Identifier>& stripIds = prd->rdoList();
278 unsigned int csize = stripIds.size();
279
280 std::vector<short int> stripTimesVec = prd -> stripTimes();
281 std::vector<int> stripChargesVec = prd -> stripCharges();
282
283 float stripClusterTimes = 0;
284 float stripClusterCharges = 0;
285
286 for (unsigned int sIdx = 0; sIdx < csize; ++sIdx) {
287 stripClusterTimes += stripTimesVec.at(sIdx);
288 stripClusterCharges += stripChargesVec.at(sIdx);
289 }
290
291 stripClusterTimes /= stripTimesVec.size();
292
293 auto stripClusterChargesPerSideQuadMon = Monitored::Scalar<float>("stripTrackCharge_" + side + "_quad_" + std::to_string(std::abs(stEta)) + "_sector_" + std::to_string(sector) + "_layer_" + std::to_string(layer), stripClusterCharges);
294 fill("stripCharge_" + side + std::to_string(sector) + "_quad_" + std::to_string(std::abs(stEta)), stripClusterChargesPerSideQuadMon);
295
296 auto stripClusterSectorSidedMon = Monitored::Scalar<int>("stripTrackSectorSided_layer_" + std::to_string(layer), sectorsTotal);
297 auto stripClusterTimesMon = Monitored::Scalar<float>("stripTrackTiming_layer_" + std::to_string(layer), stripClusterTimes);
298 auto stripClusterSizeMon = Monitored::Scalar<unsigned int>("stripTrackClusterSize_layer_" + std::to_string(layer), csize);
299 fill("sTgcTiming", stripClusterSectorSidedMon, stripClusterTimesMon);
300 fill("padTriggerExpert", stripClusterSectorSidedMon, stripClusterSizeMon);
301
302 ATH_MSG_DEBUG("Strip Timing: " << stripClusterTimes);
303
304 auto febMon = Monitored::Scalar<int>("stripFEB"+ side + sectorStr, getFEBs(stEta,layer));
305 auto timeMon = Monitored::Scalar<int>("stripTiming"+ side + sectorStr, stripClusterTimes);
306 fill("sTgcTiming", timeMon, febMon);
307
308
309 auto stripSectorSidedExpertMon = Monitored::Scalar<int>("stripTrackSectorSided_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), sectorsTotal);
310 auto stripTimingExpertMon = Monitored::Scalar<float>("stripTrackTiming_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), stripClusterTimes);
311 fill("stripTiming_quad_" + std::to_string(std::abs(stEta)), stripSectorSidedExpertMon, stripTimingExpertMon);
312
313
314 std::optional<Trk::ResidualPull> resPull(m_residualPullCalculator -> residualPull(trkState -> measurementOnTrack(), trkState -> trackParameters(), Trk::ResidualPull::ResidualType::Biased));
315
316 if (resPull) {
317 float residual = resPull -> residual()[Trk::locX];
318 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);
319 fill("sTgcResiduals_" + side + std::to_string(sector) + "_quad_" + std::to_string(std::abs(stEta)), residualMon);
320 }
321 }
322
323 else if (channelType == sTgcIdHelper::sTgcChannelTypes::Wire) {
324 float wireGroupCharge = prd -> charge();
325 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);
326 fill("wireGroupCharge_" + side + std::to_string(sector) + "_quad_" + std::to_string(std::abs(stEta)), wireGroupChargeMon);
327
328 short int wireGroupTiming = prd -> time();
329 auto wireGroupSectorSidedMon = Monitored::Scalar<int>("wireGroupTrackSectorSided_layer_" + std::to_string(layer), sectorsTotal);
330 auto wireGroupTimingMon = Monitored::Scalar<float>("wireGroupTrackTiming_layer_" + std::to_string(layer), wireGroupTiming);
331 fill("sTgcTiming", wireGroupSectorSidedMon, wireGroupTimingMon);
332
333 auto wireSectorSidedExpertMon = Monitored::Scalar<int>("wireTrackSectorSided_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), sectorsTotal);
334 auto wireTimingExpertMon = Monitored::Scalar<float>("wireTrackTiming_quad_" + std::to_string(std::abs(stEta)) + "_layer_" + std::to_string(layer), wireGroupTiming);
335 fill("wireTiming_quad_" + std::to_string(std::abs(stEta)), wireSectorSidedExpertMon, wireTimingExpertMon);
336
337 ATH_MSG_DEBUG("Wire Timing: " << wireGroupTiming);
338
339 auto febMon = Monitored::Scalar<int>("wireFEB"+ side + sectorStr, getFEBs(stEta,layer));
340 auto timeMon = Monitored::Scalar<int>("wireTiming"+ side + sectorStr, wireGroupTiming);
341 fill("sTgcTiming", timeMon, febMon);
342 }
343 }
344 }
345 ATH_MSG_DEBUG("Off fillsTgcClusterFromTrackHistograms");
346}
347
349 ATH_MSG_DEBUG("On fillsTgcPadTriggerDataHistograms");
350 for (const Muon::NSW_PadTriggerData* rdo : *NSWpadTriggerObject) {
351 bool sideA = rdo -> sideA();
352 bool largeSector = rdo -> largeSector();
353
354 int iside = (sideA) ? 1 : 0;
355 int isize = (largeSector) ? 1 : 0;
356
357 std::string side = GeometricSectors::sTgcSide[iside];
358 std::string size = GeometricSectors::sTgcSize[isize];
359
360 size_t numberOfTriggers = rdo -> getNumberOfTriggers();
361 size_t numberOfHits = rdo -> getNumberOfHits();
362
363 for (size_t trigger = 0; trigger < numberOfTriggers; ++trigger) {
364 int triggerPhiIdsUnsigned = rdo -> getTriggerPhiIds().at(trigger);
365 int triggerBandIds = rdo -> getTriggerBandIds().at(trigger);
366 int triggerRelBCID = rdo -> getTriggerRelBcids().at(trigger);
367 int sourceId = rdo -> getSourceid();
368 int sectorNumber = sourceidToSector(sourceId, sideA);
369
370 if (triggerPhiIdsUnsigned == m_cutTriggerPhiId || triggerBandIds == m_cutTriggerBandId) continue;
371
372 int triggerPhiIds = getSignedPhiId(triggerPhiIdsUnsigned);
373
374 auto phiIdsPerSideSizeMon = Monitored::Scalar<int>("phiIds_" + side + "_" + size, triggerPhiIds);
375 auto bandIdsPerSideSizeMon = Monitored::Scalar<int>("bandIds_" + side + "_" + size, triggerBandIds);
376 fill("padTriggerExpert", phiIdsPerSideSizeMon, bandIdsPerSideSizeMon);
377
378 auto lbMon = Monitored::Scalar<int>("lb", lb);
379 auto relBCIDMon = Monitored::Scalar<int>("relBCID", triggerRelBCID);
380 auto sectorMon = Monitored::Scalar<int>("sector", sectorNumber);
381 auto numberOfTriggersMon = Monitored::Scalar<int>("numberOfTriggers", numberOfTriggers);
382 fill("Overview", lbMon, sectorMon, numberOfTriggersMon);
383 fill("padTriggerExpert", lbMon, relBCIDMon);
384
385 auto numberOfTriggersPerSectorMon = Monitored::Scalar<int>("numberOfTriggers_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), numberOfTriggers);
386 auto phiIdsSidedSizedPerSectorMon = Monitored::Scalar<int>("phiIds_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerPhiIds);
387 auto bandIdsSidedSizedPerSectorMon = Monitored::Scalar<int>("bandIds_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerBandIds);
388 auto lbPerSectorMon = Monitored::Scalar<int>("lb_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), lb);
389 auto relBCIDperSectorMon = Monitored::Scalar<int>("relBCID_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerRelBCID);
390 fill("padTriggerExpert", numberOfTriggersPerSectorMon, phiIdsSidedSizedPerSectorMon, bandIdsSidedSizedPerSectorMon, lbPerSectorMon, relBCIDperSectorMon);
391
392 auto RelBCIDPerSectorMon = Monitored::Scalar<int>("relBCID_"+ side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerRelBCID);
393 auto PhiIDPerSectorMon = Monitored::Scalar<int>("phiIds_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerPhiIds);
394 auto BandIDPerSectorMon = Monitored::Scalar<int>("bandID_" + side + "_sector_" + std::to_string(std::abs(sectorNumber)), triggerBandIds);
395 fill("padTriggerExpert", RelBCIDPerSectorMon, PhiIDPerSectorMon, BandIDPerSectorMon);
396 }
397
398 for (size_t hits = 0; hits < numberOfHits; ++hits){
399 std::optional<Identifier> status = getPadId(rdo->getSourceid(), rdo->getHitPfebs().at(hits), rdo->getHitTdsChannels().at(hits));
400 if (!status.has_value()) continue;
401 Identifier pad_id = status.value();
402
403 for (const xAOD::Muon* mu : *muonContainer) {
404 if(mu -> pt() < m_cutPt) continue;
405 if(!(mu -> author() == xAOD::Muon::Author::MuidCo || mu -> author() == xAOD::Muon::Author::MuidSA)) continue;
406
407 const xAOD::TrackParticle* meTP = mu -> trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
408 if(meTP == nullptr) continue;
409
410 const Trk::Track* meTrack = meTP -> track();
411 if(!meTrack) continue;
412
413 for(const Trk::TrackStateOnSurface* trkState : *meTrack->trackStateOnSurfaces()) {
414 std::optional<Identifier> status = getRotId(trkState);
415 if (!status.has_value()) continue;
416 Identifier rot_id = status.value();
417
418 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
419 if (channelType != sTgcIdHelper::sTgcChannelTypes::Pad) continue;
420
421
422 if (rot_id != pad_id) continue;
423
424 int sourceIds = rdo -> getSourceid();
425 int sectorNumbers = sourceidToSector(sourceIds, sideA);
426 int hitRelBCID = rdo -> getHitRelBcids().at(hits);
427 int hitpfebs = rdo -> getHitPfebs().at(hits);
428 int hitTdsChannels = rdo->getHitTdsChannels().at(hits);
429
430 std::optional<std::tuple<int, int, std::string, std::string, int>> statusPadEtaPhi = getPadEtaPhiTuple(sourceIds, hitpfebs, hitTdsChannels);
431 if (!statusPadEtaPhi.has_value()) continue;
432 std::tuple<int, int, std::string, std::string, int> padEtaPhiTuple = statusPadEtaPhi.value();
433
434 int padPhi = std::get<0>(padEtaPhiTuple);
435 int padEta = std::get<1>(padEtaPhiTuple);
436 std::string sideName = std::get<2>(padEtaPhiTuple);
437 std::string sizeName = std::get<3>(padEtaPhiTuple);
438 int layer = std::get<4>(padEtaPhiTuple);
439
440 auto padPhiMon = Monitored::Scalar<int>("padPhi_" + sideName + "_" + sizeName + "_layer_" + std::to_string(layer), padPhi);
441 auto padEtaMon = Monitored::Scalar<int>("padEta_" + sideName + "_" + sizeName + "_layer_" + std::to_string(layer), padEta);
442 fill("padTriggerOccupancy", padPhiMon, padEtaMon);
443
444 auto hitRelBCIDmon = Monitored::Scalar<int>("hitRelBCID", hitRelBCID);
445 auto hitPfebsMon = Monitored::Scalar<int>("hitPfebs", hitpfebs);
446 auto sectorMon = Monitored::Scalar<int>("sector", sectorNumbers);
447 fill("padTriggerExpert", hitRelBCIDmon, hitPfebsMon, sectorMon);
448
449 auto hitRelBCIDPerSectorMon = Monitored::Scalar<int>("hitRelBCID_"+side+"_sector_"+std::to_string(std::abs(sectorNumbers)), hitRelBCID);
450 auto hitpfebsPerSectorMon = Monitored::Scalar<int>("hitPfebs_"+side+"_sector_"+std::to_string(std::abs(sectorNumbers)), hitpfebs);
451 fill("padTriggerExpert", hitRelBCIDPerSectorMon, hitpfebsPerSectorMon);
452 } // end TrackStateOnSurface loop
453 } // end Muon loop
454 } // end NSW_PadTriggerData loop
455 }// end Number of Hits loop
456 ATH_MSG_DEBUG("Off fillsTgcPadTriggerDataHistograms");
457}
458
460 ATH_MSG_DEBUG("On fillsTgcEfficiencyHistograms");
461 for (const xAOD::Muon* mu : *muonContainer) {
462 if (mu -> pt() < m_cutPt) continue;
463 if (!(mu -> author() == xAOD::Muon::Author::MuidCo || mu -> author() == xAOD::Muon::Author::MuidSA)) continue;
464
465 struct sTGCeff {
466 std::array<int, 8> quadMultiplet{};
467 std::array<int, 8> layerMultiplet{};
468 std::array<float, 8> xPosMultiplet{};
469 std::array<float, 8> yPosMultiplet{};
470 std::array<float, 8> zPosMultiplet{};
471 };
472
473 std::array<std::array<sTGCeff, 16>, 2> effPlots; // Store active layers per side (2) and sectors (16)
474
475 const xAOD::TrackParticle* meTP = mu -> trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
476 if(meTP == nullptr) continue;
477
478 const Trk::Track* meTrack = meTP -> track();
479 if(!meTrack) continue;
480
481 for(const Trk::TrackStateOnSurface* trkState : *meTrack->trackStateOnSurfaces()) {
482 std::optional<Identifier> status = getRotId(trkState);
483 if (!status.has_value()) continue;
484
485 Identifier rot_id = status.value();
486
487 int channelType = m_idHelperSvc -> stgcIdHelper().channelType(rot_id);
488 if (channelType != sTgcIdHelper::sTgcChannelTypes::Strip) continue;
489
490 int stEta = m_idHelperSvc -> stgcIdHelper().stationEta(rot_id);
491 int iside = (stEta > 0) ? 1 : 0;
492 int sector = m_idHelperSvc -> sector(rot_id);
493 int multi = m_idHelperSvc -> stgcIdHelper().multilayer(rot_id);
494 int gap = m_idHelperSvc -> stgcIdHelper().gasGap(rot_id);
495 int layer = getLayer(multi, gap);
496
497 const Amg::Vector2D& positionsMultiplet = (trkState) -> trackParameters() -> localPosition();
498 float xPosStripInMultipletLocal = positionsMultiplet.x();
499 float yPosStripInMultipletLocal = positionsMultiplet.y();
500
501 Amg::Vector2D localPos(xPosStripInMultipletLocal, yPosStripInMultipletLocal);
502 Amg::Vector3D globalPos(Amg::Vector3D::Zero());
503 const MuonGM::sTgcReadoutElement* sTgcReadoutObjectStrip = muonDetectorManagerObject -> getsTgcReadoutElement(rot_id);
504 sTgcReadoutObjectStrip -> surface(rot_id).localToGlobal(localPos, Amg::Vector3D::Zero(), globalPos);
505 float xPosStripInMultiplet = globalPos.x();
506 float yPosStripInMultiplet = globalPos.y();
507
508 Amg::Vector3D posStripGlobal{Amg::Vector3D::Zero()};
509 (muonDetectorManagerObject -> getsTgcReadoutElement(rot_id)) -> stripGlobalPosition(rot_id, posStripGlobal);
510 float zPosStripInMultiplet = posStripGlobal.z();
511
512 auto& sTGCelements = effPlots[iside][sector - 1];
513
514 sTGCelements.quadMultiplet.at(layer - 1) = stEta;
515 sTGCelements.layerMultiplet.at(layer - 1) = layer;
516 sTGCelements.xPosMultiplet.at(layer - 1) = xPosStripInMultiplet;
517 sTGCelements.yPosMultiplet.at(layer - 1) = yPosStripInMultiplet;
518 sTGCelements.zPosMultiplet.at(layer - 1) = zPosStripInMultiplet;
519 } // end track state loop
520
521 for (unsigned int isideIndex = 0; isideIndex <= 1; ++isideIndex) {
522 for (unsigned int sectorIndex = 1; sectorIndex <= 16; ++sectorIndex) {
523 auto& sTGCelements = effPlots[isideIndex][sectorIndex - 1];
524 bool fourOutEight = std::count_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](int i) { return i != 0; }) >= 4;
525 bool oneRefLayer = std::count_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](int i) { return i != 0; }) >= 1;
526
527 if (fourOutEight) {
528 for (auto layerIndex = static_cast<std::array<int, 8>::size_type>(1); layerIndex <= sTGCelements.layerMultiplet.size(); ++layerIndex) {
529 if (sTGCelements.layerMultiplet.at(layerIndex - 1) == 0) continue;
530
531 float xPos = sTGCelements.xPosMultiplet.at(layerIndex - 1);
532 float yPos = sTGCelements.yPosMultiplet.at(layerIndex - 1);
533 float rPos = std::hypot(xPos, yPos);
534
535 std::string side = GeometricSectors::sTgcSide[isideIndex];
536
537 auto effQuestionMon = Monitored::Scalar<bool>("hitLayer", true);
538 auto rPosStripMon = Monitored::Scalar<float>("rPosStrip_" + side + "_sector_" + std::to_string(sectorIndex) + "_layer_" + std::to_string(layerIndex), rPos);
539 fill("rPosStrip_" + side + std::to_string(sectorIndex), rPosStripMon, effQuestionMon);
540 //GlobalRGroup
541
542 auto xPosStripmon = Monitored::Scalar<float>("xPosStrip_" + side + "_layer_" + std::to_string(layerIndex), xPos);
543 auto yPosStripmon = Monitored::Scalar<float>("yPosStrip_" + side + "_layer_" + std::to_string(layerIndex), yPos);
544 fill("padTriggerShifter", xPosStripmon, yPosStripmon, effQuestionMon);
545 //StripEfficiency
546 } // End of loop over efficient layers
547 } // End of efficient case
548
549 else if (!fourOutEight && oneRefLayer) {
550 auto refLayerIndex = std::distance(sTGCelements.layerMultiplet.begin(), std::find_if(sTGCelements.layerMultiplet.begin(), sTGCelements.layerMultiplet.end(), [](int i) {return i != 0;}));
551
552 for (auto layerIndex = static_cast<std::array<int, 8>::size_type>(1); layerIndex <= sTGCelements.layerMultiplet.size(); ++layerIndex) {
553 if (sTGCelements.layerMultiplet.at(layerIndex - 1) != 0) continue;
554 int quad = sTGCelements.quadMultiplet.at(refLayerIndex);
555 int multi = (layerIndex <= static_cast<std::array<int, 8>::size_type>(m_idHelperSvc->stgcIdHelper().gasGapMax())) ? m_idHelperSvc->stgcIdHelper().multilayerMin() : m_idHelperSvc->stgcIdHelper().multilayerMax();
556 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());
557
558 bool isValid = false;
559 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);
560
561 if (!isValid) {
562 ATH_MSG_WARNING("Identifier of probe layer is invalid");
563 continue;
564 }
565
566 Amg::Vector3D posProbe{Amg::Vector3D::Zero()};
567 (muonDetectorManagerObject -> getsTgcReadoutElement(idProbe)) -> stripGlobalPosition(idProbe, posProbe);
568 float posZprobe = posProbe.z();
569
570 float xSlope = sTGCelements.xPosMultiplet.at(refLayerIndex)/sTGCelements.zPosMultiplet.at(refLayerIndex);
571 float ySlope = sTGCelements.yPosMultiplet.at(refLayerIndex)/sTGCelements.zPosMultiplet.at(refLayerIndex);
572
573 float xPos = sTGCelements.xPosMultiplet.at(refLayerIndex) + xSlope*(posZprobe - sTGCelements.zPosMultiplet.at(refLayerIndex));
574 float yPos = sTGCelements.yPosMultiplet.at(refLayerIndex) + ySlope*(posZprobe - sTGCelements.zPosMultiplet.at(refLayerIndex));
575 float rPos = std::hypot(xPos, yPos);
576
577 std::string side = GeometricSectors::sTgcSide[isideIndex];
578
579 auto effQuestionMon = Monitored::Scalar<bool>("hitLayer", false);
580
581 auto rPosStripProbemon = Monitored::Scalar<float>("rPosStrip_" + side + "_sector_" + std::to_string(sectorIndex) + "_layer_" + std::to_string(layerIndex), rPos);
582 fill("rPosStrip_" + side + std::to_string(sectorIndex), rPosStripProbemon, effQuestionMon);
583
584 auto xPosStripProbemon = Monitored::Scalar<float>("xPosStrip_" + side + "_layer_" + std::to_string(layerIndex), xPos);
585 auto yPosStripProbemon = Monitored::Scalar<float>("yPosStrip_" + side + "_layer_" + std::to_string(layerIndex), yPos);
586 fill("padTriggerShifter", xPosStripProbemon, yPosStripProbemon, effQuestionMon);
587 } // End of loop over probe layers
588 } // End of non-efficient case
589 } // End of sector loop
590 } // End of iside loop
591 } // End muon container loop
592 ATH_MSG_DEBUG("Off fillsTgcClusterFromTrackHistograms");
593} // end stgc strip function
594
596 ATH_MSG_DEBUG("On fillsTgcPadTriggerEfficiencyHistograms");
597 for (const xAOD::Muon* mu : *muonContainer) {
598 if (!(mu -> author() == xAOD::Muon::Author::MuidCo || mu -> author() == xAOD::Muon::Author::MuidSA)) continue;
599 if (mu -> pt() < m_cutPt) continue;
600 if (std::abs(mu -> eta()) < m_cutEtaDown || std::abs(mu -> eta()) > m_cutEtaUp) continue;
601
602 double recoMuonEta = mu -> eta();
603 double recoMuonPhi = mu -> phi();
604
605 std::string sideRecoMuon = GeometricSectors::sTgcSide[recoMuonEta > 0];
606
607 std::string minSideRecoMuon = "", minSideTrigger = "";
608
609 double minTriggerEta = 999., minTriggerPhi = 999.,
610 minRecoEta = 999., minRecoPhi = 999., minDeltaR = 999.;
611
612 auto minDeltaRtrigIt = -1;
613
614 for (const Muon::NSW_PadTriggerData* rdo : *NSWpadTriggerObject) {
615 bool sideA = rdo -> sideA();
616 bool largeSector = rdo -> largeSector();
617 std::string sideTrigger = GeometricSectors::sTgcSide[sideA];
618 size_t numberOfTriggers = rdo -> getNumberOfTriggers();
619
620 for (size_t trigger = 0; trigger < numberOfTriggers; ++trigger) {
621 int triggerPhiIdsUnsigned = rdo -> getTriggerPhiIds().at(trigger);
622 int triggerBandIds = rdo -> getTriggerBandIds().at(trigger);
623 int sourceId = rdo -> getSourceid();
624
625 if (triggerPhiIdsUnsigned == m_cutTriggerPhiId || triggerBandIds == m_cutTriggerBandId) continue;
626
627 int triggerPhiIds = getSignedPhiId(triggerPhiIdsUnsigned);
628 std::optional<double> status = bandId2eta(triggerBandIds, largeSector, sideA, muonDetectorManagerObject);
629 if (!status.has_value()) continue;
630 double triggerBandIdToEta = status.value();
631 double triggerPhiIDtoPhi = triggersectorphiid2phi(sourceId, triggerPhiIds);
632 double deltaR = xAOD::P4Helpers::deltaR(recoMuonEta, recoMuonPhi, triggerBandIdToEta, triggerPhiIDtoPhi);
633
634 if (std::abs(triggerBandIdToEta) < m_cutEtaDown || std::abs(triggerBandIdToEta) > m_cutEtaUp) continue;
635
636 if (sideRecoMuon == sideTrigger) {
637 if (deltaR < minDeltaR) {
638 minSideRecoMuon = sideRecoMuon;
639 minSideTrigger = sideTrigger;
640 minTriggerEta = triggerBandIdToEta;
641 minTriggerPhi = triggerPhiIDtoPhi;
642 minRecoEta = recoMuonEta;
643 minRecoPhi = recoMuonPhi;
644 minDeltaR = deltaR;
645 minDeltaRtrigIt = trigger;
646 }
647 }
648 } // end number of triggers loop
649 } // end pad trigger data container loop
650
651 bool muonRecoTriggerMatch = false;
652
653 if (minDeltaRtrigIt != -1) {
654 if (minDeltaR < m_minDeltaR) {
655 muonRecoTriggerMatch = true;
656 }
657 }
658
659 auto deltaRmon = Monitored::Scalar<double>("deltaR", minDeltaR);
660 fill("Overview", deltaRmon);
661
662 auto etaRecoMuonMon = Monitored::Scalar<double>("etaRecoMuon", minRecoEta);
663 auto phiRecoMuonMon = Monitored::Scalar<double>("phiRecoMuon", minRecoPhi);
664 fill("Overview", etaRecoMuonMon, phiRecoMuonMon);
665
666 auto etaPadTriggerMon = Monitored::Scalar<double>("etaPadTrigger", minTriggerEta);
667 auto phiPadTriggerMon = Monitored::Scalar<double>("phiPadTrigger", minTriggerPhi);
668 fill("Overview", etaPadTriggerMon, phiPadTriggerMon);
669
670 auto phiRecoMuonSidedMon = Monitored::Scalar<double>("phiRecoMuon_" + minSideRecoMuon, minRecoPhi);
671 auto phiPadTriggerSidedMon = Monitored::Scalar<double>("phiPadTrigger_" + minSideTrigger, minTriggerPhi);
672 fill("Overview", phiRecoMuonSidedMon, phiPadTriggerSidedMon);
673
674 auto muonRecoTriggerMatchMon = Monitored::Scalar<bool>("muonRecoTriggerMatch", muonRecoTriggerMatch);
675 auto etaRecoMuonEffMon = Monitored::Scalar<double>("etaRecoMuonEff", minRecoEta);
676 auto phiRecoMuonEffMon = Monitored::Scalar<double>("phiRecoMuonEff", minRecoPhi);
677 fill("Overview", muonRecoTriggerMatchMon, etaRecoMuonEffMon, phiRecoMuonEffMon);
678
679 } // end muon container loop
680 ATH_MSG_DEBUG("Off fillsTgcPadTriggerEfficiencyHistograms");
681}
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
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
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...
Class to represent calibrated clusters formed from TGC strips.
Class to represent sTgc measurements.
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
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".