ATLAS Offline Software
Loading...
Searching...
No Matches
MuonHitSummaryTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include <iostream>
8
10#include "TrkTrack/Track.h"
13
14namespace Muon {
15
16 MuonHitSummaryTool::MuonHitSummaryTool(const std::string& ty, const std::string& na, const IInterface* pa) : AthAlgTool(ty, na, pa) {
17 declareInterface<IMuonHitSummaryTool>(this);
18 }
19
21 ATH_CHECK(m_idHelperSvc.retrieve());
22 if (!m_summaryHelperTool.empty()) ATH_CHECK(m_summaryHelperTool.retrieve());
23 if (!m_printer.empty()) ATH_CHECK(m_printer.retrieve());
24 ATH_CHECK(m_edmHelperSvc.retrieve());
25 return StatusCode::SUCCESS;
26 }
27
29 // check whether helper tool set
30 if (m_summaryHelperTool.empty()) return;
31
32 const EventContext& ctx = Gaudi::Hive::currentContext(); // FIXME: should be passed as argument
33
34 Trk::TrackSummary tmpSummary;
35 m_summaryHelperTool->addDetailedTrackSummary(ctx, track, tmpSummary);
36 if (!tmpSummary.muonTrackSummary()) {
37 ATH_MSG_WARNING("Could not create MuonTrackSummary, please enable the creation in " << m_summaryHelperTool);
38 return;
39 }
40 muonSummary = *tmpSummary.muonTrackSummary();
41 }
42
44 if (msgLvl(MSG::DEBUG)) ATH_MSG_DEBUG(m_printer->print(track) << std::endl << m_printer->printStations(track));
45
46 // check if the track already has a MuonTrackSummary, if so use it
47 if (track.trackSummary() && track.trackSummary()->muonTrackSummary()) return summary(*track.trackSummary()->muonTrackSummary());
48
49 // calculate muon summary from track
50 Trk::MuonTrackSummary muonSummary;
51 getMuonTrackSummary(muonSummary, track);
52 return summary(muonSummary);
53 }
54
56 // check if the track summary has a MuonTrackSummary, if so use it
57 if (sum.muonTrackSummary()) return summary(*sum.muonTrackSummary());
58 return {};
59 }
60
63
64 std::map<int, int> sectorLayerCounts; // count hits per sector
65
66 // loop over chambers
67 std::vector<Trk::MuonTrackSummary::ChamberHitSummary>::const_iterator chit = s.chamberHitSummary().begin();
68 std::vector<Trk::MuonTrackSummary::ChamberHitSummary>::const_iterator chit_end = s.chamberHitSummary().end();
69 for (; chit != chit_end; ++chit) {
70 const Identifier& chId = chit->chamberId();
71 bool isMdt = m_idHelperSvc->isMdt(chId);
72 bool isCsc = m_idHelperSvc->isCsc(chId);
73 bool isMM = m_idHelperSvc->isMM(chId);
74 bool issTgc = m_idHelperSvc->issTgc(chId);
75 bool isEIPrec = isCsc || isMM || issTgc;
76
77 // only account for sectors if chamber has eta hits
78 if ((isMdt && chit->nhits() > 0) || (isEIPrec && chit->netaHits() > 0)) {
79 int sector = m_idHelperSvc->sector(chId);
80 if (isMdt)
81 sectorLayerCounts[sector] += chit->nhits();
82 else
83 sectorLayerCounts[sector] += chit->netaHits();
84 sum.sectors.insert(sector);
85 }
86
87 // only account for phi layers if not an MDT and has phi hits
88 if (!isMdt && chit->nphiHits() > 0) {
90 sum.phiLayers.insert(index);
91 }
92
93 MuonStationIndex::StIndex index = m_idHelperSvc->stationIndex(chId);
94 HitSummary& hitSummary = sum.stationLayers[index];
95 hitSummary.isEndcap = m_idHelperSvc->isEndcap(chId);
96 hitSummary.isSmall = m_idHelperSvc->isSmallChamber(chId);
97 if (isMdt) {
98 hitSummary.nprecisionHits += chit->nhits();
99 hitSummary.nprecisionHoles += chit->nholes();
100 hitSummary.nprecisionOutliers += chit->noutliers();
101 hitSummary.nprecisionCloseHits += chit->ncloseHits();
102 hitSummary.nprecisionGoodHits += chit->ngoodHits();
103 hitSummary.noutBoundsHits += chit->noutBoundsHits();
104 } else {
105 if (isEIPrec) {
106 hitSummary.nprecisionHits += chit->netaHits();
107 hitSummary.nprecisionGoodHits += chit->netaHits();
108 hitSummary.nprecisionHoles += chit->etaProjection().nholes;
109 hitSummary.nprecisionOutliers += chit->etaProjection().noutliers;
110 hitSummary.nprecisionCloseHits += chit->etaProjection().ncloseHits;
111 } else {
112 if (chit->netaHits() > 0) ++hitSummary.netaTriggerLayers;
113 }
114 if (chit->nphiHits() > 0) ++hitSummary.nphiLayers;
115 if (chit->nphiHits() > 0 && chit->netaHits() > 0) ++hitSummary.netaPhiLayers;
116
117 if (!isEIPrec && chit->etaProjection().nholes > 0 && chit->etaProjection().nhits == 0) ++hitSummary.netaTriggerHoleLayers;
118 if (chit->phiProjection().nholes > 0 && chit->phiProjection().nhits == 0) ++hitSummary.nphiHoleLayers;
119 }
120 }
121
122 int maxHits = -1;
123 int mainSec = -1;
124 std::map<int, int>::iterator secIt = sectorLayerCounts.begin();
125 std::map<int, int>::iterator secIt_end = sectorLayerCounts.end();
126 for (; secIt != secIt_end; ++secIt) {
127 if (secIt->second > maxHits) {
128 maxHits = secIt->second;
129 mainSec = secIt->first;
130 }
131 }
132 sum.mainSector = mainSec;
133
135
136 if (msgLvl(MSG::DEBUG)) ATH_MSG_DEBUG(sum.dump());
137
138 return sum;
139 }
140
142 sum.nprecisionLayers = 0;
143 sum.nprecisionGoodLayers = 0;
144 sum.nprecisionHoleLayers = 0;
145 sum.nphiLayers = 0;
146 sum.ntrigEtaLayers = 0;
147 sum.nphiHoleLayers = 0;
148 sum.ntrigEtaHoleLayers = 0;
149
150 std::map<MuonStationIndex::StIndex, Muon::IMuonHitSummaryTool::HitSummary>::const_iterator hsit = sum.stationLayers.begin();
151 std::map<MuonStationIndex::StIndex, Muon::IMuonHitSummaryTool::HitSummary>::const_iterator hsit_end = sum.stationLayers.end();
152 for (; hsit != hsit_end; ++hsit) {
153 const Muon::IMuonHitSummaryTool::HitSummary& hitSummary = hsit->second;
154 sum.ntrigEtaLayers += hitSummary.netaTriggerLayers;
155 sum.nphiHoleLayers += hitSummary.nphiHoleLayers;
156 sum.ntrigEtaHoleLayers += hitSummary.netaTriggerHoleLayers;
157 if (hitSummary.nprecisionHits > 2) {
158 ++sum.nprecisionLayers;
159 if (hitSummary.nprecisionGoodHits > 2) {
160 ++sum.nprecisionGoodLayers;
161 sum.isEndcap = hitSummary.isEndcap;
162 sum.isSmall = hitSummary.isSmall;
163 }
164 } else if (hitSummary.nprecisionHoles > 2)
165 ++sum.nprecisionHoleLayers;
166 }
167 sum.nphiLayers = sum.phiLayers.size();
168 }
169
173
174 IMuonHitSummaryTool::CompactSummary MuonHitSummaryTool::summary(const std::vector<const Muon::MuonSegment*>& segments) const {
175 std::vector<const Trk::MeasurementBase*> rioVec;
176 std::vector<const Muon::MuonSegment*>::const_iterator sit = segments.begin();
177 std::vector<const Muon::MuonSegment*>::const_iterator sit_end = segments.end();
178 for (; sit != sit_end; ++sit)
179 rioVec.insert(rioVec.end(), (*sit)->containedMeasurements().begin(), (*sit)->containedMeasurements().end());
180 return summary(rioVec);
181 }
182
183 IMuonHitSummaryTool::CompactSummary MuonHitSummaryTool::summary(const std::vector<const Trk::MeasurementBase*>& rioVec) const {
184 CompactSummary sum;
185 std::map<int, int> sectorLayerCounts; // count hits per sector
186
187 std::map<MuonStationIndex::StIndex, std::map<MuonStationIndex::PhiIndex, std::pair<int, int> > > countLayersPerStation;
188
189 std::vector<const Trk::MeasurementBase*>::const_iterator it = rioVec.begin();
190 std::vector<const Trk::MeasurementBase*>::const_iterator it_end = rioVec.end();
191 for (; it != it_end; ++it) {
192 Identifier id = m_edmHelperSvc->getIdentifier(**it);
193 if (!id.is_valid() || !m_idHelperSvc->isMuon(id)) continue;
194
195 bool isMdt = m_idHelperSvc->isMdt(id);
196 bool isCsc = m_idHelperSvc->isCsc(id);
197 bool measuresPhi = m_idHelperSvc->measuresPhi(id);
198
199 // only account for sectors if chamber has eta hits
200 if (isMdt || (isCsc && !measuresPhi)) {
201 int sector = m_idHelperSvc->sector(id);
202 if (isMdt) ++sectorLayerCounts[sector];
203 if (isCsc) ++sectorLayerCounts[sector];
204 sum.sectors.insert(sector);
205 }
206
207 // only account for phi layers if not an MDT and has phi hits
208 if (!isMdt && measuresPhi) {
210 sum.phiLayers.insert(index);
211 }
212
214 HitSummary& hitSummary = sum.stationLayers[index];
215 if (isMdt || (isCsc && !measuresPhi)) ++hitSummary.nprecisionHits;
216
217 if (!isMdt) {
218 MuonStationIndex::PhiIndex pindex = m_idHelperSvc->phiIndex(id);
219 std::pair<int, int> etaPhiCount = countLayersPerStation[index][pindex];
220 if (measuresPhi)
221 ++etaPhiCount.first;
222 else
223 ++etaPhiCount.second;
224 }
225 }
226
227 int maxHits = -1;
228 int mainSec = -1;
229 std::map<int, int>::iterator secIt = sectorLayerCounts.begin();
230 std::map<int, int>::iterator secIt_end = sectorLayerCounts.end();
231 for (; secIt != secIt_end; ++secIt) {
232 if (secIt->second > maxHits) {
233 maxHits = secIt->second;
234 mainSec = secIt->first;
235 }
236 }
237 sum.mainSector = mainSec;
238
239 std::map<MuonStationIndex::StIndex, std::map<MuonStationIndex::PhiIndex, std::pair<int, int> > >::iterator sit =
240 countLayersPerStation.begin();
241 std::map<MuonStationIndex::StIndex, std::map<MuonStationIndex::PhiIndex, std::pair<int, int> > >::iterator sit_end =
242 countLayersPerStation.end();
243 for (; sit != sit_end; ++sit) {
244 HitSummary& hitSummary = sum.stationLayers[sit->first];
245
246 std::map<MuonStationIndex::PhiIndex, std::pair<int, int> >::iterator pit = sit->second.begin();
247 std::map<MuonStationIndex::PhiIndex, std::pair<int, int> >::iterator pit_end = sit->second.end();
248 for (; pit != pit_end; ++pit) {
249 if (pit->second.first != 0) ++hitSummary.nphiLayers;
250 if (pit->second.second != 0 && pit->first != MuonStationIndex::PhiIndex::CSC) ++hitSummary.netaTriggerLayers;
251 if (pit->second.second != 0 && pit->second.first != 0) ++hitSummary.netaPhiLayers;
252 }
253 }
255 return sum;
256 }
257
258} // namespace Muon
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
bool msgLvl(const MSG::Level lvl) const
ToolHandle< Trk::ITrackSummaryHelperTool > m_summaryHelperTool
PublicToolHandle< MuonEDMPrinterTool > m_printer
virtual CompactSummary summary(const Trk::Track &track) const
Calculate compact summary.
ServiceHandle< IMuonEDMHelperSvc > m_edmHelperSvc
MuonHitSummaryTool(const std::string &, const std::string &, const IInterface *)
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
void getMuonTrackSummary(Trk::MuonTrackSummary &muonSummary, const Trk::Track &track) const
helper function to calculate MuonTrackSummary from track
static void calculateSummaryCounts(CompactSummary &sum)
This is the common class for 3D segments used in the muon spectrometer.
Detailed track summary for the muon system Give access to hit counts per chamber.
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
A summary of the information contained by a track.
const MuonTrackSummary * muonTrackSummary() const
returns a pointer to the MuonTrackSummary if available
StIndex
enum to classify the different station layers in the muon spectrometer
PhiIndex
enum to classify the different phi layers in the muon spectrometer
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Definition index.py:1
unsigned int nprecisionHoles
number of paired eta/phi trigger layers
unsigned int nphiHoleLayers
number of eta trigger layer holes
unsigned int nprecisionCloseHits
number of outliers hits
unsigned int netaTriggerHoleLayers
number of precision holes
unsigned int noutBoundsHits
number of close hits hits
unsigned int nprecisionGoodHits
number of precision hits
unsigned int netaTriggerLayers
number of precision hits that are not deweighted
bool isEndcap
number of out of bounds hits
unsigned int netaPhiLayers
number of phi layers
unsigned int nprecisionOutliers
number of phi layer holes
unsigned int nphiLayers
number of eta trigger layers