ATLAS Offline Software
MuTagAmbiguitySolverTool.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 
7 #include "GaudiKernel/IDataProviderSvc.h"
8 #include "GaudiKernel/SmartDataPtr.h"
16 #include "TrkTrack/Track.h"
17 
18 MuTagAmbiguitySolverTool::MuTagAmbiguitySolverTool(const std::string& t, const std::string& n, const IInterface* p) : AthAlgTool(t, n, p) {
19  declareInterface<IMuTagAmbiguitySolverTool>(this);
20  declareProperty("DoHitOverlapMatching", m_hitOverlapMatching = true);
21  declareProperty("ResolveSLOverlaps", m_slOverlapMatching = false);
22  declareProperty("RejectOuterEndcap", m_rejectOuterEndcap = true);
23  declareProperty("RejectMatchPhi", m_rejectMatchPhi = true);
24 }
25 
27  ATH_MSG_INFO("================================");
28  ATH_MSG_INFO("=Proprieties are ");
29  ATH_MSG_INFO("================================");
30 
31  ATH_CHECK(m_edmHelperSvc.retrieve());
32  ATH_CHECK(p_muonPrinter.retrieve());
33  ATH_CHECK(m_idHelperSvc.retrieve());
34  ATH_CHECK(p_segmentMatchingTool.retrieve());
35 
36  return StatusCode::SUCCESS;
37 }
38 
39 std::vector<MuonCombined::MuonSegmentInfo> MuTagAmbiguitySolverTool::solveAmbiguities(
40  const EventContext& ctx, std::vector<MuonCombined::MuonSegmentInfo> mtos) const {
41  ATH_MSG_DEBUG("mtos size before any cuts " << mtos.size());
42  // Store the number of segments associated to one track (pointer)
43  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
44  ATH_MSG_DEBUG(" index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track << " stationLayer "
45  << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
46  int nsegments = 1;
47  if (mtos[ns1].selected == 2) continue;
48  for (unsigned int ns2 = ns1 + 1; ns2 < mtos.size(); ns2++) {
49  if (mtos[ns1].track != mtos[ns2].track) break;
50  nsegments++;
51  }
52  ATH_MSG_DEBUG(" ns1 " << ns1 << " nsegments " << nsegments);
53 
54  for (unsigned int ns2 = ns1; ns2 < mtos.size(); ns2++) {
55  if (mtos[ns1].track != mtos[ns2].track) break;
56  mtos[ns2].nsegments = nsegments;
57  mtos[ns2].selected = 2;
58  }
59  ATH_MSG_DEBUG(" Updated index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track
60  << " stationLayer " << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
61  }
62 
63  // drop CSC single segment
64  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
65  if (mtos[ns1].selected == 2) mtos[ns1].selected = 1;
66  if (mtos[ns1].nsegments == 1 && mtos[ns1].stationLayer == 21) {
67  mtos[ns1].selected = 0;
68  mtos[ns1].nsegments = 0;
69  }
70  }
71 
72  // solve ambiguous segments
73  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
74  ATH_MSG_DEBUG(" First pass index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track
75  << " stationLayer " << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
76 
77  for (unsigned int ns2 = ns1 + 1; ns2 < mtos.size(); ns2++) {
78  if (mtos[ns1].segment == mtos[ns2].segment || ambiguousSegment(ctx, *mtos[ns1].segment, *mtos[ns2].segment)) {
79  double R1 = std::abs(mtos[ns1].pullCY * Rseg(mtos[ns1].nsegments));
80  double R2 = std::abs(mtos[ns2].pullCY * Rseg(mtos[ns2].nsegments));
81  ATH_MSG_DEBUG(" Ambiguous segment at index " << ns1 << " and " << ns2);
82  if (R1 > R2) {
83  mtos[ns1].selected = 0;
84  mtos[ns1].nsegments = 0;
85  } else {
86  mtos[ns2].selected = 0;
87  mtos[ns2].nsegments = 0;
88  }
89  }
90  }
91  }
92 
93  // update nsegments
94  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
95  int nsegments = 1;
96  if (mtos[ns1].selected == 0) nsegments = 0;
97  if (mtos[ns1].selected == 2) continue;
98  for (unsigned int ns2 = ns1 + 1; ns2 < mtos.size(); ns2++) {
99  if (mtos[ns1].track != mtos[ns2].track) break;
100  if (mtos[ns2].selected != 0) nsegments++;
101  }
102  for (unsigned int ns2 = ns1; ns2 < mtos.size(); ns2++) {
103  if (mtos[ns1].track != mtos[ns2].track) break;
104  mtos[ns2].nsegments = nsegments;
105  mtos[ns2].selected = 2;
106  }
107  ATH_MSG_DEBUG(" Second pass index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track
108  << " stationLayer " << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
109  ATH_MSG_DEBUG(" ns1 " << ns1 << " nsegments " << nsegments);
110  }
111 
112  // update drop CSC single segment
113  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
114  if (mtos[ns1].selected == 2) mtos[ns1].selected = 1;
115  if (mtos[ns1].nsegments == 1 && mtos[ns1].stationLayer == 21) {
116  mtos[ns1].selected = 0;
117  mtos[ns1].nsegments = 0;
118  ATH_MSG_DEBUG(" DROP CSC index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track
119  << " stationLayer" << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
120  }
121  }
122 
123  // drop single tag with too many holes
124  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
125  if (mtos[ns1].nsegments == 1 && mtos[ns1].nholes > 2) {
126  mtos[ns1].selected = 0;
127  mtos[ns1].nsegments = 0;
128  ATH_MSG_DEBUG(" DROP HOLES index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track
129  << " stationLayer" << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
130  }
131  }
132 
133  // drop single tag without phi match
134  if (m_rejectMatchPhi) {
135  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
136  if (mtos[ns1].nsegments == 1 && mtos[ns1].minimumPullPhi > 3 && mtos[ns1].hasPhi > 0) {
137  mtos[ns1].selected = 0;
138  mtos[ns1].nsegments = 0;
139  ATH_MSG_DEBUG(" DROP MatchPhi index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer " << mtos[ns1].track
140  << " stationLayer" << mtos[ns1].stationLayer << " selected " << mtos[ns1].selected);
141  }
142  }
143  }
144 
145  int multiplicity = mtos.size();
146 
147  // drop segments as function of multiplicity and holes
148  if (multiplicity > 50) {
149  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
150  if (mtos[ns1].nholes > 1) {
151  mtos[ns1].selected = 0;
152  mtos[ns1].nsegments = 0;
153  ATH_MSG_DEBUG(" DROP multiplicity 50 index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer "
154  << mtos[ns1].track << " stationLayer" << mtos[ns1].stationLayer << " selected "
155  << mtos[ns1].selected);
156  }
157  }
158  } else if (multiplicity > 30) {
159  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
160  if (mtos[ns1].nholes > 2) {
161  mtos[ns1].selected = 0;
162  mtos[ns1].nsegments = 0;
163  ATH_MSG_DEBUG(" DROP multiplicity 30 index " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer "
164  << mtos[ns1].track << " stationLayer" << mtos[ns1].stationLayer << " selected "
165  << mtos[ns1].selected);
166  }
167  }
168  }
169 
170  // drop single multilayers for single tag
171  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
172  if (mtos[ns1].nsegments == 1 && mtos[ns1].nholes > 0 && mtos[ns1].singleML == 1) {
173  mtos[ns1].selected = 0;
174  mtos[ns1].nsegments = 0;
175  ATH_MSG_DEBUG(" DROP single multilayers single tag " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer "
176  << mtos[ns1].track << " stationLayer" << mtos[ns1].stationLayer
177  << " selected " << mtos[ns1].selected);
178  }
179  }
180 
181  // drop single multilayer segment for below pT cut
182  double pTmin(2000.);
183  double pTmax(10000.);
184  double pTcut = pTmin;
185  if (multiplicity > 100)
186  pTcut = pTmax;
187  else if (multiplicity < 10)
188  pTcut = pTmin;
189  else
190  pTcut = 2 * ((pTmax - pTmin) / 90.) * multiplicity;
191 
192  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
193  const Trk::Perigee* perigee = (mtos[ns1].track)->perigeeParameters();
194  double sintheta = std::sin(perigee->parameters()[Trk::theta]);
195  double OneOverP = std::abs(perigee->parameters()[Trk::qOverP]);
196  double pT = 0.0;
197  if (OneOverP > 0.0) {
198  pT = sintheta / OneOverP;
199  } else {
200  pT = std::hypot(perigee->momentum()[Amg::px], perigee->momentum()[Amg::py]);
201  }
202  if (pT < pTcut) {
203  if (mtos[ns1].nsegments == 1 && mtos[ns1].singleML == 1) {
204  mtos[ns1].selected = 0;
205  mtos[ns1].nsegments = 0;
206  ATH_MSG_DEBUG(" DROP single multilayers low pT " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer "
207  << mtos[ns1].track << " stationLayer" << mtos[ns1].stationLayer
208  << " selected " << mtos[ns1].selected);
209  }
210  }
211  }
212 
213  // drop if single tag outer endcap
214  if (m_rejectOuterEndcap) {
215  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
216  if (mtos[ns1].nsegments == 1 && mtos[ns1].stationLayer == 13) {
217  mtos[ns1].selected = 0;
218  mtos[ns1].nsegments = 0;
219  ATH_MSG_DEBUG(" DROP single tag OuterEndcap " << ns1 << " nsegments " << mtos[ns1].nsegments << " track pointer "
220  << mtos[ns1].track << " stationLayer" << mtos[ns1].stationLayer
221  << " selected " << mtos[ns1].selected);
222  }
223  }
224  }
225 
226  std::vector<MuonCombined::MuonSegmentInfo> mtosOutput;
227  mtosOutput.reserve(mtos.size());
228 
229  for (unsigned int ns1 = 0; ns1 < mtos.size(); ns1++) {
230  if (mtos[ns1].nsegments > 0) { mtosOutput.push_back(std::move(mtos[ns1])); }
231  }
232 
233  ATH_MSG_DEBUG("mtos size after all cuts " << mtos.size());
234 
235  return mtosOutput;
236 }
237 
238 int MuTagAmbiguitySolverTool::ambiguousSegment(const EventContext& ctx, const Muon::MuonSegment& seg1, const Muon::MuonSegment& seg2) const {
239  // first check pointer
240  if (&seg1 == &seg2) return 1;
241 
242  // check whether the segments are in the same station layer
243  Identifier ch1 = m_edmHelperSvc->chamberId(seg1);
244  Identifier ch2 = m_edmHelperSvc->chamberId(seg2);
245  Muon::MuonStationIndex::StIndex st1 = m_idHelperSvc->stationIndex(ch1);
246  Muon::MuonStationIndex::StIndex st2 = m_idHelperSvc->stationIndex(ch2);
247  if (st1 != st2) return 0;
248 
249  // check whether the segments are in the same chamber layer (small/large)
250  Muon::MuonStationIndex::ChIndex chI1 = m_idHelperSvc->chamberIndex(ch1);
251  Muon::MuonStationIndex::ChIndex chI2 = m_idHelperSvc->chamberIndex(ch2);
252  if (chI1 != chI2) {
253  // only match if segments both MDT or both CSC
254  if (m_idHelperSvc->isMdt(ch1) == m_idHelperSvc->isMdt(ch2)) {
255  // make sure segments are in same sector or neighbouring one
256  int sector1 = m_idHelperSvc->sector(ch1);
257  int sector2 = m_idHelperSvc->sector(ch2);
258  bool sectorOk = false;
259  if (sector1 == sector2) sectorOk = true;
260  if (std::abs(sector1 - sector2) == 1) sectorOk = true;
261  if ((sector1 == 16 && sector2 == 1) || (sector1 == 1 && sector2 == 16)) sectorOk = true;
262 
263  if (sectorOk) {
264  // check whether the two segments actually belong to the same particle
265  bool match = p_segmentMatchingTool->match(ctx, seg1, seg2);
266  if (match) {
267  ATH_MSG_VERBOSE("Found matching segment pair: " << std::endl
268  << p_muonPrinter->print(seg1) << std::endl
269  << p_muonPrinter->print(seg2));
270  // if overlap matching enabled flag as ambiguous
271  if (m_slOverlapMatching) return 2;
272  }
273  }
274  }
275  } else {
276  // the segments are in the same chamber, calculate hit overlap
278  key1.calculateKeys(seg1.containedMeasurements(),
279  2); // the '2' means that the code will ignore the sign of the drift radii
281  key2.calculateKeys(seg2.containedMeasurements(), 2);
282 
283  Muon::CompareMuonSegmentKeys compareSegments{};
285 
286  if (compareSegments.intersectionSize > 0) {
287  // if hit overlap matching enables flag as ambiguous
288  if (m_hitOverlapMatching) {
289  if (msgLvl(MSG::VERBOSE))
290  msg(MSG::VERBOSE) << " found overlapping segment pair: " << compareSegments.print(result) << std::endl
291  << p_muonPrinter->print(seg1) << std::endl
292  << p_muonPrinter->print(seg2) << endmsg;
293  return 3;
294  }
295  }
296  }
297 
298  return 0;
299 }
300 
301 std::vector<MuonCombined::MuonSegmentInfo> MuTagAmbiguitySolverTool::selectBestMuTaggedSegments(
302  const EventContext& ctx, std::vector<MuonCombined::MuonSegmentInfo> mtss) const {
303  ATH_MSG_DEBUG("cleaning set of MTSs");
304 
305  std::vector<MuonCombined::MuonSegmentInfo> outputMTSs;
306  std::vector<bool> accept(mtss.size(), true);
307  for (unsigned int mts1 = 0; mts1 < mtss.size(); ++mts1) {
308  const Muon::MuonSegment* museg1 = mtss[mts1].segment;
309  if (!museg1) {
310  ATH_MSG_DEBUG("MTO doesn't hold a Muon::MuonSegment");
311  continue;
312  }
313 
314  Identifier ch1 = m_edmHelperSvc->chamberId(*museg1);
315  Muon::MuonStationIndex::StIndex st1 = m_idHelperSvc->stationIndex(ch1);
316  int eta1 = m_idHelperSvc->stationEta(ch1);
317 
318  for (unsigned int mts2 = mts1 + 1; mts2 < mtss.size(); ++mts2) {
319  const Muon::MuonSegment* museg2 = mtss[mts2].segment;
320  if (!museg2) {
321  ATH_MSG_DEBUG("MTO doesn't hold a Muon::MuonSegment");
322  continue;
323  }
324 
325  Identifier ch2 = m_edmHelperSvc->chamberId(*museg2);
326  Muon::MuonStationIndex::StIndex st2 = m_idHelperSvc->stationIndex(ch2);
327 
328  if (st1 != st2) continue;
329  int eta2 = m_idHelperSvc->stationEta(ch2);
330  if (eta1 != eta2) continue;
331 
332  if (ambiguousSegment(ctx, *museg1, *museg2)) {
333  if (museg1->numberOfContainedROTs() > museg2->numberOfContainedROTs() - 1) {
334  ATH_MSG_DEBUG("segments in the same station with rots keep First " << museg1->numberOfContainedROTs() << " and "
335  << museg2->numberOfContainedROTs());
336  accept[mts2] = false;
337  } else if (museg1->numberOfContainedROTs() < museg2->numberOfContainedROTs() - 1) {
338  ATH_MSG_DEBUG("segments in the same station with rots keep Second " << museg1->numberOfContainedROTs() << " and "
339  << museg2->numberOfContainedROTs());
340  accept[mts1] = false;
341  } else {
342  double chi2mts1 = std::abs(mtss[mts1].pullCY);
343  double chi2mts2 = std::abs(mtss[mts2].pullCY);
344  ATH_MSG_DEBUG("segments in the same station with MatchLocY " << chi2mts1 << " and " << chi2mts2);
345  if (std::abs(chi2mts1) < std::abs(chi2mts2)) {
346  ATH_MSG_DEBUG("dropping mts " << mts2 << " since he has a larger MatchLocY: " << chi2mts2 << " vs " << chi2mts1);
347  accept[mts2] = false;
348  }
349  if (std::abs(chi2mts1) > std::abs(chi2mts2)) {
350  ATH_MSG_DEBUG("dropping mts " << mts1 << " since he has a larger MatchLocY: " << chi2mts1 << " vs " << chi2mts2);
351  accept[mts1] = false;
352  }
353  }
354  }
355  }
356  if (accept[mts1]) outputMTSs.push_back(mtss[mts1]);
357  }
358  return outputMTSs;
359 }
362 double MuTagAmbiguitySolverTool::Rseg(unsigned int nseg) const {
363  constexpr float a_seg{3.61883f}, b_seg{20.4547f}, c_seg{1.f / 0.132675f}, d_seg{0.102262f};
364  return (a_seg / (1. + std::exp(b_seg - nseg * c_seg)) + d_seg);
365 }
CalculateHighPtTerm.pT
pT
Definition: ICHEP2016/CalculateHighPtTerm.py:57
MuTagAmbiguitySolverTool::solveAmbiguities
std::vector< MuonCombined::MuonSegmentInfo > solveAmbiguities(const EventContext &ctx, std::vector< MuonCombined::MuonSegmentInfo > mtos) const
Definition: MuTagAmbiguitySolverTool.cxx:39
get_generator_info.result
result
Definition: get_generator_info.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
ParticleGun_SamplingFraction.eta2
eta2
Definition: ParticleGun_SamplingFraction.py:96
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
IMuonSegmentMatchingTool.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
CutsMETMaker::accept
StatusCode accept(const xAOD::Muon *mu)
Definition: CutsMETMaker.cxx:18
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
MuTagAmbiguitySolverTool.h
xAOD::eta1
setEt setPhi setE277 setWeta2 eta1
Definition: TrigEMCluster_v1.cxx:41
Muon::MuonSegmentKey
Class to cache the identifiers on a segment in sets that can later be used to perform an overlap remo...
Definition: MuonSegmentKey.h:24
MuonSegmentQuality.h
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
MuonSegmentInfo.h
Muon::MuonSegment::numberOfContainedROTs
unsigned int numberOfContainedROTs() const
number of RIO_OnTracks
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:199
IDTrig_MC23a_preInclude.pTmin
pTmin
Definition: IDTrig_MC23a_preInclude.py:8
MuTagAmbiguitySolverTool::m_hitOverlapMatching
bool m_hitOverlapMatching
check hit overlap of segments in ambi solving
Definition: MuTagAmbiguitySolverTool.h:71
module_driven_slicing.key2
key2
Definition: module_driven_slicing.py:159
Track.h
Muon::CompareMuonSegmentKeys::OverlapResult
OverlapResult
enum for the overlap result
Definition: CompareMuonSegmentKeys.h:16
MuTagAmbiguitySolverTool::initialize
virtual StatusCode initialize()
Definition: MuTagAmbiguitySolverTool.cxx:26
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
beamspotman.n
n
Definition: beamspotman.py:731
Trk::theta
@ theta
Definition: ParamDefs.h:72
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
Trk::Segment::containedMeasurements
const std::vector< const Trk::MeasurementBase * > & containedMeasurements() const
returns the vector of Trk::MeasurementBase objects
Definition: TrkEvent/TrkSegment/TrkSegment/Segment.h:166
Amg::px
@ px
Definition: GeoPrimitives.h:38
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuTagAmbiguitySolverTool::p_muonPrinter
ToolHandle< Muon::MuonEDMPrinterTool > p_muonPrinter
Pointer on MuonEDMPrinterTool.
Definition: MuTagAmbiguitySolverTool.h:60
MuTagAmbiguitySolverTool::m_rejectMatchPhi
bool m_rejectMatchPhi
reject one station tags with phi hits and a fabs(MatchPhi = minPullPhi) > 3
Definition: MuTagAmbiguitySolverTool.h:75
MuTagAmbiguitySolverTool::m_slOverlapMatching
bool m_slOverlapMatching
for segments in a SL overlap in the same station layer, check whether from same particle
Definition: MuTagAmbiguitySolverTool.h:72
MuTagAmbiguitySolverTool::Rseg
double Rseg(unsigned int nseg) const
What are these hardcoded constants about? d + a / (1 + exp())
Definition: MuTagAmbiguitySolverTool.cxx:362
Amg::py
@ py
Definition: GeoPrimitives.h:39
Trk::perigeeParameters
@ perigeeParameters
Definition: MeasurementType.h:19
MuTagAmbiguitySolverTool::ambiguousSegment
int ambiguousSegment(const EventContext &ctx, const Muon::MuonSegment &seg1, const Muon::MuonSegment &seg2) const
Definition: MuTagAmbiguitySolverTool.cxx:238
MuTagAmbiguitySolverTool::m_rejectOuterEndcap
bool m_rejectOuterEndcap
reject Endcap Outer one station layer tags (without EI or EM)
Definition: MuTagAmbiguitySolverTool.h:74
MuTagAmbiguitySolverTool::selectBestMuTaggedSegments
std::vector< MuonCombined::MuonSegmentInfo > selectBestMuTaggedSegments(const EventContext &ctx, std::vector< MuonCombined::MuonSegmentInfo > mtss) const
Definition: MuTagAmbiguitySolverTool.cxx:301
MuTagAmbiguitySolverTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuTagAmbiguitySolverTool.h:54
MuTagAmbiguitySolverTool::p_segmentMatchingTool
ToolHandle< Muon::IMuonSegmentMatchingTool > p_segmentMatchingTool
Pointer on MuonSegmentMatchingTool.
Definition: MuTagAmbiguitySolverTool.h:65
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:73
Muon::MuonStationIndex::ChIndex
ChIndex
enum to classify the different chamber layers in the muon spectrometer
Definition: MuonStationIndex.h:15
MuonSegment.h
Muon::MuonStationIndex::StIndex
StIndex
enum to classify the different station layers in the muon spectrometer
Definition: MuonStationIndex.h:23
LocalDirection.h
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
Muon::MuonSegment
Definition: MuonSpectrometer/MuonReconstruction/MuonRecEvent/MuonSegment/MuonSegment/MuonSegment.h:45
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
MuTagAmbiguitySolverTool::MuTagAmbiguitySolverTool
MuTagAmbiguitySolverTool(const std::string &t, const std::string &n, const IInterface *p)
Definition: MuTagAmbiguitySolverTool.cxx:18
CompareMuonSegmentKeys.h
Muon::CompareMuonSegmentKeys
Definition: CompareMuonSegmentKeys.h:14
match
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition: hcg.cxx:356
MuonSegmentKey.h
MuTagAmbiguitySolverTool::m_edmHelperSvc
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
Pointer on IMuonEDMHelperSvc.
Definition: MuTagAmbiguitySolverTool.h:48
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5
module_driven_slicing.key1
key1
Definition: module_driven_slicing.py:158