ATLAS Offline Software
Loading...
Searching...
No Matches
MuonMatchingTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <utility>
6#include "MuonMatchingTool.h"
8
9const static double ZERO_LIMIT = 1.e-5;
10
11MuonMatchingTool :: MuonMatchingTool(const std::string& type, const std::string& name, const IInterface* parent)
12 : AthAlgTool(type, name, parent)
13{}
14
15
16StatusCode MuonMatchingTool :: initialize(){
17
18 ATH_CHECK( m_trigDec.retrieve() );
19 ATH_CHECK( m_thresholdTool.retrieve() );
21 ATH_CHECK( m_extrapolator.retrieve() );
22 }
23 ATH_CHECK( m_MuonContainerKey.initialize() );
24 ATH_CHECK( m_MuonRoIContainerKey.initialize() );
25 ATH_CHECK( m_L2MuonSAContainerKey.initialize() );
27 ATH_CHECK( m_L2muCombContainerKey.initialize() );
28 ATH_CHECK( m_EFSAMuonContainerKey.initialize() );
29 ATH_CHECK( m_EFCBMuonContainerKey.initialize() );
30 ATH_CHECK( m_EFSAFSMuonContainerKey.initialize() );
31 ATH_CHECK( m_EFCBFSMuonContainerKey.initialize() );
32 ATH_CHECK( m_MStrackContainerKey.initialize() );
33 ATH_CHECK( m_CBtrackContainerKey.initialize() );
34
35 return StatusCode::SUCCESS;
36}
37
38
39const Amg::Vector3D MuonMatchingTool :: offlineMuonAtPivot(const EventContext& ctx, const xAOD::Muon* mu) const{
40 const xAOD::TrackParticle* track = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
41 std::unique_ptr<const Trk::TrackParameters> extPars(extTrackToPivot(ctx, track));
42 return extPars ? extPars->position() : Amg::Vector3D(0.,0.,0.);
43}
44
45
46template<>
47std::tuple<bool, double,double> MuonMatchingTool :: trigPosForMatch<xAOD::L2StandAloneMuon>(const xAOD::L2StandAloneMuon *trig){
48 return std::forward_as_tuple(true, trig->roiEta(), trig->roiPhi());
49}
50
51
52std::tuple<bool, double,double> MuonMatchingTool :: trigPosForMatchSATrack(const xAOD::Muon *mu){
53 return mu->muonType() == xAOD::Muon::MuonType::MuonStandAlone ? std::forward_as_tuple(true, mu->eta(), mu->phi()) : std::forward_as_tuple(false, 0., 0.);
54}
55
56std::tuple<bool, double,double> MuonMatchingTool :: trigPosForMatchCBTrack(const xAOD::Muon *mu){
57 return mu->muonType() == xAOD::Muon::MuonType::Combined ? std::forward_as_tuple(true, mu->eta(), mu->phi()) : std::forward_as_tuple(false, 0., 0.);
58}
59
60std::tuple<bool, double,double> MuonMatchingTool :: PosForMatchSATrack(const xAOD::Muon *mu){
61 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
62 return MuonTrack ? std::forward_as_tuple(true, MuonTrack->eta(), MuonTrack->phi()) : std::forward_as_tuple(false, 0., 0.);
63}
64
65std::tuple<bool, double,double> MuonMatchingTool :: PosForMatchCBTrack(const xAOD::Muon *mu){
66 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle);
67 return MuonTrack ? std::forward_as_tuple(true, MuonTrack->eta(), MuonTrack->phi()) : std::forward_as_tuple(false, 0., 0.);
68}
69
70
71const xAOD::Muon* MuonMatchingTool :: matchEFSA(const xAOD::Muon *mu, std::string trig, bool &pass) const {
72 ATH_MSG_DEBUG("MuonMonitoring::matchEFSA()");
73 const xAOD::TrackParticle* MuonTrack = nullptr;
74 using Type = xAOD::Muon::TrackParticleType;
75 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
76 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
77 Type::MuonSpectrometerTrackParticle};
78 for (Type type : types){
79 MuonTrack = mu->trackParticle(type);
80 ATH_MSG_DEBUG("HLT_Muons_RoI SA Muon");
81 if (MuonTrack) break;
82 }
83 return MuonTrack ? match<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_RoI.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
84}
85
86const xAOD::Muon* MuonMatchingTool :: matchEFSA(const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
87 ATH_MSG_DEBUG("MuonMonitoring::matchEFSA() for truth particle");
88 return mu ? match<xAOD::Muon>(mu, std::move(trig), m_EFreqdR, pass, "HLT_Muons_RoI.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
89}
90
91const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFSALinkInfo(const xAOD::Muon *mu, std::string trig) const {
92 ATH_MSG_DEBUG("MuonMonitoring::matchEFSALinkInfo()");
93 bool pass = false;
95 const xAOD::TrackParticle* MuonTrack = nullptr;
96 using Type = xAOD::Muon::TrackParticleType;
97 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
98 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
99 Type::MuonSpectrometerTrackParticle};
100 for (Type type : types){
101 MuonTrack = mu->trackParticle(type);
102 if (MuonTrack) break;
103 }
104 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_RoI.*", &MuonMatchingTool::trigPosForMatchSATrack) : muonLinkInfo;
105}
106
107const xAOD::Muon* MuonMatchingTool :: matchEFSAReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
108 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAReadHandle()");
109 const xAOD::TrackParticle* MuonTrack = nullptr;
110 using Type = xAOD::Muon::TrackParticleType;
111 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
112 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
113 Type::MuonSpectrometerTrackParticle};
114 for (Type type : types){
115 MuonTrack = mu->trackParticle(type);
116 if (MuonTrack) break;
117 }
119}
120
121const xAOD::Muon* MuonMatchingTool :: matchEFCB( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
122 ATH_MSG_DEBUG("MuonMonitoring::matchEFCB() for TruthParticle");
123 return mu ? match<xAOD::Muon>( mu, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_RoI*.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
124}
125
126const xAOD::Muon* MuonMatchingTool :: matchEFCB( const xAOD::Muon *mu, std::string trig, bool &pass) const {
127 ATH_MSG_DEBUG("MuonMonitoring::matchEFCB()");
128 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
129 ATH_MSG_DEBUG("HLT_Muons_RoI CB Muon");
130 return MuonTrack ? match<xAOD::Muon>( MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_RoI*.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
131}
132
133const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFCBLinkInfo( const xAOD::Muon *mu, std::string trig) const {
134 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBLinkInfo()");
135 bool pass = false;
137 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
138 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_RoI*.*", &MuonMatchingTool::trigPosForMatchCBTrack) : muonLinkInfo;
139}
140
141const xAOD::Muon* MuonMatchingTool :: matchEFCBReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
142 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBReadHandle()");
143 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
145}
146
147const xAOD::Muon* MuonMatchingTool :: matchEFSAFS(const xAOD::Muon *mu, std::string trig, bool &pass) const {
148 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFS()");
149 const xAOD::TrackParticle* MuonTrack = nullptr;
150 using Type = xAOD::Muon::TrackParticleType;
151 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
152 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
153 Type::MuonSpectrometerTrackParticle};
154 for (Type type : types){
155 MuonTrack = mu->trackParticle(type);
156 ATH_MSG_DEBUG("HLT_Muons_FS SA Muon");
157 if (MuonTrack) break;
158 }
159 return MuonTrack ? match<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_FS.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
160}
161
162const xAOD::Muon* MuonMatchingTool :: matchEFSAFS(const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
163 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFS() for truth particle");
164 return mu ? match<xAOD::Muon>(mu, std::move(trig), m_EFreqdR, pass, "HLT_Muons_FS.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
165}
166
167const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFSAFSLinkInfo(const xAOD::Muon *mu, std::string trig) const {
168 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFSLinkInfo()");
169 bool pass = false;
171 const xAOD::TrackParticle* MuonTrack = nullptr;
172 using Type = xAOD::Muon::TrackParticleType;
173 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
174 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
175 Type::MuonSpectrometerTrackParticle};
176 for (Type type : types){
177 MuonTrack = mu->trackParticle(type);
178 if (MuonTrack) break;
179 }
180 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_FS.*", &MuonMatchingTool::trigPosForMatchSATrack) : muonLinkInfo;
181}
182
183const xAOD::Muon* MuonMatchingTool :: matchEFSAFSReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
184 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFSReadHandle()");
185 const xAOD::TrackParticle* MuonTrack = nullptr;
186 using Type = xAOD::Muon::TrackParticleType;
187 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
188 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
189 Type::MuonSpectrometerTrackParticle};
190 for (Type type : types){
191 MuonTrack = mu->trackParticle(type);
192 if (MuonTrack) break;
193 }
195}
196
197const xAOD::Muon* MuonMatchingTool :: matchEFCBFS( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
198 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFS() for TruthParticle");
199 return mu ? match<xAOD::Muon>( mu, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_FS.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
200}
201
202const xAOD::Muon* MuonMatchingTool :: matchEFCBFS( const xAOD::Muon *mu, std::string trig, bool &pass) const {
203 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFS()");
204 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
205 ATH_MSG_DEBUG("HLT_Muons_FS CB Muon");
206 return MuonTrack ? match<xAOD::Muon>( MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_FS.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
207}
208
209const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFCBFSLinkInfo( const xAOD::Muon *mu, std::string trig) const {
210 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFSLinkInfo()");
211 bool pass = false;
213 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
214 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_FS.*", &MuonMatchingTool::trigPosForMatchCBTrack) : muonLinkInfo;
215}
216
217const xAOD::Muon* MuonMatchingTool :: matchEFCBFSReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
218 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFSReadHandle()");
219 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
221}
222
223const xAOD::Muon* MuonMatchingTool :: matchEFIso( const xAOD::Muon *mu, std::string trig, bool &pass) const {
224 ATH_MSG_DEBUG("MuonMonitoring::matchEFIso()");
225 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
226 return MuonTrack ? match<xAOD::Muon>( MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsIso", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
227}
228
229const xAOD::Muon* MuonMatchingTool :: matchEFIso( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
230 ATH_MSG_DEBUG("MuonMonitoring::matchEFIso() for truth particle");
231 return mu ? match<xAOD::Muon>( mu, std::move(trig), m_EFreqdR, pass, "HLT_MuonsIso", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
232}
233
234
235const xAOD::TrackParticle* MuonMatchingTool :: SearchEFTrack(const EventContext &ctx, const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer>& muLinkInfo, const SG::ReadHandleKey<xAOD::TrackParticleContainer>& ReadHandleKey) const {
236 const xAOD::TrackParticle* MatchedTrack = nullptr;
237 const ElementLink<xAOD::MuonContainer> muEL = muLinkInfo.link;
238 float EFEta = (*muEL)->eta();
239 float EFPhi = (*muEL)->phi();
240 float mindR = 999.;
241
242 SG::ReadHandle<xAOD::TrackParticleContainer> trackHandle(ReadHandleKey, ctx);
243 if ( !trackHandle.isValid() ) return MatchedTrack;
244
245 const auto track = m_trigDec->associateToEventView<xAOD::TrackParticleContainer>(trackHandle, muLinkInfo);
246 const xAOD::TrackParticleContainer::const_iterator begin = track.first;
247 const xAOD::TrackParticleContainer::const_iterator end = track.second;
248
249 for (xAOD::TrackParticleContainer::const_iterator it = begin; it != end; ++it) {
250
251 float deta = EFEta - (*it)->eta();
252 float dphi = xAOD::P4Helpers::deltaPhi(EFPhi, (*it)->phi() );
253 float dR = std::sqrt(deta*deta + dphi*dphi);
254
255 if( dR< mindR ){
256 mindR = dR;
257 MatchedTrack = (*it);
258 }
259 }
260
261 return MatchedTrack;
262
263}
264
265const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFIsoLinkInfo( const xAOD::Muon *mu, std::string trig) const {
266 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBLinkInfo()");
267 bool pass = false;
269 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
270 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsIso", &MuonMatchingTool::trigPosForMatchCBTrack) : muonLinkInfo;
271}
272
273const xAOD::L2StandAloneMuon* MuonMatchingTool :: matchL2SA( const EventContext& ctx, const xAOD::Muon *mu, const std::string& trig, bool &pass) const {
274 ATH_MSG_DEBUG("MuonMonitoring::matchL2SA()");
275 float reqdR = m_L2SAreqdR;
277 reqdR = reqdRL1byPt(mu->pt());
278 const Amg::Vector3D extPos = offlineMuonAtPivot(ctx, mu);
279 if(extPos.norm()>ZERO_LIMIT){
280 return match<xAOD::L2StandAloneMuon>( &extPos, trig, reqdR, pass);
281 }
282 }
283 return match<xAOD::L2StandAloneMuon>( mu, trig, reqdR, pass, "HLT_MuonL2SAInfo");
284}
285
286const xAOD::Muon* MuonMatchingTool :: matchFastRecoSA( const EventContext& ctx, const xAOD::Muon *mu, const std::string& trig, bool &pass) const {
287 ATH_MSG_DEBUG("MuonMonitoring::matchFastRecoSA()");
288 float reqdR = m_L2SAreqdR;
290 reqdR = reqdRL1byPt(mu->pt());
291 const Amg::Vector3D extPos = offlineMuonAtPivot(ctx, mu);
292 if(extPos.norm()>ZERO_LIMIT){
293 return match<xAOD::Muon>( &extPos, trig, reqdR, pass);
294 }
295 }
296 return match<xAOD::Muon>( mu, trig, reqdR, pass, "HLT_FastMuonsInfo");
297}
298
299const xAOD::L2StandAloneMuon* MuonMatchingTool :: matchL2SA( const xAOD::TruthParticle *mu, const std::string& trig, bool &pass) const {
300 ATH_MSG_DEBUG("MuonMonitoring::matchL2SA() from TruthParticle");
301 return match<xAOD::L2StandAloneMuon>( mu, trig, m_L2SAreqdR, pass, "HLT_MuonL2SAInfo");
302}
303
304const xAOD::Muon* MuonMatchingTool :: matchFastRecoSA(const xAOD::TruthParticle *mu, const std::string& trig, bool &pass) const {
305 ATH_MSG_DEBUG("MuonMonitoring::matchFastRecoSA() from TruthParticle");
306 return match<xAOD::Muon>( mu, trig, m_L2SAreqdR, pass, "HLT_FastMuonsInfo");
307}
308
309const TrigCompositeUtils::LinkInfo<xAOD::L2StandAloneMuonContainer> MuonMatchingTool :: searchL2SALinkInfo( const xAOD::Muon *mu, std::string trig) const {
310 ATH_MSG_DEBUG("MuonMonitoring::searchL2SALinkInfo()");
311 bool pass = false;
312 return matchLinkInfo<xAOD::L2StandAloneMuon>( mu, std::move(trig), 1000., pass, "HLT_MuonL2SAInfo");
313}
314
315const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: searchFastRecoSALinkInfo( const xAOD::Muon *mu, std::string trig) const {
316 ATH_MSG_DEBUG("MuonMonitoring::searchFastRecoLinkInfo()");
317 bool pass = false;
318 return matchLinkInfo<xAOD::Muon>( mu, std::move(trig), 1000., pass, "HLT_FastMuonsInfo");
319}
320
321const xAOD::L2StandAloneMuon* MuonMatchingTool :: matchL2SAReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
322 ATH_MSG_DEBUG("MuonMonitoring::matchL2SAReadHandle()");
323 float reqdR = m_L2SAreqdR;
325 reqdR = reqdRL1byPt(mu->pt());
326 const Amg::Vector3D extPos = offlineMuonAtPivot(ctx, mu);
327 if(extPos.norm()>ZERO_LIMIT){
329 }
330 }
331 const xAOD::TrackParticle* MuonTrack = nullptr;
332 using Type = xAOD::Muon::TrackParticleType;
333 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
334 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
335 Type::MuonSpectrometerTrackParticle};
336 for (Type type : types){
337 MuonTrack = mu->trackParticle(type);
338 if (MuonTrack) break;
339 }
340 return MuonTrack ? matchReadHandle<xAOD::L2StandAloneMuon>( MuonTrack, reqdR, m_L2MuonSAContainerKey, ctx) : nullptr;
341}
342
343const xAOD::Muon* MuonMatchingTool :: matchFastRecoSAReadHandle(const EventContext& ctx, const xAOD::Muon *mu) const {
344 ATH_MSG_DEBUG("MuonMonitoring::matchFastRecoSAReadHandle()");
345 float reqdR = m_L2SAreqdR;
347 reqdR = reqdRL1byPt(mu->pt());
348 const Amg::Vector3D extPos = offlineMuonAtPivot(ctx, mu);
349 if(extPos.norm()>ZERO_LIMIT){
350 return matchReadHandle<xAOD::Muon>( &extPos, reqdR, m_EFFastRecoContainerKey, ctx);
351 }
352 }
353 const xAOD::TrackParticle* MuonTrack = nullptr;
354 using Type = xAOD::Muon::TrackParticleType;
355 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
356 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
357 Type::MuonSpectrometerTrackParticle};
358 for (Type type : types){
359 MuonTrack = mu->trackParticle(type);
360 if (MuonTrack) break;
361 }
362 return MuonTrack ? matchReadHandle<xAOD::Muon>( MuonTrack, reqdR, m_EFFastRecoContainerKey, ctx) : nullptr;
363}
364
365const xAOD::L2CombinedMuon* MuonMatchingTool :: matchL2CB( const xAOD::Muon *mu, std::string trig, bool &pass) const {
366 ATH_MSG_DEBUG("MuonMonitoring::matchL2CB()");
367 return match<xAOD::L2CombinedMuon>( mu, std::move(trig), m_L2CBreqdR, pass, "HLT_MuonL2CBInfo");
368}
369
370const xAOD::L2CombinedMuon* MuonMatchingTool :: matchL2CB( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
371 ATH_MSG_DEBUG("MuonMonitoring::matchL2CB() from TruthParticle");
372 return match<xAOD::L2CombinedMuon>( mu, std::move(trig), m_L2CBreqdR, pass, "HLT_MuonL2CBInfo");
373}
374
375const TrigCompositeUtils::LinkInfo<xAOD::L2CombinedMuonContainer> MuonMatchingTool :: searchL2CBLinkInfo( const xAOD::Muon *mu, std::string trig) const {
376 ATH_MSG_DEBUG("MuonMonitoring::searchL2CBLinkInfo()");
377 bool pass = false;
378 return matchLinkInfo<xAOD::L2CombinedMuon>( mu, std::move(trig), 1000., pass, "HLT_MuonL2CBInfo");
379}
380
381const xAOD::L2CombinedMuon* MuonMatchingTool :: matchL2CBReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
382 ATH_MSG_DEBUG("MuonMonitoring::matchL2CBReadHandle()");
383 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
384 return MuonTrack ? matchReadHandle<xAOD::L2CombinedMuon>( MuonTrack, m_L2CBreqdR, m_L2muCombContainerKey, ctx) : nullptr;
385}
386
387const xAOD::MuonRoI* MuonMatchingTool :: matchL1( const EventContext& ctx, double refEta, double refPhi, double reqdR, const std::string& trig, bool &pass) const {
388
390 const TrigConf::HLTChain* chainCfg = m_trigDec->ExperimentalAndExpertMethods().getChainConfigurationDetails(trig);
391 const std::string L1toMatch = chainCfg->lower_chain_name().substr(3);
392
394 const xAOD::MuonRoI *closest = nullptr;
395
396 for (const xAOD::MuonRoI* l1muon : *L1rois){
397
398 // get all L1 thresholds from the L1 menu along with whether the L1roi passed each of those or not
399 const std::vector<std::pair<std::shared_ptr<TrigConf::L1Threshold>, bool> > L1thr_list = m_thresholdTool-> getThresholdDecisions(
400 l1muon->roiWord(), ctx);
401
402 // check the L1 threshold we are looking for
403 bool L1thr_isMatch = false;
404 for(const std::pair<std::shared_ptr<TrigConf::L1Threshold>, bool>& L1thr : L1thr_list){
405 if (L1toMatch == L1thr.first->name()){
406 L1thr_isMatch = L1thr.second;
407 break;
408 }
409 }
410 if (!L1thr_isMatch) continue;
411
412 double l1muonEta = l1muon->eta();
413 double l1muonPhi = l1muon->phi();
414
415 double deta = refEta - l1muonEta;
416 double dphi = xAOD::P4Helpers::deltaPhi(refPhi, l1muonPhi);
417 double dR = std::sqrt(deta*deta + dphi*dphi);
418 ATH_MSG_DEBUG("L1 muon candidate eta=" << l1muonEta << " phi=" << l1muonPhi << " dR=" << dR);
419 if( dR<reqdR ){
420 reqdR = dR;
421 pass = true;
422 closest = l1muon;
423 ATH_MSG_DEBUG("*** L1 muon eta=" << l1muonEta << " phi=" << l1muonPhi << " dR=" << dR << " isPassed=true" );
424 }
425 else{
426 ATH_MSG_DEBUG("*** L1 muon eta=" << l1muonEta << " phi=" << l1muonPhi << " dR=" << dR << " isPassed=false" );
427 }
428 }
429 return closest;
430}
431
432const xAOD::MuonRoI* MuonMatchingTool :: matchL1( const EventContext& ctx, const xAOD::Muon *mu, const std::string& trig, bool &pass) const {
433 double refEta = mu->eta();
434 double refPhi = mu->phi();
435 double reqdR = 0.25;
436
438 reqdR = reqdRL1byPt(mu->pt());
439 const Amg::Vector3D extPos = offlineMuonAtPivot(ctx, mu);
440 if(extPos.norm()>ZERO_LIMIT){
441 refEta = extPos.eta();
442 refPhi = extPos.phi();
443 }
444 }
445 return matchL1(ctx, refEta, refPhi, reqdR, trig, pass);
446}
447
448const xAOD::MuonRoI* MuonMatchingTool :: matchL1( const EventContext& ctx, const xAOD::TruthParticle *mu, const std::string& trig, bool &pass) const {
449 double refEta = mu->eta();
450 double refPhi = mu->phi();
451 double reqdR = 0.25;
452 return matchL1(ctx, refEta, refPhi, reqdR, trig, pass);
453}
454
455const xAOD::Muon* MuonMatchingTool :: matchL2SAtoOff( const EventContext& ctx, const xAOD::L2StandAloneMuon* samu) const {
457}
458
459const xAOD::Muon* MuonMatchingTool :: matchFastRecoSAtoOff(const EventContext& ctx, const xAOD::Muon* samu) const {
461}
462
463const xAOD::Muon* MuonMatchingTool :: matchL2CBtoOff( const EventContext& ctx, const xAOD::L2CombinedMuon* cbmu) const {
465}
466
467
468bool MuonMatchingTool :: isMatchedL2SA(const xAOD::L2StandAloneMuon* samu, const xAOD::Muon* mu) const{
469 float offlEta = mu->eta();
470 float offlPhi = mu->phi();
471 float trigEta = samu->roiEta();
472 float trigPhi = samu->roiPhi();
473
474 float deta = offlEta - trigEta;
475 float dphi = xAOD::P4Helpers::deltaPhi(offlPhi, trigPhi);
476 float dR = sqrt(deta*deta + dphi*dphi);
477 return dR < m_L2SAreqdR;
478}
479
480bool MuonMatchingTool :: isMatchedL2CB(const xAOD::L2CombinedMuon* cbmu, const xAOD::Muon* mu) const{
481 float dR = xAOD::P4Helpers::deltaR(cbmu, mu, false);
482 return dR < m_L2CBreqdR;
483}
484
485bool MuonMatchingTool :: isMatchedL2InsideOut(const xAOD::L2CombinedMuon* cbiomu, const xAOD::Muon* mu) const{
486 float dR = xAOD::P4Helpers::deltaR(cbiomu, mu, false);
487 return dR < m_L2InsideOutreqdR;
488}
489
490double MuonMatchingTool :: FermiFunction(double x, double x0, double w) {
491 return 1/(1+TMath::Exp(-10*(x-x0)/w));
492}
493
494
495
496const Trk::TrackParameters* MuonMatchingTool :: extTrackToPivot(const EventContext& ctx, const xAOD::TrackParticle* track) const {
497
498 const Trk::TrackParameters *extRPC = nullptr;
499 const Trk::TrackParameters *extTGC = nullptr;
500
501 if(!track) return extTGC;
502 double trkEta = track->eta();
503 double extEta =0.;
504 bool isBarrel = true;
505
506 if( fabs(trkEta)<1.05){
507 extRPC = extTrackToRPC(ctx, track);
508 if(!extRPC){
509 isBarrel = false;
510 extTGC = extTrackToTGC(ctx, track);
511 }
512 else{
513 isBarrel = true;
514 extEta = extRPC->position().eta();
515 if(fabs(extEta)>=1.05){
516 extTGC = extTrackToTGC(ctx, track);
517 isBarrel = (extTGC) == nullptr;
518 }
519 }
520 }
521 else if( fabs(trkEta)>=1.05 ){
522 extTGC = extTrackToTGC(ctx, track);
523 if(!extTGC){
524 isBarrel = true;
525 extRPC = extTrackToRPC(ctx, track);
526 }
527 else{
528 isBarrel = false;
529 extEta = extTGC->position().eta();
530 if(fabs(extEta)<1.05){
531 extRPC = extTrackToRPC(ctx, track);
532 isBarrel = (extRPC) != nullptr;
533 }
534 }
535 }
536
537 ATH_MSG_DEBUG("extTGC=" << extTGC << " extRPC=" << extRPC << " isBarrel=" << isBarrel);
538 if( isBarrel) delete extTGC;
539 else if(!isBarrel) delete extRPC;
540 return (isBarrel) ? extRPC : extTGC;
541}
542
543
544
545const Trk::TrackParameters* MuonMatchingTool :: extTrackToTGC( const EventContext& ctx, const xAOD::TrackParticle* trk ) const {
546 ATH_MSG_DEBUG("extTrackToTGC");
547 if(!trk) return nullptr;
548 double TGC_Z = ( trk->eta()>0 )? 15153.0:-15153.0;
549 Amg::Transform3D matrix = Amg::Transform3D( Amg::Vector3D( 0.,0.,TGC_Z ) );
550 //object pointed by matrix will be deleted in destructer of DiscSurface, therefore release it
551 std::unique_ptr<Trk::DiscSurface> disc(new Trk::DiscSurface( matrix, 0., 15000.));
552 const bool boundaryCheck = true;
553
554 const Trk::TrackParameters* param = m_extrapolator->extrapolate(ctx,
555 trk->perigeeParameters(),
556 *disc,
558 boundaryCheck,
559 Trk::muon).release();
560
561 ATH_MSG_DEBUG("param=" << param
562 << " eta=" << ((param) ? param->position().eta() : 0)
563 << " phi=" << ((param) ? param->position().phi() : 0));;
564 return param;
565}
566
567
568
569const Trk::TrackParameters* MuonMatchingTool :: extTrackToRPC( const EventContext& ctx, const xAOD::TrackParticle* trk ) const {
570 ATH_MSG_DEBUG("extTrackToRPC");
571 if(!trk) return nullptr;
572 std::unique_ptr<Trk::CylinderSurface> barrel(new Trk::CylinderSurface( 7478., 15000. ));
573 const bool boundaryCheck = true;
574
575 const Trk::TrackParameters* param = m_extrapolator->extrapolate(ctx,
576 trk->perigeeParameters(),
577 *barrel,
579 boundaryCheck,
580 Trk::muon).release();
581 return param;
582}
583
584
585
586double MuonMatchingTool :: reqdRL1byPt( double mupt){
587 double dR = 0.08;
588 if( mupt < 10000. ) {
589 dR = -0.00001*mupt + 0.18;
590 }
591 return dR;
592}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
static const std::vector< std::string > types
#define x
const float ZERO_LIMIT
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
ToolHandle< LVL1::ITrigThresholdDecisionTool > m_thresholdTool
const float m_L2SAreqdR
const float m_L2InsideOutreqdR
static std::tuple< bool, double, double > trigPosForMatchSATrack(const xAOD::Muon *mu)
SG::ReadHandleKey< xAOD::MuonRoIContainer > m_MuonRoIContainerKey
const float m_L2CBreqdR
static std::tuple< bool, double, double > PosForMatchSATrack(const xAOD::Muon *mu)
PublicToolHandle< Trig::TrigDecisionTool > m_trigDec
const TrigCompositeUtils::LinkInfo< DataVector< T > > matchLinkInfo(const OFFL *offl, std::string trigger, float reqdR, bool &pass, const std::string &containerSGKey="", std::tuple< bool, double, double >(*trigPosForMatchFunc)(const T *)=&MuonMatchingTool::trigPosForMatch< T >) const
Function that searches for an online muon candidate of type T closest to a given offline muon.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_MStrackContainerKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_CBtrackContainerKey
const T * matchReadHandle(const OFFL *offl, float reqdR, SG::ReadHandleKey< DataVector< T > > ReadHandleKey, const EventContext &ctx, std::tuple< bool, double, double >(*trigPosForMatchFunc)(const T *)=&MuonMatchingTool::trigPosForMatch< T >) const
Function that searches for an online muon candidate of type T by ReadHandle and judges if it is match...
SG::ReadHandleKey< xAOD::MuonContainer > m_EFFastRecoContainerKey
SG::ReadHandleKey< xAOD::MuonContainer > m_EFCBMuonContainerKey
const xAOD::Muon * matchOff(const EventContext &ctx, const T *trig, float reqdR, std::tuple< bool, double, double >(*offlinePosForMatchFunc)(const xAOD::Muon *), std::tuple< bool, double, double >(*trigPosForMatchFunc)(const T *)=&MuonMatchingTool::trigPosForMatch< T >) const
Function that searches for an offline muon candidate matched to online muon of type T.
SG::ReadHandleKey< xAOD::MuonContainer > m_EFCBFSMuonContainerKey
static std::tuple< bool, double, double > trigPosForMatchCBTrack(const xAOD::Muon *mu)
static std::tuple< bool, double, double > PosForMatchCBTrack(const xAOD::Muon *mu)
const Trk::TrackParameters * extTrackToTGC(const EventContext &ctx, const xAOD::TrackParticle *track) const
SG::ReadHandleKey< xAOD::MuonContainer > m_EFSAFSMuonContainerKey
const Trk::TrackParameters * extTrackToPivot(const EventContext &ctx, const xAOD::TrackParticle *track) const
Function to extrapolate a Inner Detector track to the pivot plane i.e.
const Trk::TrackParameters * extTrackToRPC(const EventContext &ctx, const xAOD::TrackParticle *track) const
const xAOD::MuonRoI * matchL1(const EventContext &ctx, const xAOD::Muon *mu, const std::string &trigger, bool &pass) const
Function that searches for a Level 1 muon candidate and judges if it is matched to a given offline mu...
SG::ReadHandleKey< xAOD::L2StandAloneMuonContainer > m_L2MuonSAContainerKey
PublicToolHandle< Trk::IExtrapolator > m_extrapolator
SG::ReadHandleKey< xAOD::L2CombinedMuonContainer > m_L2muCombContainerKey
SG::ReadHandleKey< xAOD::MuonContainer > m_MuonContainerKey
static double reqdRL1byPt(double mupt)
Function compute dR used for matching offline muons and level 1 RoIs at the pivot plane.
Gaudi::Property< bool > m_use_extrapolator
const Amg::Vector3D offlineMuonAtPivot(const EventContext &ctx, const xAOD::Muon *mu) const
SG::ReadHandleKey< xAOD::MuonContainer > m_EFSAMuonContainerKey
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
HLT chain configuration information.
const std::string & lower_chain_name() const
Class for a CylinderSurface in the ATLAS detector.
Class for a DiscSurface in the ATLAS detector.
Definition DiscSurface.h:54
const Amg::Vector3D & position() const
Access method for the position.
float roiEta() const
Get and set RoI eta.
float roiPhi() const
Get and set RoI phi.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition hcg.cxx:359
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
@ anyDirection
ParametersBase< TrackParametersDim, Charged > TrackParameters
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
L2CombinedMuon_v1 L2CombinedMuon
Define the latest version of the muon CB class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
L2StandAloneMuon_v2 L2StandAloneMuon
Define the latest version of the muon SA class.
MuonRoI_v1 MuonRoI
Definition MuonRoI.h:15
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition LinkInfo.h:22
ElementLink< T > link
Link to the feature.
Definition LinkInfo.h:55