ATLAS Offline Software
MuonLayerAmbiguitySolverTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
10 
11 namespace Muon {
12 
13  MuonLayerAmbiguitySolverTool::MuonLayerAmbiguitySolverTool(const std::string& type, const std::string& name, const IInterface* parent) :
15  declareInterface<IMuonLayerAmbiguitySolverTool>(this);
16  }
17 
19  ATH_CHECK(m_segmentSelector.retrieve());
20  ATH_CHECK(m_segmentMatchingTool.retrieve());
21  ATH_CHECK(m_muonTrackBuilder.retrieve());
22  ATH_CHECK(m_printer.retrieve());
23 
24  return StatusCode::SUCCESS;
25  }
26 
27  void MuonLayerAmbiguitySolverTool::resolveOverlaps(const EventContext& ctx, const std::vector<MuonLayerRecoData>& allLayers,
28  std::vector<MuonCandidate>& resolvedCandidates) const {
29  // re-organise data to allow hash based access, resolve small large overlaps
30  std::vector<std::vector<MuonLayerIntersection> > muonLayerDataHashVec;
31  buildLayerVec(ctx, allLayers, muonLayerDataHashVec);
32 
33  // build candidate by selecting seeds and extending them
34  unsigned int nseeds = 0; // counter for number of seeds up to now
35  std::set<const MuonSegment*> usedSegments; // keep track of the segments already used
36  std::vector<MuonStationIndex::StIndex> inverseSeedLayerOrder = {MuonStationIndex::BO, MuonStationIndex::BI, MuonStationIndex::BM,
39  while (nseeds < m_maxSeeds) {
40  // first get a seed
41  MuonLayerIntersection layerIntersection;
42  if (!getNextSeed(muonLayerDataHashVec, usedSegments, inverseSeedLayerOrder, layerIntersection)) {
43  ATH_MSG_VERBOSE("No more seeds, total used seeds " << nseeds);
44  break;
45  }
46 
47  // create first candidate from seed and extend it
48  std::vector<MuonLayerIntersection> layerIntersections = {layerIntersection};
49  std::vector<MuonCandidate> candidates = {MuonCandidate(std::move(layerIntersections))};
50  if (extendCandidatesWithLayers(ctx, candidates, muonLayerDataHashVec, inverseSeedLayerOrder)) {
51  // add candidates to output list
52  ATH_MSG_DEBUG(" Completed seed extension " << candidates.size());
53  if (msgLvl(MSG::VERBOSE)) {
54  for (const auto& candidate : candidates) {
55  msg(MSG::VERBOSE) << " Candidate with layers " << candidate.layerIntersections.size();
56  for (const auto& entry : candidate.layerIntersections) {
57  msg(MSG::VERBOSE) << std::endl << " " << m_printer->print(*entry.segment);
58  }
59  }
61  }
62 
63  // add all segments on the candidates to the exlusion list
64  for (const auto& candidate : candidates) {
65  for (const auto& layer : candidate.layerIntersections) { usedSegments.insert(layer.segment.get()); }
66  }
67  resolvedCandidates.insert(resolvedCandidates.end(), std::make_move_iterator(candidates.begin()),
68  std::make_move_iterator(candidates.end()));
69  }
70  ++nseeds;
71  }
72 
73  ATH_MSG_DEBUG("Completed ambiguity solving using " << nseeds << " seeds, resulting in " << resolvedCandidates.size()
74  << " track candidates ");
75  }
76 
78  const EventContext& ctx, std::vector<MuonCandidate>& candidates,
79  const std::vector<std::vector<MuonLayerIntersection> >& muonLayerDataHashVec,
80  const std::vector<MuonStationIndex::StIndex>& inverseSeedLayerOrder) const {
81  // break recursive call chain once we processed all layers
82  if (inverseSeedLayerOrder.empty()) return true;
83 
84  ATH_MSG_VERBOSE("extendCandidates " << candidates.size() << " remaining layers " << inverseSeedLayerOrder.size());
85 
86  // get data in current layer
87  MuonStationIndex::StIndex currentStIndex = inverseSeedLayerOrder.back();
88  const std::vector<MuonLayerIntersection>& layerIntersections = muonLayerDataHashVec[currentStIndex];
89  if (!layerIntersections.empty()) {
90  // store new MuonCandidates
91  std::vector<MuonCandidate> newCandidates;
92 
93  // loop over candidates
94  for (MuonCandidate& candidate : candidates) {
95  // if more than one segment is selected in the layer, create a new candidate
96  unsigned int selectedSegmentsInLayer = 0;
97  // loop over data in layer
98  for (const MuonLayerIntersection& layerIntersection : layerIntersections) {
99  // match segment to candidate. Segment pairs with the same identifier are
100  // excluded from the beginning
101  if (match(ctx, candidate, layerIntersection)) {
102  // if first add to existing candidate, else create a new candidate
103  if (selectedSegmentsInLayer == 0) {
104  candidate.layerIntersections.push_back(layerIntersection);
105  } else {
106  MuonCandidate newCandidate = candidate;
108  newCandidate.layerIntersections.back() = layerIntersection;
109  newCandidates.emplace_back(std::move(newCandidate));
110  }
111  ++selectedSegmentsInLayer;
112  }
113  }
114  }
115  // add new candidates to list
116  if (!newCandidates.empty()) {
117  ATH_MSG_VERBOSE("Found multiple solutions, add new candidates " << newCandidates.size());
118  candidates.insert(candidates.end(), std::make_move_iterator(newCandidates.begin()),
119  std::make_move_iterator(newCandidates.end()));
120  }
121  }
122 
123  // remove the current layer and call extendCandidatesWithLayers for the next layer
124  std::vector<MuonStationIndex::StIndex> newInverseSeedLayerOrder = inverseSeedLayerOrder;
125  newInverseSeedLayerOrder.pop_back();
126  return extendCandidatesWithLayers(ctx, candidates, muonLayerDataHashVec, newInverseSeedLayerOrder);
127  }
128 
129  bool MuonLayerAmbiguitySolverTool::match(const EventContext& ctx, const MuonCandidate& candidate,
130  const MuonLayerIntersection& layerIntersection) const {
131  // loop over layers and match each segment to the new one, if any fails, fail the combination
132  for (const Muon::MuonLayerIntersection& layer : candidate.layerIntersections) {
133  if (!m_segmentMatchingTool->match(ctx, *layer.segment, *layerIntersection.segment)) return false;
134  }
135  return true;
136  }
137 
138  bool MuonLayerAmbiguitySolverTool::getNextSeed(const std::vector<std::vector<MuonLayerIntersection> >& muonLayerDataHashVec,
139  std::set<const MuonSegment*>& usedSegments,
140  std::vector<MuonStationIndex::StIndex>& inverseSeedLayerOrder,
141  MuonLayerIntersection& layerIntersection) const {
142  ATH_MSG_VERBOSE("getNextSeed, remaining layers " << inverseSeedLayerOrder.size());
143  // loop over the inverse seed layers
144  std::vector<MuonStationIndex::StIndex>::const_reverse_iterator rit = inverseSeedLayerOrder.rbegin();
145  std::vector<MuonStationIndex::StIndex>::const_reverse_iterator rit_end = inverseSeedLayerOrder.rend();
146  for (; rit != rit_end; ++rit) {
147  // loop over segments and find the next 'good' one that was not used yet
148  for (const MuonLayerIntersection& muonLayerIntersection : muonLayerDataHashVec[*rit]) {
150  if (muonLayerIntersection.quality < m_seedQualityThreshold) continue;
151  // only consider once
152  const MuonSegment* segment = muonLayerIntersection.segment.get();
153  if (usedSegments.count(segment)) continue;
154  usedSegments.insert(segment);
155 
156  // return result
157  layerIntersection = muonLayerIntersection;
158  ATH_MSG_VERBOSE("Selected seed " << m_printer->print(*segment));
159  return true;
160  }
161  // if we get here, we processed all the possible seeds in the layer so we can remove it from the list
162  inverseSeedLayerOrder.pop_back();
163  }
164  return false;
165  }
166 
167  void MuonLayerAmbiguitySolverTool::buildLayerVec(const EventContext& ctx, const std::vector<MuonLayerRecoData>& allLayers,
168  std::vector<std::vector<MuonLayerIntersection> >& muonLayerDataHashVec) const {
169  // clear and resize hash vector, initialize with null_ptr
170  muonLayerDataHashVec.clear();
171  muonLayerDataHashVec.resize(MuonStationIndex::StIndexMax);
172 
173  // loop over layers
174  for (const MuonLayerRecoData& layer : allLayers) {
175  const MuonLayerSurface& layerSurface = layer.intersection.layerSurface;
177 
178  // create layer intersections
179  std::vector<MuonLayerIntersection> layerIntersections;
180  layerIntersections.reserve(layer.segments.size());
181  for (const std::shared_ptr<const MuonSegment>& segment : layer.segments) {
182  // get quality and skip bad ones
183  int quality = m_segmentSelector->quality(*segment);
184  if (quality < m_minSegmentQuality) continue;
185  layerIntersections.emplace_back(layer.intersection, segment, quality);
186  }
187 
188  // if there are no segments yet in the layer, directly add them
189  if (muonLayerDataHashVec[stIndex].empty()) {
190  muonLayerDataHashVec[stIndex] = std::move(layerIntersections);
191  } else {
192  // there are already segment, try resolving small/large overlaps
193  resolveSmallLargeOverlaps(ctx, muonLayerDataHashVec[stIndex], layerIntersections);
194  }
195 
196  // finally sort the segments
197  std::stable_sort(
198  muonLayerDataHashVec[stIndex].begin(), muonLayerDataHashVec[stIndex].end(),
199  [](const Muon::MuonLayerIntersection& a, const Muon::MuonLayerIntersection& b) { return a.quality > b.quality; });
200  }
201 
202  if (msgLvl(MSG::DEBUG)) {
203  msg(MSG::DEBUG) << " Done building segment vector ";
204  for (const auto& vec : muonLayerDataHashVec) {
205  for (const auto& entry : vec) { msg(MSG::DEBUG) << std::endl << " " << m_printer->print(*entry.segment); }
206  }
207  msg(MSG::DEBUG) << endmsg;
208  }
209  }
210 
212  std::vector<MuonLayerIntersection>& existingLayerIntersections,
213  std::vector<MuonLayerIntersection>& newLayerIntersections) const {
214  ATH_MSG_VERBOSE(" resolveSmallLargeOverlaps: existing " << existingLayerIntersections.size() << " new "
215  << newLayerIntersections.size());
216 
217  // keep track of segments that have been merged
218  std::set<const MuonSegment*> combinedSegments;
219  std::vector<MuonLayerIntersection> combinedIntersections;
220 
221  // loop over all permutations
222  for (const MuonLayerIntersection& layerIntersection1 : existingLayerIntersections) {
223  // get quality and skip bad ones
224  if (layerIntersection1.quality < m_minSegmentQuality) continue;
225  for (const MuonLayerIntersection& layerIntersection2 : newLayerIntersections) {
226  // get quality and skip bad ones
227  if (layerIntersection2.quality < m_minSegmentQuality) continue;
228 
229  // require at least one of the segments to be above seeding threshold
230  if (layerIntersection1.quality < m_seedQualityThreshold && layerIntersection2.quality < m_seedQualityThreshold) continue;
231 
232  // match segments
233  if (!m_segmentMatchingTool->match(ctx, *layerIntersection1.segment, *layerIntersection2.segment)) continue;
234 
235  // build new segment
236  static const IMuonSegmentTrackBuilder::PrepVec emptyVec{};
237  std::shared_ptr<const MuonSegment> newseg{
238  m_muonTrackBuilder->combineToSegment(ctx, *layerIntersection1.segment, *layerIntersection2.segment, emptyVec)};
239  if (!newseg) {
240  ATH_MSG_DEBUG(" Fit of combination of segments failed ");
241  continue;
242  }
243 
244  // check fit quality
245  const Trk::FitQuality* fq = newseg->fitQuality();
246  if (!fq || fq->numberDoF() == 0) {
247  ATH_MSG_WARNING(" No fit quality, dropping segment ");
248  continue;
249  }
250  if (fq->chiSquared() / fq->numberDoF() > 2.5) {
251  ATH_MSG_DEBUG("Bad fit quality, dropping segment " << fq->chiSquared() / fq->numberDoF());
252  continue;
253  }
254 
255  // check that quality of the combined segment is not worse that the original ones
256  int qualitynew = m_segmentSelector->quality(*newseg);
257  if (qualitynew < layerIntersection1.quality || qualitynew < layerIntersection2.quality) {
258  ATH_MSG_DEBUG("Quality got worse after combination: new " << qualitynew << " q1 " << layerIntersection1.quality
259  << " q2 " << layerIntersection2.quality);
260  continue;
261  }
262 
263  // select intersection closest to the IP and create new MuonLayerIntersection
264  // get line from combined segment to the IP
265  Amg::Vector3D direction = newseg->globalPosition().unit();
266  // lambda to project the intersection positions on the line, treats the case where pointer is null
267  auto getDistance = [](const MuonLayerIntersection& layerIntersection, const Amg::Vector3D& direction) {
268  if (!layerIntersection.intersection.trackParameters) return 1e9;
269  return layerIntersection.intersection.trackParameters->position().dot(direction);
270  };
271  double dist1 = getDistance(layerIntersection1, direction);
272  double dist2 = getDistance(layerIntersection2, direction);
273  if (dist1 < dist2)
274  combinedIntersections.emplace_back(layerIntersection1.intersection, newseg, qualitynew);
275  else
276  combinedIntersections.emplace_back(layerIntersection2.intersection, newseg, qualitynew);
277 
278  ATH_MSG_DEBUG(" Combined segments " << std::endl
279  << " first " << m_printer->print(*layerIntersection1.segment) << std::endl
280  << " second " << m_printer->print(*layerIntersection2.segment) << std::endl
281  << " combined " << m_printer->print(*newseg));
282 
283  // add segments to exclusion list
284  combinedSegments.insert(layerIntersection1.segment.get());
285  combinedSegments.insert(layerIntersection2.segment.get());
286  }
287  }
288 
289  // lambda to loop over the input intersections and add them to the new list
290  auto insert_intersection = [&combinedSegments](const Muon::MuonLayerIntersection& inter_sect) {
291  return !combinedSegments.count(inter_sect.segment.get());
292  };
293  // do the insertion and swap the new vector with the existingLayerIntersections
294  combinedIntersections.reserve(existingLayerIntersections.size() + newLayerIntersections.size());
295  std::copy_if(std::make_move_iterator(existingLayerIntersections.begin()), std::make_move_iterator(existingLayerIntersections.end()),
296  std::back_inserter(combinedIntersections), insert_intersection);
297  std::copy_if(std::make_move_iterator(newLayerIntersections.begin()), std::make_move_iterator(newLayerIntersections.end()),
298  std::back_inserter(combinedIntersections), insert_intersection);
299  existingLayerIntersections = std::move(combinedIntersections);
300  }
301 } // namespace Muon
Muon::MuonCandidate
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonLayerEvent/MuonLayerEvent/MuonCandidate.h:14
Muon::MuonLayerAmbiguitySolverTool::m_segmentMatchingTool
ToolHandle< IMuonSegmentMatchingTool > m_segmentMatchingTool
Definition: MuonLayerAmbiguitySolverTool.h:54
Muon::MuonStationIndex::toStationIndex
static StIndex toStationIndex(ChIndex index)
convert ChIndex into StIndex
Definition: MuonStationIndex.cxx:43
Muon::MuonLayerAmbiguitySolverTool::m_minSegmentQuality
Gaudi::Property< int > m_minSegmentQuality
Definition: MuonLayerAmbiguitySolverTool.h:62
Muon::MuonLayerAmbiguitySolverTool::MuonLayerAmbiguitySolverTool
MuonLayerAmbiguitySolverTool(const std::string &type, const std::string &name, const IInterface *parent)
Default AlgTool functions.
Definition: MuonLayerAmbiguitySolverTool.cxx:13
Muon::MuonLayerAmbiguitySolverTool::m_segmentSelector
ToolHandle< IMuonSegmentSelectionTool > m_segmentSelector
Definition: MuonLayerAmbiguitySolverTool.h:52
Muon::MuonLayerSurface::layerIndex
MuonStationIndex::LayerIndex layerIndex
Definition: MuonLayerSurface.h:30
Muon::MuonStationIndex::EO
@ EO
Definition: MuonStationIndex.h:26
drawFromPickle.candidates
candidates
Definition: drawFromPickle.py:271
Muon::MuonLayerAmbiguitySolverTool::resolveSmallLargeOverlaps
void resolveSmallLargeOverlaps(const EventContext &ctx, std::vector< MuonLayerIntersection > &existingLayerIntersections, std::vector< MuonLayerIntersection > &newLayerIntersections) const
Definition: MuonLayerAmbiguitySolverTool.cxx:211
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Muon::MuonStationIndex::BI
@ BI
Definition: MuonStationIndex.h:25
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
Muon::MuonLayerAmbiguitySolverTool::m_maxSeeds
Gaudi::Property< unsigned int > m_maxSeeds
Definition: MuonLayerAmbiguitySolverTool.h:60
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Muon::MuonLayerAmbiguitySolverTool::getNextSeed
bool getNextSeed(const std::vector< std::vector< MuonLayerIntersection > > &muonLayerDataHashVec, std::set< const MuonSegment * > &usedSegments, std::vector< MuonStationIndex::StIndex > &inverseSeedLayerOrder, MuonLayerIntersection &layerIntersection) const
Definition: MuonLayerAmbiguitySolverTool.cxx:138
Muon
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
Definition: TrackSystemController.h:45
empty
bool empty(TH1 *h)
Definition: computils.cxx:295
Muon::MuonLayerSurface::regionIndex
MuonStationIndex::DetectorRegionIndex regionIndex
Definition: MuonLayerSurface.h:29
Muon::MuonLayerIntersection::intersection
MuonSystemExtension::Intersection intersection
intersection with layer
Definition: MuonLayerIntersection.h:19
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
Prompt::getDistance
double getDistance(const xAOD::Vertex *vtx1, const xAOD::Vertex *vtx2)
Definition: PromptUtils.cxx:41
Muon::MuonSystemExtension::Intersection::trackParameters
std::shared_ptr< const Trk::TrackParameters > trackParameters
Definition: MuonSystemExtension.h:26
Muon::MuonStationIndex::BM
@ BM
Definition: MuonStationIndex.h:25
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Muon::MuonLayerSurface
types
Definition: MuonLayerSurface.h:15
Muon::MuonStationIndex::EI
@ EI
Definition: MuonStationIndex.h:26
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
test_pyathena.parent
parent
Definition: test_pyathena.py:15
AnalysisUtils::copy_if
Out copy_if(In first, const In &last, Out res, const Pred &p)
Definition: IFilterUtils.h:30
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::FitQuality
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition: FitQuality.h:97
Muon::MuonLayerRecoData
Definition: MuonLayerRecoData.h:16
MuonLayerAmbiguitySolverTool.h
Muon::MuonLayerAmbiguitySolverTool::match
bool match(const EventContext &ctx, const MuonCandidate &candidate, const MuonLayerIntersection &layerIntersection) const
Definition: MuonLayerAmbiguitySolverTool.cxx:129
Muon::MuonLayerAmbiguitySolverTool::extendCandidatesWithLayers
bool extendCandidatesWithLayers(const EventContext &ctx, std::vector< MuonCandidate > &candidates, const std::vector< std::vector< MuonLayerIntersection > > &muonLayerRecoDataHashVec, const std::vector< MuonStationIndex::StIndex > &inverseSeedLayerOrder) const
Definition: MuonLayerAmbiguitySolverTool.cxx:77
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
Muon::MuonLayerAmbiguitySolverTool::initialize
virtual StatusCode initialize() override
Definition: MuonLayerAmbiguitySolverTool.cxx:18
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
Muon::MuonStationIndex::StIndexMax
@ StIndexMax
Definition: MuonStationIndex.h:27
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
Muon::MuonLayerAmbiguitySolverTool::resolveOverlaps
virtual void resolveOverlaps(const EventContext &ctx, const std::vector< Muon::MuonLayerRecoData > &allLayers, std::vector< MuonCandidate > &resolvedCandidates) const override
IMuonLayerAmbiguitySolverTool interface: find.
Definition: MuonLayerAmbiguitySolverTool.cxx:27
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Muon::MuonLayerAmbiguitySolverTool::buildLayerVec
void buildLayerVec(const EventContext &ctx, const std::vector< MuonLayerRecoData > &allLayers, std::vector< std::vector< MuonLayerIntersection > > &muonLayerDataHashVec) const
Definition: MuonLayerAmbiguitySolverTool.cxx:167
a
TList * a
Definition: liststreamerinfos.cxx:10
Muon::MuonStationIndex::BO
@ BO
Definition: MuonStationIndex.h:25
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MuonCandidate.h
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
Muon::MuonLayerIntersection::segment
std::shared_ptr< const MuonSegment > segment
segment
Definition: MuonLayerIntersection.h:22
Trk::FitQuality::chiSquared
double chiSquared() const
returns the of the overall track fit
Definition: FitQuality.h:56
MuonSegment.h
Muon::MuonStationIndex::StIndex
StIndex
enum to classify the different station layers in the muon spectrometer
Definition: MuonStationIndex.h:23
Trk::FitQuality::numberDoF
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition: FitQuality.h:60
Muon::MuonLayerAmbiguitySolverTool::m_printer
PublicToolHandle< MuonEDMPrinterTool > m_printer
Definition: MuonLayerAmbiguitySolverTool.h:58
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
Muon::MuonSegment
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:45
AthAlgTool
Definition: AthAlgTool.h:26
Muon::MuonLayerAmbiguitySolverTool::m_muonTrackBuilder
ToolHandle< IMuonSegmentTrackBuilder > m_muonTrackBuilder
Definition: MuonLayerAmbiguitySolverTool.h:56
FitQuality.h
Muon::MuonStationIndex::EE
@ EE
Definition: MuonStationIndex.h:26
Muon::IMuonSegmentTrackBuilder::PrepVec
std::vector< const Trk::PrepRawData * > PrepVec
Definition: IMuonSegmentTrackBuilder.h:26
Muon::MuonCandidate::layerIntersections
std::vector< MuonLayerIntersection > layerIntersections
MuonLayerIntersections.
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonLayerEvent/MuonLayerEvent/MuonCandidate.h:20
Muon::MuonLayerIntersection
Definition: MuonLayerIntersection.h:13
Muon::MuonStationIndex::EM
@ EM
Definition: MuonStationIndex.h:26
Muon::MuonLayerAmbiguitySolverTool::m_seedQualityThreshold
Gaudi::Property< int > m_seedQualityThreshold
Definition: MuonLayerAmbiguitySolverTool.h:61
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5