ATLAS Offline Software
DiLepFilters.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 // DiLepFilters.cxx, (c) ATLAS Detector software
8 // Author: Dominik Krauss (krauss@mpp.mpg.de)
9 
10 // STL
11 #include <cmath>
12 
13 // Athena
16 
17 DerivationFramework::DiLepFilters::DiLepFilters(const std::string& t, const std::string& n, const IInterface* p)
18  : AthAlgTool(t, n, p), m_tdt("Trig::TrigDecisionTool/TrigDecisionTool"),
19  m_el_eta(0.), m_ph_eta(0.), m_mu_eta(0.), m_mu_beta(0.),
20  m_el_d0(0.), m_mu_d0(0.),
21  m_siel_pt(0.), m_siph_pt(0.), m_siph_xpt(0.), m_simu_pt(0.),
22  m_diel_pt(0.), m_diph_pt(0.), m_dielph_pt(0.), m_diloelph_pt(0.)
23 {
24  declareInterface<IDiLepFilters>(this);
25 
26  declareProperty("TrigDecisionTool", m_tdt);
27 
28  declareProperty("SiPhTriggers", m_trig_siph);
29  declareProperty("DiPhTriggers", m_trig_diph);
30  declareProperty("SiMuTriggers", m_trig_simu);
31  declareProperty("SiMuBaTriggers", m_trig_simuba);
32 
33  declareProperty("ElEtaMax", m_el_eta);
34  declareProperty("PhEtaMax", m_ph_eta);
35  declareProperty("MuEtaMax", m_mu_eta);
36  declareProperty("MuBaEtaMax", m_mu_beta);
37 
38  declareProperty("ElD0Min", m_el_d0);
39  declareProperty("MuD0Min", m_mu_d0);
40 
41  declareProperty("SiElPtMin", m_siel_pt);
42  declareProperty("SiPhPtMin", m_siph_pt);
43  declareProperty("SiPhXPtMin", m_siph_xpt);
44  declareProperty("SiMuPtMin", m_simu_pt);
45  declareProperty("SiMuBaPtMin", m_simuba_pt);
46  declareProperty("DiElPtMin", m_diel_pt);
47  declareProperty("DiPhPtMin", m_diph_pt);
48  declareProperty("DiElPhPtMin", m_dielph_pt);
49  declareProperty("DiLoElPhPtMin", m_diloelph_pt);
50 }
51 
53 {
54  ATH_MSG_VERBOSE("initialize() ...");
55 
56  CHECK(m_tdt.retrieve());
57 
58  return StatusCode::SUCCESS;
59 }
60 
62 {
63  passFlags = 0;
64 
65  for(const std::string& tn: m_trig_siph)
66  {
67  if(m_tdt->isPassed(tn))
68  {
69  passFlags |= PASS_SIPH;
70  break;
71  }
72  }
73  for(const std::string& tn: m_trig_diph)
74  {
75  if(m_tdt->isPassed(tn))
76  {
77  passFlags |= PASS_DIPH;
78  break;
79  }
80  }
81  for(const std::string& tn: m_trig_simu)
82  {
83  if(m_tdt->isPassed(tn))
84  {
85  passFlags |= PASS_SIMU;
86  break;
87  }
88  }
89  for(const std::string& tn: m_trig_simuba)
90  {
91  if(m_tdt->isPassed(tn))
92  {
93  passFlags |= PASS_SIMUBA;
94  break;
95  }
96  }
97 
98  return passFlags != 0;
99 }
100 
102  const xAOD::Electron& el) const
103 {
104  if (! (passFlags&PASS_SIPH) ) return false;
105 
106  return PassCuts(el, m_siel_pt);
107 }
108 
110  const xAOD::Photon& ph,
111  const xAOD::Electron& el) const
112 {
113  if (! (passFlags&PASS_SIPH) ) return false;
114 
115  if(SameCluster(ph, el)) return false;
116 
117  if(!PassCuts(ph, m_siph_pt)) return false;
118  if(!PassCuts(el, m_siph_xpt)) return false;
119 
120  return true;
121 }
122 
124  const xAOD::Photon& ph1,
125  const xAOD::Photon& ph2) const
126 {
127  if (! (passFlags&PASS_SIPH) ) return false;
128 
129  if(SameCluster(ph1, ph2)) return false;
130 
131  if(PassCuts(ph1, m_siph_pt) && PassCuts(ph2, m_siph_xpt)) return true;
132  if(PassCuts(ph2, m_siph_pt) && PassCuts(ph1, m_siph_xpt)) return true;
133 
134  return false;
135 }
136 
138  const xAOD::Photon& ph,
139  const xAOD::Muon& mu) const
140 {
141  if (! (passFlags&PASS_SIPH) ) return false;
142 
143  if(!PassCuts(ph, m_siph_pt)) return false;
144  if(!PassCuts(mu, m_siph_xpt, m_mu_eta)) return false;
145 
146  return true;
147 }
148 
150  const xAOD::Muon& mu) const
151 {
152  if (! (passFlags&PASS_SIMU) ) return false;
153 
154  return PassCuts(mu, m_simu_pt, m_mu_eta);
155 }
156 
158  const xAOD::Muon& mu) const
159 {
160  if (! (passFlags&PASS_SIMUBA) ) return false;
161 
162  return PassCuts(mu, m_simuba_pt, m_mu_beta);
163 }
164 
166  const xAOD::Electron& el1,
167  const xAOD::Electron& el2) const
168 {
169  if (! (passFlags&PASS_DIPH) ) return false;
170 
171  if(SameCluster(el1, el2)) return false;
172 
173  if(!PassCuts(el1, m_diel_pt)) return false;
174  if(!PassCuts(el2, m_diel_pt)) return false;
175 
176  return true;
177 }
178 
180  const xAOD::Photon& ph1,
181  const xAOD::Photon& ph2) const
182 {
183  if (! (passFlags&PASS_DIPH) ) return false;
184 
185  if(SameCluster(ph1, ph2)) return false;
186 
187  if(!PassCuts(ph1, m_diph_pt)) return false;
188  if(!PassCuts(ph2, m_diph_pt)) return false;
189 
190  return true;
191 }
192 
194  const xAOD::Electron& el,
195  const xAOD::Photon& ph) const
196 {
197  if (! (passFlags&PASS_DIPH) ) return false;
198 
199  if(SameCluster(el, ph)) return false;
200 
201  if(!PassCuts(el, m_dielph_pt)) return false;
202  if(!PassCuts(ph, m_dielph_pt)) return false;
203 
204  return true;
205 }
206 
208  const xAOD::Electron& el,
209  const xAOD::Photon& ph) const
210 {
211  if (! (passFlags&PASS_DIPH) ) return false;
212 
213  if(SameCluster(el, ph)) return false;
214 
215  if(!PassCuts(el, m_diloelph_pt, true)) return false;
216  if(!PassCuts(ph, m_diloelph_pt)) return false;
217 
218  return true;
219 }
220 
222 {
223  return std::fabs(part.eta()) < eta_cut;
224 }
225 
227 {
229  if(el_tr == nullptr)
230  {
231  ATH_MSG_WARNING("Could not retrieve electron ID track!");
232  return false;
233  }
234 
235  return std::fabs(el_tr->d0()) > d0_cut;
236 }
237 
238 bool DerivationFramework::DiLepFilters::Passd0(const xAOD::Muon& mu, double d0_cut) const
239 {
240  const xAOD::TrackParticle* mu_tr = mu.trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
241  if(mu_tr == nullptr)
242  {
243  ATH_MSG_WARNING("Could not retrieve muon ID track!");
244  return false;
245  }
246 
247  return std::fabs(mu_tr->d0()) > d0_cut;
248 }
249 
251 {
252  bool isLoose = false;
253  eg.passSelection(isLoose, "Loose");
254  return isLoose;
255 }
256 
258 {
259  const xAOD::CaloCluster* calo1 = eg1.caloCluster();
260  const xAOD::CaloCluster* calo2 = eg2.caloCluster();
261  if(calo1 == nullptr || calo2 == nullptr)
262  {
263  ATH_MSG_WARNING("Could not retrieve CaloCluster!");
264  return false;
265  }
266 
267  return calo1->p4().DeltaR(calo2->p4()) < 0.01;
268 }
269 
271 {
272  if(mu.muonType() != xAOD::Muon::Combined) return false;
273 
274  float chi2 = 0.;
275  if(!mu.parameter(chi2, xAOD::Muon::msInnerMatchChi2)) return false;
276 
277  int dof = 1;
278  if(!mu.parameter(dof, xAOD::Muon::msInnerMatchDOF)) return false;
279  if(dof == 0) dof = 1;
280 
281  return (chi2 / static_cast<float>(dof)) < 5.;
282 }
283 
284 bool DerivationFramework::DiLepFilters::PassCuts(const xAOD::Electron& el, double pt_cut, bool loose) const
285 {
286  if(el.pt() < pt_cut * m_GeVtoMeV) return false;
287  if(!PassEta(el, m_el_eta)) return false;
288 
289  if(loose)
290  {
291  if(!IsLoose(el)) return false;
292  }
293  else
294  {
295  if(!Passd0(el, m_el_d0)) return false;
296  }
297 
298  return true;
299 }
300 
301 bool DerivationFramework::DiLepFilters::PassCuts(const xAOD::Photon& ph, double pt_cut) const
302 {
303  if(ph.pt() < pt_cut * m_GeVtoMeV) return false;
304  if(!PassEta(ph, m_ph_eta)) return false;
305  if(!IsLoose(ph)) return false;
306 
307  return true;
308 }
309 
310 bool DerivationFramework::DiLepFilters::PassCuts(const xAOD::Muon& mu, double pt_cut, double eta_cut) const
311 {
312  const xAOD::IParticle* mu_ip = nullptr;
313 
314  if(IsGood(mu))
315  {
316  if(!Passd0(mu, m_mu_d0)) return false;
317 
318  mu_ip = &mu;
319  }
320  else
321  {
322  const xAOD::TrackParticle* mu_mstr = mu.trackParticle(xAOD::Muon::MuonSpectrometerTrackParticle);
323  if(mu_mstr == nullptr) return false;
324 
325  mu_ip = mu_mstr;
326  }
327 
328  if(mu_ip->pt() < pt_cut * m_GeVtoMeV) return false;
329  if(!PassEta(*mu_ip, eta_cut)) return false;
330 
331  return true;
332 }
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
DerivationFramework::DiLepFilters::PassDiPh
bool PassDiPh(const uint32_t passFlags, const xAOD::Photon &ph1, const xAOD::Photon &ph2) const override
Definition: DiLepFilters.cxx:179
DerivationFramework::DiLepFilters::Passd0
bool Passd0(const xAOD::Electron &el, double d0_cut) const
Definition: DiLepFilters.cxx:226
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
DerivationFramework::DiLepFilters::initialize
virtual StatusCode initialize() override
Definition: DiLepFilters.cxx:52
DerivationFramework::DiLepFilters::PassDiElPh
bool PassDiElPh(const uint32_t passFlags, const xAOD::Electron &el, const xAOD::Photon &ph) const override
Definition: DiLepFilters.cxx:193
DerivationFramework::DiLepFilters::m_ph_eta
double m_ph_eta
Definition: DiLepFilters.h:90
ParticleTest.eg
eg
Definition: ParticleTest.py:29
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
DerivationFramework::DiLepFilters::m_trig_simu
std::vector< std::string > m_trig_simu
Definition: DiLepFilters.h:85
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
DerivationFramework::DiLepFilters::GetTriggers
bool GetTriggers(uint32_t &passFlags) const override
Definition: DiLepFilters.cxx:61
DerivationFramework::DiLepFilters::IsLoose
bool IsLoose(const xAOD::Egamma &eg) const
Definition: DiLepFilters.cxx:250
DerivationFramework::DiLepFilters::m_simuba_pt
double m_simuba_pt
Definition: DiLepFilters.h:101
DerivationFramework::DiLepFilters::SameCluster
bool SameCluster(const xAOD::Egamma &eg1, const xAOD::Egamma &eg2) const
Definition: DiLepFilters.cxx:257
DerivationFramework::DiLepFilters::m_dielph_pt
double m_dielph_pt
Definition: DiLepFilters.h:104
ElectronxAODHelpers.h
xAOD::Egamma_v1
Definition: Egamma_v1.h:56
DerivationFramework::DiLepFilters::m_siph_xpt
double m_siph_xpt
Definition: DiLepFilters.h:99
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
DerivationFramework::DiLepFilters::m_tdt
ToolHandle< Trig::TrigDecisionTool > m_tdt
Definition: DiLepFilters.h:80
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
xAOD::TrackParticle_v1::d0
float d0() const
Returns the parameter.
DerivationFramework::DiLepFilters::m_mu_eta
double m_mu_eta
Definition: DiLepFilters.h:91
DerivationFramework::DiLepFilters::PassSiEl
bool PassSiEl(const uint32_t passFlags, const xAOD::Electron &el) const override
Definition: DiLepFilters.cxx:101
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
DerivationFramework::DiLepFilters::PassSiMuBa
bool PassSiMuBa(const uint32_t passFlags, const xAOD::Muon &mu) const override
Definition: DiLepFilters.cxx:157
DerivationFramework::DiLepFilters::m_el_d0
double m_el_d0
Definition: DiLepFilters.h:94
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
DerivationFramework::DiLepFilters::PassSiPhX
bool PassSiPhX(const uint32_t passFlags, const xAOD::Photon &ph, const xAOD::Electron &el) const override
Definition: DiLepFilters.cxx:109
xAOD::Egamma_v1::caloCluster
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
Definition: Egamma_v1.cxx:388
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:522
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
DerivationFramework::DiLepFilters::PassDiLoElPh
bool PassDiLoElPh(const uint32_t passFlags, const xAOD::Electron &el, const xAOD::Photon &ph) const override
Definition: DiLepFilters.cxx:207
DerivationFramework::DiLepFilters::m_trig_simuba
std::vector< std::string > m_trig_simuba
Definition: DiLepFilters.h:86
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
DerivationFramework::DiLepFilters::m_trig_siph
std::vector< std::string > m_trig_siph
Definition: DiLepFilters.h:83
DerivationFramework::DiLepFilters::m_siph_pt
double m_siph_pt
Definition: DiLepFilters.h:98
xAOD::CaloCluster_v1::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: CaloCluster_v1.cxx:465
xAOD::IParticle::pt
virtual double pt() const =0
The transverse momentum ( ) of the particle.
DerivationFramework::DiLepFilters::m_simu_pt
double m_simu_pt
Definition: DiLepFilters.h:100
DerivationFramework::DiLepFilters::m_mu_beta
double m_mu_beta
Definition: DiLepFilters.h:92
DerivationFramework::DiLepFilters::m_siel_pt
double m_siel_pt
Definition: DiLepFilters.h:97
DerivationFramework::DiLepFilters::m_trig_diph
std::vector< std::string > m_trig_diph
Definition: DiLepFilters.h:84
DerivationFramework::DiLepFilters::PassCuts
bool PassCuts(const xAOD::Electron &el, double pt_cut, bool loose=false) const
Definition: DiLepFilters.cxx:284
DerivationFramework::DiLepFilters::PassSiMu
bool PassSiMu(const uint32_t passFlags, const xAOD::Muon &mu) const override
Definition: DiLepFilters.cxx:149
xAOD::Electron_v1
Definition: Electron_v1.h:34
DerivationFramework::DiLepFilters::PassDiEl
bool PassDiEl(const uint32_t passFlags, const xAOD::Electron &el1, const xAOD::Electron &el2) const override
Definition: DiLepFilters.cxx:165
DerivationFramework::DiLepFilters::IsGood
bool IsGood(const xAOD::Muon &mu) const
Definition: DiLepFilters.cxx:270
DerivationFramework::DiLepFilters::m_mu_d0
double m_mu_d0
Definition: DiLepFilters.h:95
DerivationFramework::DiLepFilters::PassEta
bool PassEta(const xAOD::IParticle &part, double eta_cut) const
Definition: DiLepFilters.cxx:221
xAOD::Photon_v1
Definition: Photon_v1.h:37
DerivationFramework::DiLepFilters::DiLepFilters
DiLepFilters(const std::string &t, const std::string &n, const IInterface *p)
Definition: DiLepFilters.cxx:17
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::Egamma_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: Egamma_v1.cxx:65
xAOD::EgammaHelpers::getOriginalTrackParticle
const xAOD::TrackParticle * getOriginalTrackParticle(const xAOD::Electron *el)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the electron.
Definition: ElectronxAODHelpers.cxx:11
DerivationFramework::DiLepFilters::m_diel_pt
double m_diel_pt
Definition: DiLepFilters.h:102
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
AthAlgTool
Definition: AthAlgTool.h:26
DerivationFramework::DiLepFilters::m_diph_pt
double m_diph_pt
Definition: DiLepFilters.h:103
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
DerivationFramework::DiLepFilters::m_diloelph_pt
double m_diloelph_pt
Definition: DiLepFilters.h:105
DerivationFramework::DiLepFilters::m_el_eta
double m_el_eta
Definition: DiLepFilters.h:89
DiLepFilters.h