ATLAS Offline Software
KinkTrkZmumuTagTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // KinkTrkZmumuTagTool.cxx, (c) ATLAS Detector software
8 // Author: Shimpei Yamamoto (shimpei.yamamoto@cern.ch)
9 
13 #include <vector>
14 #include <string>
15 
16 // Constructor
18  const std::string& n,
19  const IInterface* p):
20  AthAlgTool(t, n, p),
21  m_trigDecisionTool("Trig::TrigDecisionTool/TrigDecisionTool"),
22  m_trigMatchTool("TrigMatchTool/TrigMatchTool"),
23  m_trigNames(std::vector<std::string>()),
24  m_trigMatchDeltaR(0.1),
25  m_muonSelectionTool("CP::MuonSelectionTool/MuonSelectionTool"),
26  m_muonIDKeys(std::vector<std::string>()),
27  m_muonPtCut(0),
28  m_muonEtaMax(9999),
29  m_trackPtCut(0),
30  m_trackEtaMax(9999),
31  m_diMuonMassLow(50.),
32  m_diMuonMassHigh(-1),
33  m_dPhiMax(10),
34  m_doOppositeSignReq(false)
35 {
36  declareInterface<DerivationFramework::IAugmentationTool>(this);
37  declareProperty("TriggerDecisionTool", m_trigDecisionTool);
38  declareProperty("TriggerMatchTool", m_trigMatchTool);
39  declareProperty("Triggers", m_trigNames);
40  declareProperty("TriggerMatchDeltaR", m_trigMatchDeltaR);
41  declareProperty("RequireTriggerMatch", m_doTrigMatch);
42  declareProperty("MuonIDKeys", m_muonIDKeys);
43  declareProperty("MuonPtMin", m_muonPtCut);
44  declareProperty("MuonEtaMax", m_muonEtaMax);
45  declareProperty("TrackPtMin", m_trackPtCut);
46  declareProperty("TrackEtaMax", m_trackEtaMax);
47  declareProperty("DiMuonMassLow", m_diMuonMassLow);
48  declareProperty("DiMuonMassHigh", m_diMuonMassHigh);
49  declareProperty("DeltaPhiMax", m_dPhiMax);
50  declareProperty("RequireOppositeSign", m_doOppositeSignReq);
51 }
52 
53 
54 // Destructor
56 }
57 
58 
59 // Athena initialize and finalize
61 {
62  ATH_MSG_VERBOSE("initialize() ...");
63 
64  // trigger decision tool
65  if (m_trigNames.size()>0) {
66  if (m_trigDecisionTool.retrieve().isFailure()) {
67  ATH_MSG_FATAL("Failed to retrieve tool: " << m_trigDecisionTool);
68  return StatusCode::FAILURE;
69  }
70  ATH_MSG_INFO("TriggerDecisionTool: " << m_trigDecisionTool);
71 
72  if (m_trigMatchTool.empty()) {
73  ATH_MSG_FATAL("TrigMatchTool is not specified.");
74  return StatusCode::FAILURE;
75  }
76  CHECK(m_trigMatchTool.retrieve());
77  ATH_MSG_INFO("TrgMatchTool retrived successfully");
78  }
79 
80  CHECK(m_muonSelectionTool.retrieve());
81 
82  ATH_CHECK(m_muonSGKey.initialize());
83  ATH_CHECK(m_trackSGKey.initialize());
84  ATH_CHECK(m_KinkTrkDiMuMassKey.initialize());
85  ATH_CHECK(m_KinkTrkProbeMuPtKey.initialize());
86 
87  return StatusCode::SUCCESS;
88 }
89 
90 
92 {
93  ATH_MSG_VERBOSE("finalize() ...");
94  return StatusCode::SUCCESS;
95 }
96 
97 
98 
99 // Augmentation
101 {
102 
103  SG::WriteHandle< std::vector<float> > diMuonTrkMass(m_KinkTrkDiMuMassKey);
104  ATH_CHECK(diMuonTrkMass.record(std::make_unique< std::vector<float> >()));
105 
106  SG::WriteHandle< std::vector<float> > probeMuPt(m_KinkTrkProbeMuPtKey);
107  ATH_CHECK(probeMuPt.record(std::make_unique< std::vector<float> >()));
108 
109  SG::ReadHandle<xAOD::MuonContainer> muons(m_muonSGKey);
110  if( !muons.isValid() ) {
111  msg(MSG::WARNING) << "No Muon container found, will skip this event" << endmsg;
112  return StatusCode::FAILURE;
113  }
114 
115  SG::ReadHandle<xAOD::TrackParticleContainer> mstracks(m_trackSGKey);
116  if( !mstracks.isValid() ) {
117  msg(MSG::WARNING) << "No MS track container found, will skip this event" << endmsg;
118  return StatusCode::FAILURE;
119  }
120 
121  for (auto muon: *muons) {
122  if (!checkTagMuon(muon)) continue;
123  for (auto track: *mstracks) {
124  if (!checkMSTrack(track)) continue;
125  if (!checkMuonTrackPair(muon, track)) continue;
126  diMuonTrkMass->push_back((muon->p4()+track->p4()).M());
127  probeMuPt->push_back(track->pt());
128  }
129  }
130 
131  return StatusCode::SUCCESS;
132 }
133 
134 
135 bool DerivationFramework::KinkTrkZmumuTagTool::passTrigger(const std::vector<std::string>& triggers) const
136 {
137  for (unsigned int i=0; i<triggers.size(); i++) {
138  if (m_trigDecisionTool->isPassed(triggers[i])) return true;
139  }
140  return false;
141 }
142 
143 
145 {
146  if (!passMuonQuality(muon)) return false;
147  if (m_doTrigMatch) {
148  if (!passMuonTrigMatch(muon, m_trigNames)) return false;
149  }
150  return true;
151 }
152 
153 
155 {
156  if (!passMSTrackQuality(track)) return false;
157  return true;
158 }
159 
160 
162 {
163  if (std::abs(muon->p4().DeltaPhi(track->p4())) > m_dPhiMax) return false;
164  if (m_doOppositeSignReq) {
165  if (muon->charge()*track->charge() > 0) return false;
166  }
167  float mass = (muon->p4()+track->p4()).M();
168  if (mass < m_diMuonMassLow) return false;
169  if (mass > m_diMuonMassHigh) return false;
170  return true;
171 }
172 
173 
175 {
176  if( muon->pt() < m_muonPtCut ) return false;
177  if( std::abs(muon->eta()) > m_muonEtaMax ) return false;
178  if( !m_muonSelectionTool->passedMuonCuts(*muon) ) return false;
179  if( muon->muonType() != xAOD::Muon::Combined ) return false;
180 
181  // Good muon!
182  return true;
183 }
184 
185 
187 {
188  if (track->pt() < m_trackPtCut) return false;
189  if (std::abs(track->eta()) > m_trackEtaMax) return false;
190  return true;
191 }
192 
193 
194 // checking the muon trigger matching
195 bool DerivationFramework::KinkTrkZmumuTagTool::passMuonTrigMatch(const xAOD::Muon *muon, const std::vector<std::string>& triggers) const
196 {
197  for (unsigned int i=0; i<triggers.size(); i++) {
198  if (m_trigMatchTool->chainPassedByObject<TrigMatch::TrigMuonEF, xAOD::Muon>(muon, triggers[i], m_trigMatchDeltaR)) return true;
199  }
200  return false;
201 }
202 
DerivationFramework::KinkTrkZmumuTagTool::checkMuonTrackPair
bool checkMuonTrackPair(const xAOD::Muon *muon, const xAOD::TrackParticle *track) const
Definition: KinkTrkZmumuTagTool.cxx:161
DerivationFramework::KinkTrkZmumuTagTool::m_muonIDKeys
std::vector< std::string > m_muonIDKeys
Definition: KinkTrkZmumuTagTool.h:65
DerivationFramework::KinkTrkZmumuTagTool::passTrigger
bool passTrigger(const std::vector< std::string > &triggers) const
Definition: KinkTrkZmumuTagTool.cxx:135
DerivationFramework::KinkTrkZmumuTagTool::passMSTrackQuality
bool passMSTrackQuality(const xAOD::TrackParticle *track) const
Definition: KinkTrkZmumuTagTool.cxx:186
DerivationFramework::KinkTrkZmumuTagTool::m_trigMatchDeltaR
float m_trigMatchDeltaR
Definition: KinkTrkZmumuTagTool.h:60
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:195
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
DerivationFramework::KinkTrkZmumuTagTool::checkTagMuon
bool checkTagMuon(const xAOD::Muon *muon) const
Definition: KinkTrkZmumuTagTool.cxx:144
DerivationFramework::KinkTrkZmumuTagTool::m_trigMatchTool
ToolHandle< TrigMatchTool > m_trigMatchTool
Definition: KinkTrkZmumuTagTool.h:58
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
DerivationFramework::KinkTrkZmumuTagTool::initialize
StatusCode initialize()
Definition: KinkTrkZmumuTagTool.cxx:60
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
DerivationFramework::KinkTrkZmumuTagTool::m_trigNames
std::vector< std::string > m_trigNames
Definition: KinkTrkZmumuTagTool.h:59
DerivationFramework::KinkTrkZmumuTagTool::m_diMuonMassLow
float m_diMuonMassLow
Definition: KinkTrkZmumuTagTool.h:73
DerivationFramework::KinkTrkZmumuTagTool::m_muonEtaMax
float m_muonEtaMax
Definition: KinkTrkZmumuTagTool.h:67
DerivationFramework::KinkTrkZmumuTagTool::m_doTrigMatch
bool m_doTrigMatch
Definition: KinkTrkZmumuTagTool.h:61
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
python.TrigTLAMonitorAlgorithm.triggers
triggers
Definition: TrigTLAMonitorAlgorithm.py:196
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
dqt_zlumi_pandas.mass
mass
Definition: dqt_zlumi_pandas.py:170
DerivationFramework::KinkTrkZmumuTagTool::addBranches
virtual StatusCode addBranches() const
Check that the current event passes this filter.
Definition: KinkTrkZmumuTagTool.cxx:100
DerivationFramework::KinkTrkZmumuTagTool::m_diMuonMassHigh
float m_diMuonMassHigh
Definition: KinkTrkZmumuTagTool.h:74
DerivationFramework::KinkTrkZmumuTagTool::m_trackPtCut
float m_trackPtCut
Definition: KinkTrkZmumuTagTool.h:70
DerivationFramework::KinkTrkZmumuTagTool::passMuonQuality
bool passMuonQuality(const xAOD::Muon *muon) const
Definition: KinkTrkZmumuTagTool.cxx:174
DerivationFramework::KinkTrkZmumuTagTool::m_dPhiMax
float m_dPhiMax
Definition: KinkTrkZmumuTagTool.h:75
lumiFormat.i
int i
Definition: lumiFormat.py:92
DerivationFramework::KinkTrkZmumuTagTool::m_doOppositeSignReq
bool m_doOppositeSignReq
Definition: KinkTrkZmumuTagTool.h:76
beamspotman.n
n
Definition: beamspotman.py:731
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
vector
Definition: MultiHisto.h:13
DerivationFramework::KinkTrkZmumuTagTool::checkMSTrack
bool checkMSTrack(const xAOD::TrackParticle *track) const
Definition: KinkTrkZmumuTagTool.cxx:154
KinkTrkZmumuTagTool.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
DerivationFramework::KinkTrkZmumuTagTool::m_trigDecisionTool
ToolHandle< Trig::TrigDecisionTool > m_trigDecisionTool
Definition: KinkTrkZmumuTagTool.h:57
TrigMatch::TrigMuonEF
::TrigMuonEF TrigMuonEF
Definition: TrigMatchDefs.h:32
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
DerivationFramework::KinkTrkZmumuTagTool::~KinkTrkZmumuTagTool
~KinkTrkZmumuTagTool()
Destructor.
Definition: KinkTrkZmumuTagTool.cxx:55
DerivationFramework::KinkTrkZmumuTagTool::m_muonPtCut
float m_muonPtCut
Definition: KinkTrkZmumuTagTool.h:66
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
AthAlgTool
Definition: AthAlgTool.h:26
DerivationFramework::KinkTrkZmumuTagTool::passMuonTrigMatch
bool passMuonTrigMatch(const xAOD::Muon *muon, const std::vector< std::string > &triggers) const
Definition: KinkTrkZmumuTagTool.cxx:195
TrackingPrimitives.h
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
DerivationFramework::KinkTrkZmumuTagTool::KinkTrkZmumuTagTool
KinkTrkZmumuTagTool(const std::string &t, const std::string &n, const IInterface *p)
Constructor with parameters.
Definition: KinkTrkZmumuTagTool.cxx:17
MissingETContainer.h
DerivationFramework::KinkTrkZmumuTagTool::finalize
StatusCode finalize()
Definition: KinkTrkZmumuTagTool.cxx:91
DerivationFramework::KinkTrkZmumuTagTool::m_trackEtaMax
float m_trackEtaMax
Definition: KinkTrkZmumuTagTool.h:71