ATLAS Offline Software
Loading...
Searching...
No Matches
MuonMatchingTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 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() );
26 ATH_CHECK( m_L2muCombContainerKey.initialize() );
27 ATH_CHECK( m_EFSAMuonContainerKey.initialize() );
28 ATH_CHECK( m_EFCBMuonContainerKey.initialize() );
29 ATH_CHECK( m_EFSAFSMuonContainerKey.initialize() );
30 ATH_CHECK( m_EFCBFSMuonContainerKey.initialize() );
31 ATH_CHECK( m_MStrackContainerKey.initialize() );
32 ATH_CHECK( m_CBtrackContainerKey.initialize() );
33
34 return StatusCode::SUCCESS;
35}
36
37
38const Amg::Vector3D MuonMatchingTool :: offlineMuonAtPivot(const xAOD::Muon* mu) const{
39 const xAOD::TrackParticle* track = mu->primaryTrackParticle();
40 std::unique_ptr<const Trk::TrackParameters> extPars(extTrackToPivot(track));
41 return extPars ? extPars->position() : Amg::Vector3D(0.,0.,0.);
42}
43
44
45template<>
46std::tuple<bool, double,double> MuonMatchingTool :: trigPosForMatch<xAOD::L2StandAloneMuon>(const xAOD::L2StandAloneMuon *trig){
47 return std::forward_as_tuple(true, trig->roiEta(), trig->roiPhi());
48}
49
50
51std::tuple<bool, double,double> MuonMatchingTool :: trigPosForMatchSATrack(const xAOD::Muon *mu){
52 return mu->muonType() == xAOD::Muon::MuonType::MuonStandAlone ? std::forward_as_tuple(true, mu->eta(), mu->phi()) : std::forward_as_tuple(false, 0., 0.);
53}
54
55std::tuple<bool, double,double> MuonMatchingTool :: trigPosForMatchCBTrack(const xAOD::Muon *mu){
56 return mu->muonType() == xAOD::Muon::MuonType::Combined ? std::forward_as_tuple(true, mu->eta(), mu->phi()) : std::forward_as_tuple(false, 0., 0.);
57}
58
59std::tuple<bool, double,double> MuonMatchingTool :: PosForMatchSATrack(const xAOD::Muon *mu){
60 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
61 return MuonTrack ? std::forward_as_tuple(true, MuonTrack->eta(), MuonTrack->phi()) : std::forward_as_tuple(false, 0., 0.);
62}
63
64std::tuple<bool, double,double> MuonMatchingTool :: PosForMatchCBTrack(const xAOD::Muon *mu){
65 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle);
66 return MuonTrack ? std::forward_as_tuple(true, MuonTrack->eta(), MuonTrack->phi()) : std::forward_as_tuple(false, 0., 0.);
67}
68
69
70const xAOD::Muon* MuonMatchingTool :: matchEFSA(const xAOD::Muon *mu, std::string trig, bool &pass) const {
71 ATH_MSG_DEBUG("MuonMonitoring::matchEFSA()");
72 const xAOD::TrackParticle* MuonTrack = nullptr;
73 using Type = xAOD::Muon::TrackParticleType;
74 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
75 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
76 Type::MuonSpectrometerTrackParticle};
77 for (Type type : types){
78 MuonTrack = mu->trackParticle(type);
79 ATH_MSG_DEBUG("HLT_Muons_RoI SA Muon");
80 if (MuonTrack) break;
81 }
82 return MuonTrack ? match<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_RoI.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
83}
84
85const xAOD::Muon* MuonMatchingTool :: matchEFSA(const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
86 ATH_MSG_DEBUG("MuonMonitoring::matchEFSA() for truth particle");
87 return mu ? match<xAOD::Muon>(mu, std::move(trig), m_EFreqdR, pass, "HLT_Muons_RoI.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
88}
89
90const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFSALinkInfo(const xAOD::Muon *mu, std::string trig) const {
91 ATH_MSG_DEBUG("MuonMonitoring::matchEFSALinkInfo()");
92 bool pass = false;
94 const xAOD::TrackParticle* MuonTrack = nullptr;
95 using Type = xAOD::Muon::TrackParticleType;
96 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
97 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
98 Type::MuonSpectrometerTrackParticle};
99 for (Type type : types){
100 MuonTrack = mu->trackParticle(type);
101 if (MuonTrack) break;
102 }
103 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_RoI.*", &MuonMatchingTool::trigPosForMatchSATrack) : muonLinkInfo;
104}
105
106const xAOD::Muon* MuonMatchingTool :: matchEFSAReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
107 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAReadHandle()");
108 const xAOD::TrackParticle* MuonTrack = nullptr;
109 using Type = xAOD::Muon::TrackParticleType;
110 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
111 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
112 Type::MuonSpectrometerTrackParticle};
113 for (Type type : types){
114 MuonTrack = mu->trackParticle(type);
115 if (MuonTrack) break;
116 }
118}
119
120const xAOD::Muon* MuonMatchingTool :: matchEFCB( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
121 ATH_MSG_DEBUG("MuonMonitoring::matchEFCB() for TruthParticle");
122 return mu ? match<xAOD::Muon>( mu, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_RoI*.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
123}
124
125const xAOD::Muon* MuonMatchingTool :: matchEFCB( const xAOD::Muon *mu, std::string trig, bool &pass) const {
126 ATH_MSG_DEBUG("MuonMonitoring::matchEFCB()");
127 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
128 ATH_MSG_DEBUG("HLT_Muons_RoI CB Muon");
129 return MuonTrack ? match<xAOD::Muon>( MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_RoI*.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
130}
131
132const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFCBLinkInfo( const xAOD::Muon *mu, std::string trig) const {
133 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBLinkInfo()");
134 bool pass = false;
136 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
137 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_RoI*.*", &MuonMatchingTool::trigPosForMatchCBTrack) : muonLinkInfo;
138}
139
140const xAOD::Muon* MuonMatchingTool :: matchEFCBReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
141 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBReadHandle()");
142 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
144}
145
146const xAOD::Muon* MuonMatchingTool :: matchEFSAFS(const xAOD::Muon *mu, std::string trig, bool &pass) const {
147 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFS()");
148 const xAOD::TrackParticle* MuonTrack = nullptr;
149 using Type = xAOD::Muon::TrackParticleType;
150 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
151 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
152 Type::MuonSpectrometerTrackParticle};
153 for (Type type : types){
154 MuonTrack = mu->trackParticle(type);
155 ATH_MSG_DEBUG("HLT_Muons_FS SA Muon");
156 if (MuonTrack) break;
157 }
158 return MuonTrack ? match<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_FS.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
159}
160
161const xAOD::Muon* MuonMatchingTool :: matchEFSAFS(const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
162 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFS() for truth particle");
163 return mu ? match<xAOD::Muon>(mu, std::move(trig), m_EFreqdR, pass, "HLT_Muons_FS.*", &MuonMatchingTool::trigPosForMatchSATrack) : nullptr;
164}
165
166const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFSAFSLinkInfo(const xAOD::Muon *mu, std::string trig) const {
167 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFSLinkInfo()");
168 bool pass = false;
170 const xAOD::TrackParticle* MuonTrack = nullptr;
171 using Type = xAOD::Muon::TrackParticleType;
172 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
173 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
174 Type::MuonSpectrometerTrackParticle};
175 for (Type type : types){
176 MuonTrack = mu->trackParticle(type);
177 if (MuonTrack) break;
178 }
179 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_Muons_FS.*", &MuonMatchingTool::trigPosForMatchSATrack) : muonLinkInfo;
180}
181
182const xAOD::Muon* MuonMatchingTool :: matchEFSAFSReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
183 ATH_MSG_DEBUG("MuonMonitoring::matchEFSAFSReadHandle()");
184 const xAOD::TrackParticle* MuonTrack = nullptr;
185 using Type = xAOD::Muon::TrackParticleType;
186 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
187 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
188 Type::MuonSpectrometerTrackParticle};
189 for (Type type : types){
190 MuonTrack = mu->trackParticle(type);
191 if (MuonTrack) break;
192 }
194}
195
196const xAOD::Muon* MuonMatchingTool :: matchEFCBFS( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
197 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFS() for TruthParticle");
198 return mu ? match<xAOD::Muon>( mu, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_FS.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
199}
200
201const xAOD::Muon* MuonMatchingTool :: matchEFCBFS( const xAOD::Muon *mu, std::string trig, bool &pass) const {
202 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFS()");
203 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
204 ATH_MSG_DEBUG("HLT_Muons_FS CB Muon");
205 return MuonTrack ? match<xAOD::Muon>( MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_FS.*", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
206}
207
208const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFCBFSLinkInfo( const xAOD::Muon *mu, std::string trig) const {
209 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFSLinkInfo()");
210 bool pass = false;
212 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
213 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsCB_FS.*", &MuonMatchingTool::trigPosForMatchCBTrack) : muonLinkInfo;
214}
215
216const xAOD::Muon* MuonMatchingTool :: matchEFCBFSReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
217 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBFSReadHandle()");
218 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
220}
221
222const xAOD::Muon* MuonMatchingTool :: matchEFIso( const xAOD::Muon *mu, std::string trig, bool &pass) const {
223 ATH_MSG_DEBUG("MuonMonitoring::matchEFIso()");
224 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
225 return MuonTrack ? match<xAOD::Muon>( MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsIso", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
226}
227
228const xAOD::Muon* MuonMatchingTool :: matchEFIso( const xAOD::TruthParticle *mu, std::string trig, bool &pass) const {
229 ATH_MSG_DEBUG("MuonMonitoring::matchEFIso() for truth particle");
230 return mu ? match<xAOD::Muon>( mu, std::move(trig), m_EFreqdR, pass, "HLT_MuonsIso", &MuonMatchingTool::trigPosForMatchCBTrack) : nullptr;
231}
232
233
234const xAOD::TrackParticle* MuonMatchingTool :: SearchEFTrack(const EventContext &ctx, const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer>& muLinkInfo, const SG::ReadHandleKey<xAOD::TrackParticleContainer>& ReadHandleKey) const {
235 const xAOD::TrackParticle* MatchedTrack = nullptr;
236 const ElementLink<xAOD::MuonContainer> muEL = muLinkInfo.link;
237 float EFEta = (*muEL)->eta();
238 float EFPhi = (*muEL)->phi();
239 float mindR = 999.;
240
241 SG::ReadHandle<xAOD::TrackParticleContainer> trackHandle(ReadHandleKey, ctx);
242 if ( !trackHandle.isValid() ) return MatchedTrack;
243
244 const auto track = m_trigDec->associateToEventView<xAOD::TrackParticleContainer>(trackHandle, muLinkInfo);
245 const xAOD::TrackParticleContainer::const_iterator begin = track.first;
246 const xAOD::TrackParticleContainer::const_iterator end = track.second;
247
248 for (xAOD::TrackParticleContainer::const_iterator it = begin; it != end; ++it) {
249
250 float deta = EFEta - (*it)->eta();
251 float dphi = xAOD::P4Helpers::deltaPhi(EFPhi, (*it)->phi() );
252 float dR = std::sqrt(deta*deta + dphi*dphi);
253
254 if( dR< mindR ){
255 mindR = dR;
256 MatchedTrack = (*it);
257 }
258 }
259
260 return MatchedTrack;
261
262}
263
264const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> MuonMatchingTool :: matchEFIsoLinkInfo( const xAOD::Muon *mu, std::string trig) const {
265 ATH_MSG_DEBUG("MuonMonitoring::matchEFCBLinkInfo()");
266 bool pass = false;
268 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
269 return MuonTrack ? matchLinkInfo<xAOD::Muon>(MuonTrack, std::move(trig), m_EFreqdR, pass, "HLT_MuonsIso", &MuonMatchingTool::trigPosForMatchCBTrack) : muonLinkInfo;
270}
271
272
273const xAOD::L2StandAloneMuon* MuonMatchingTool :: matchL2SA( 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(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 TrigCompositeUtils::LinkInfo<xAOD::L2StandAloneMuonContainer> MuonMatchingTool :: searchL2SALinkInfo( const xAOD::Muon *mu, std::string trig) const {
287 ATH_MSG_DEBUG("MuonMonitoring::searchL2SALinkInfo()");
288 bool pass = false;
289 return matchLinkInfo<xAOD::L2StandAloneMuon>( mu, std::move(trig), 1000., pass, "HLT_MuonL2SAInfo");
290}
291
292const xAOD::L2StandAloneMuon* MuonMatchingTool :: matchL2SAReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
293 ATH_MSG_DEBUG("MuonMonitoring::matchL2SAReadHandle()");
294 float reqdR = m_L2SAreqdR;
296 reqdR = reqdRL1byPt(mu->pt());
297 const Amg::Vector3D extPos = offlineMuonAtPivot(mu);
298 if(extPos.norm()>ZERO_LIMIT){
300 }
301 }
302 const xAOD::TrackParticle* MuonTrack = nullptr;
303 using Type = xAOD::Muon::TrackParticleType;
304 std::vector<Type> types { Type::ExtrapolatedMuonSpectrometerTrackParticle,
305 Type::MSOnlyExtrapolatedMuonSpectrometerTrackParticle,
306 Type::MuonSpectrometerTrackParticle};
307 for (Type type : types){
308 MuonTrack = mu->trackParticle(type);
309 if (MuonTrack) break;
310 }
311 return MuonTrack ? matchReadHandle<xAOD::L2StandAloneMuon>( MuonTrack, reqdR, m_L2MuonSAContainerKey, ctx) : nullptr;
312}
313
314
315const xAOD::L2CombinedMuon* MuonMatchingTool :: matchL2CB( const xAOD::Muon *mu, std::string trig, bool &pass) const {
316 ATH_MSG_DEBUG("MuonMonitoring::matchL2CB()");
317 return match<xAOD::L2CombinedMuon>( mu, std::move(trig), m_L2CBreqdR, pass, "HLT_MuonL2CBInfo");
318}
319
320const TrigCompositeUtils::LinkInfo<xAOD::L2CombinedMuonContainer> MuonMatchingTool :: searchL2CBLinkInfo( const xAOD::Muon *mu, std::string trig) const {
321 ATH_MSG_DEBUG("MuonMonitoring::searchL2CBLinkInfo()");
322 bool pass = false;
323 return matchLinkInfo<xAOD::L2CombinedMuon>( mu, std::move(trig), 1000., pass, "HLT_MuonL2CBInfo");
324}
325
326const xAOD::L2CombinedMuon* MuonMatchingTool :: matchL2CBReadHandle( const EventContext& ctx, const xAOD::Muon *mu) const {
327 ATH_MSG_DEBUG("MuonMonitoring::matchL2CBReadHandle()");
328 const xAOD::TrackParticle* MuonTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::Primary);
329 return MuonTrack ? matchReadHandle<xAOD::L2CombinedMuon>( MuonTrack, m_L2CBreqdR, m_L2muCombContainerKey, ctx) : nullptr;
330}
331
332const xAOD::MuonRoI* MuonMatchingTool :: matchL1( double refEta, double refPhi, double reqdR, const std::string& trig, bool &pass) const {
333
335 const TrigConf::HLTChain* chainCfg = m_trigDec->ExperimentalAndExpertMethods().getChainConfigurationDetails(trig);
336 const std::string L1toMatch = chainCfg->lower_chain_name().substr(3);
337
338 SG::ReadHandle<xAOD::MuonRoIContainer> L1rois(m_MuonRoIContainerKey, Gaudi::Hive::currentContext());
339 const xAOD::MuonRoI *closest = nullptr;
340
341 for (const xAOD::MuonRoI* l1muon : *L1rois){
342
343 // get all L1 thresholds from the L1 menu along with whether the L1roi passed each of those or not
344 const std::vector<std::pair<std::shared_ptr<TrigConf::L1Threshold>, bool> > L1thr_list = m_thresholdTool-> getThresholdDecisions(
345 l1muon->roiWord(), Gaudi::Hive::currentContext());
346
347 // check the L1 threshold we are looking for
348 bool L1thr_isMatch = false;
349 for(const std::pair<std::shared_ptr<TrigConf::L1Threshold>, bool>& L1thr : L1thr_list){
350 std::shared_ptr<TrigConf::L1Threshold_MU> thr = std::static_pointer_cast<TrigConf::L1Threshold_MU>(L1thr.first);
351 if (L1toMatch == thr->name()){
352 L1thr_isMatch = L1thr.second;
353 break;
354 }
355 }
356 if (!L1thr_isMatch) continue;
357
358 double l1muonEta = l1muon->eta();
359 double l1muonPhi = l1muon->phi();
360
361 double deta = refEta - l1muonEta;
362 double dphi = xAOD::P4Helpers::deltaPhi(refPhi, l1muonPhi);
363 double dR = std::sqrt(deta*deta + dphi*dphi);
364 ATH_MSG_DEBUG("L1 muon candidate eta=" << l1muonEta << " phi=" << l1muonPhi << " dR=" << dR);
365 if( dR<reqdR ){
366 reqdR = dR;
367 pass = true;
368 closest = l1muon;
369 ATH_MSG_DEBUG("*** L1 muon eta=" << l1muonEta << " phi=" << l1muonPhi << " dR=" << dR << " isPassed=true" );
370 }
371 else{
372 ATH_MSG_DEBUG("*** L1 muon eta=" << l1muonEta << " phi=" << l1muonPhi << " dR=" << dR << " isPassed=false" );
373 }
374 }
375 return closest;
376}
377
378const xAOD::MuonRoI* MuonMatchingTool :: matchL1( const xAOD::Muon *mu, const std::string& trig, bool &pass) const {
379 double refEta = mu->eta();
380 double refPhi = mu->phi();
381 double reqdR = 0.25;
382
384 reqdR = reqdRL1byPt(mu->pt());
385 const Amg::Vector3D extPos = offlineMuonAtPivot(mu);
386 if(extPos.norm()>ZERO_LIMIT){
387 refEta = extPos.eta();
388 refPhi = extPos.phi();
389 }
390 }
391 return matchL1(refEta, refPhi, reqdR, trig, pass);
392}
393
394const xAOD::MuonRoI* MuonMatchingTool :: matchL1( const xAOD::TruthParticle *mu, const std::string& trig, bool &pass) const {
395 double refEta = mu->eta();
396 double refPhi = mu->phi();
397 double reqdR = 0.25;
398 return matchL1(refEta, refPhi, reqdR, trig, pass);
399}
400
401const xAOD::Muon* MuonMatchingTool :: matchL2SAtoOff( const EventContext& ctx, const xAOD::L2StandAloneMuon* samu) const {
403}
404
405const xAOD::Muon* MuonMatchingTool :: matchL2CBtoOff( const EventContext& ctx, const xAOD::L2CombinedMuon* cbmu) const {
407}
408
409
410bool MuonMatchingTool :: isMatchedL2SA(const xAOD::L2StandAloneMuon* samu, const xAOD::Muon* mu) const{
411 float offlEta = mu->eta();
412 float offlPhi = mu->phi();
413 float trigEta = samu->roiEta();
414 float trigPhi = samu->roiPhi();
415
416 float deta = offlEta - trigEta;
417 float dphi = xAOD::P4Helpers::deltaPhi(offlPhi, trigPhi);
418 float dR = sqrt(deta*deta + dphi*dphi);
419 return dR < m_L2SAreqdR;
420}
421
422bool MuonMatchingTool :: isMatchedL2CB(const xAOD::L2CombinedMuon* cbmu, const xAOD::Muon* mu) const{
423 float dR = xAOD::P4Helpers::deltaR(cbmu, mu, false);
424 return dR < m_L2CBreqdR;
425}
426
427bool MuonMatchingTool :: isMatchedL2InsideOut(const xAOD::L2CombinedMuon* cbiomu, const xAOD::Muon* mu) const{
428 float dR = xAOD::P4Helpers::deltaR(cbiomu, mu, false);
429 return dR < m_L2InsideOutreqdR;
430}
431
432double MuonMatchingTool :: FermiFunction(double x, double x0, double w) {
433 return 1/(1+TMath::Exp(-10*(x-x0)/w));
434}
435
436
437
438const Trk::TrackParameters* MuonMatchingTool :: extTrackToPivot(const xAOD::TrackParticle* track) const {
439
440 const Trk::TrackParameters *extRPC = nullptr;
441 const Trk::TrackParameters *extTGC = nullptr;
442
443 if(!track) return extTGC;
444 double trkEta = track->eta();
445 double extEta =0.;
446 bool isBarrel = true;
447
448 if( fabs(trkEta)<1.05){
449 extRPC = extTrackToRPC(track);
450 if(!extRPC){
451 isBarrel = false;
452 extTGC = extTrackToTGC(track);
453 }
454 else{
455 isBarrel = true;
456 extEta = extRPC->position().eta();
457 if(fabs(extEta)>=1.05){
458 extTGC = extTrackToTGC(track);
459 isBarrel = (extTGC) == nullptr;
460 }
461 }
462 }
463 else if( fabs(trkEta)>=1.05 ){
464 extTGC = extTrackToTGC(track);
465 if(!extTGC){
466 isBarrel = true;
467 extRPC = extTrackToRPC(track);
468 }
469 else{
470 isBarrel = false;
471 extEta = extTGC->position().eta();
472 if(fabs(extEta)<1.05){
473 extRPC = extTrackToRPC(track);
474 isBarrel = (extRPC) != nullptr;
475 }
476 }
477 }
478
479 ATH_MSG_DEBUG("extTGC=" << extTGC << " extRPC=" << extRPC << " isBarrel=" << isBarrel);
480 if( isBarrel) delete extTGC;
481 else if(!isBarrel) delete extRPC;
482 return (isBarrel) ? extRPC : extTGC;
483}
484
485
486
487const Trk::TrackParameters* MuonMatchingTool :: extTrackToTGC( const xAOD::TrackParticle* trk ) const {
488 ATH_MSG_DEBUG("extTrackToTGC");
489 if(!trk) return nullptr;
490 double TGC_Z = ( trk->eta()>0 )? 15153.0:-15153.0;
491 Amg::Transform3D matrix = Amg::Transform3D( Amg::Vector3D( 0.,0.,TGC_Z ) );
492 //object pointed by matrix will be deleted in destructer of DiscSurface, therefore release it
493 std::unique_ptr<Trk::DiscSurface> disc(new Trk::DiscSurface( matrix, 0., 15000.));
494 const bool boundaryCheck = true;
495
496 const Trk::TrackParameters* param = m_extrapolator->extrapolate(Gaudi::Hive::currentContext(),
497 trk->perigeeParameters(),
498 *disc,
500 boundaryCheck,
501 Trk::muon).release();
502
503 ATH_MSG_DEBUG("param=" << param
504 << " eta=" << ((param) ? param->position().eta() : 0)
505 << " phi=" << ((param) ? param->position().phi() : 0));;
506 return param;
507}
508
509
510
511const Trk::TrackParameters* MuonMatchingTool :: extTrackToRPC( const xAOD::TrackParticle* trk ) const {
512 ATH_MSG_DEBUG("extTrackToRPC");
513 if(!trk) return nullptr;
514 std::unique_ptr<Trk::CylinderSurface> barrel(new Trk::CylinderSurface( 7478., 15000. ));
515 const bool boundaryCheck = true;
516
517 const Trk::TrackParameters* param = m_extrapolator->extrapolate(Gaudi::Hive::currentContext(),
518 trk->perigeeParameters(),
519 *barrel,
521 boundaryCheck,
522 Trk::muon).release();
523 return param;
524}
525
526
527
528double MuonMatchingTool :: reqdRL1byPt( double mupt){
529 double dR = 0.08;
530 if( mupt < 10000. ) {
531 dR = -0.00001*mupt + 0.18;
532 }
533 return dR;
534}
#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 Trk::TrackParameters * extTrackToPivot(const xAOD::TrackParticle *track) const
Function to extrapolate a Inner Detector track to the pivot plane i.e.
const float m_L2SAreqdR
const float m_L2InsideOutreqdR
const Amg::Vector3D offlineMuonAtPivot(const xAOD::Muon *mu) const
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 Trk::TrackParameters * extTrackToRPC(const xAOD::TrackParticle *track) const
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_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)
SG::ReadHandleKey< xAOD::MuonContainer > m_EFSAFSMuonContainerKey
const Trk::TrackParameters * extTrackToTGC(const xAOD::TrackParticle *track) const
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 xAOD::MuonRoI * matchL1(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::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:357
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