ATLAS Offline Software
KinkTrkSingleJetMetFilterTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 #include <vector>
9 
11 public:
12  bool operator () (const xAOD::Jet *left, const xAOD::Jet *right) const{
13  return (left->pt() > right->pt());
14  }
15 };
16 
19  const std::string& n,
20  const IInterface* p ) :
21  AthAlgTool(t,n,p),
22  m_ntot(0),
23  m_npass(0),
24  m_passAll(false),
25  m_LeptonVeto(false),
26  m_isolatedTrack(false),
27  m_metHtCut(-1),
28  m_metTerm("Final"),
29  m_muonSelectionTool("CP::MuonSelectionTool/MuonSelectionTool"),
30  m_muonIDKey("Medium"),
31  m_electronIDKey("LHTight"),
32  m_metCut(-1),
33  m_jetPtCuts(std::vector<float>()),
34  m_jetEtaMax(3.2),
35  m_jetNumCut(1),
36  m_jetMetDphiMin(-1),
37  m_jetMetPtMin(0.0),
38  m_leptonPtCut(30.0),
39  m_leptonEtaMax(2.5)
40  {
41  declareInterface<DerivationFramework::ISkimmingTool>(this);
42  declareProperty("passAll", m_passAll);
43  declareProperty("LeptonVeto", m_LeptonVeto);
44  declareProperty("IsolatedTrack", m_isolatedTrack);
45  declareProperty("MetHtCut", m_metHtCut);
46  declareProperty("MetTerm", m_metTerm);
47  declareProperty("MuonIDKey", m_muonIDKey);
48  declareProperty("ElectronIDKey", m_electronIDKey);
49  declareProperty("MetCut", m_metCut);
50  declareProperty("JetPtCuts", m_jetPtCuts);
51  declareProperty("JetEtaMax", m_jetEtaMax);
52  declareProperty("JetNumCut", m_jetNumCut);
53  declareProperty("JetMetDphiMin", m_jetMetDphiMin);
54  declareProperty("JetMetPtMin", m_jetMetPtMin);
55  declareProperty("LeptonPtCut", m_leptonPtCut);
56  declareProperty("LeptonEtaMax", m_leptonEtaMax);
57  }
58 
59 
62 
63 
64 // Athena initialize and finalize
66 {
67  ATH_MSG_VERBOSE("initialize() ...");
68  ATH_CHECK(m_jetSGKey.initialize());
69  ATH_CHECK(m_metSGKey.initialize());
70  ATH_CHECK(m_muonSGKey.initialize());
71  ATH_CHECK(m_electronSGKey.initialize());
72  ATH_CHECK(m_pixelTrackletKey.initialize());
73  ATH_CHECK(m_primaryVerticesKey.initialize());
74  ATH_CHECK(m_standardTrackKey.initialize());
75 
76  return StatusCode::SUCCESS;
77 }
78 
80 {
81  ATH_MSG_VERBOSE("finalize() ...");
82  ATH_MSG_INFO("Processed " << m_ntot << " events, " << m_npass << " events passed filter ");
83  ATH_MSG_INFO("Efficiency = "<< 100.0*(float)m_npass/(float)m_ntot <<" % ");
84  return StatusCode::SUCCESS;
85 }
86 
87 
88 // The filter itself
90 {
91  ++m_ntot;
92  bool acceptEvent(false);
93 
94  // If passAll is selected, accept all events
95  if(m_passAll){
96  ATH_MSG_DEBUG("Event passed because passAll is true.");
97  return acceptEvent;
98  }
99 
100 
101  // Retrieve MET container
102  const xAOD::MissingET* met(0);
103  SG::ReadHandle<xAOD::MissingETContainer> metContainer(m_metSGKey);
104  if( !metContainer.isValid() ) {
105  msg(MSG::WARNING) << "No MET container found, will skip this event" << endmsg;
106  return false;
107  }
108  met = (*metContainer)[m_metTerm];
109  if (!met) {
110  ATH_MSG_ERROR("Cannot retrieve MissingET term " << m_metTerm << " in " << m_metSGKey);
111  return acceptEvent;
112  }
113  //ATH_MSG_DEBUG("MET and phi are " << met->met() << " " << met->phi());
114  if (met->met() < m_metCut) return acceptEvent;
115 
116  // Loop over jets
118  if( !jetContainer.isValid() ) {
119  msg(MSG::WARNING) << "No jet container found, will skip this event" << endmsg;
120  return false;
121  }
122  ATH_MSG_DEBUG("retrieved jet collection size "<< jetContainer->size());
123 
124  std::vector<const xAOD::Jet *> sortedJetContainer;
126  sortedJetContainer.push_back(*jet);
127  }
128 
129  // leading jet pt > 120 GeV
130  // Good Jets pt > 50 GeV
131  // Pt cut size = 2
132  std::sort(sortedJetContainer.begin(), sortedJetContainer.end(), sortJetContainer());
133  float valHt = 0.0;
134  int nJetRequired = 0;
135  std::vector<const xAOD::Jet*> goodJets;
136  int nJet = sortedJetContainer.size();
137  //for (const auto jet: *jetContainer) {
138  for(int i=0;i<nJet;i++){
139  // search for good jets which are used for dphi calculation
140  if (sortedJetContainer.at(i)->pt() > m_jetMetPtMin && std::abs(sortedJetContainer.at(i)->eta()) < m_jetEtaMax) {
141  goodJets.push_back(sortedJetContainer.at(i));
142  valHt += sortedJetContainer.at(i)->pt();
143  }
144 
145  // search for required jets
146  if(nJetRequired < m_jetNumCut){
147  if (sortedJetContainer.at(i)->pt() > m_jetPtCuts[nJetRequired] && std::abs(sortedJetContainer.at(i)->eta()) < m_jetEtaMax){
148  nJetRequired++;
149  }
150  }
151  }// for jet
152 
153  if(nJetRequired < m_jetNumCut) return acceptEvent;
154 
155  if((met->met()/1000.0)/sqrt(valHt/1000.0) < m_metHtCut) return acceptEvent;
156 
157  // dPhi > 1.0 cut
158  float minDphi = 9999;
159  for (unsigned int i=0; i<goodJets.size(); i++) {
160  if (i >= m_jetPtCuts.size()) break;
161  if (std::abs(P4Helpers::deltaPhi(goodJets.at(i)->phi(), met->phi())) < minDphi) {
162  minDphi = std::abs(P4Helpers::deltaPhi(goodJets.at(i)->phi(), met->phi()));
163  }
164  }
165  if (minDphi < m_jetMetDphiMin) return acceptEvent;
166 
167  // Lepton VETO
168  if (m_LeptonVeto) {
169  // Retrieve muon container
170  SG::ReadHandle<xAOD::MuonContainer> muons(m_muonSGKey);
171  if( !muons.isValid() ) {
172  msg(MSG::WARNING) << "No muons container found, will skip this event" << endmsg;
173  return false;
174  }
175  int qflag(0);
176  if (m_muonIDKey == "VeryLoose") {
177  qflag = xAOD::Muon::VeryLoose;
178  } else if (m_muonIDKey == "Loose") {
179  qflag = xAOD::Muon::Loose;
180  } else if (m_muonIDKey == "Medium") {
181  qflag = xAOD::Muon::Medium;
182  } else if (m_muonIDKey == "Tight") {
183  qflag = xAOD::Muon::Tight;
184  } else {
185  ATH_MSG_WARNING("Cannot find the muon quality flag " << m_muonIDKey << ". Use Medium instead.");
186  qflag = xAOD::Muon::Medium;
187  }
188 
189  for (auto muon: *muons) {
190  bool passID(false);
191  if (m_muonSelectionTool->getQuality(*muon) <= qflag) {
192  passID = true;
193  }
194  if (muon->pt() > m_leptonPtCut && std::abs(muon->eta()) < m_leptonEtaMax && passID) {
195  return acceptEvent;
196  }
197  }
198 
199  // Retrieve electron container
201  if( !electrons.isValid() ) {
202  msg(MSG::WARNING) << "No electron container found, will skip this event" << endmsg;
203  return false;
204  }
205  for (auto ele: *electrons) {
206  bool passID(false);
207  if (!ele->passSelection(passID, m_electronIDKey)) {
208  ATH_MSG_WARNING("Cannot find the electron quality flag " << m_muonIDKey);
209  }
210  if (ele->pt() > m_leptonPtCut && std::abs(ele->eta()) < m_leptonEtaMax && passID) {
211  return acceptEvent;
212  }
213  }
214  }
215 
216  // at least 1 isolated pixel tracklet OR standard track
217  if(m_isolatedTrack){
218 
219  // Find IsolatedTracklet
220  SG::ReadHandle<xAOD::TrackParticleContainer> pixelTrackletContainer(m_pixelTrackletKey);
221  if( !pixelTrackletContainer.isValid() ) {
222  msg(MSG::WARNING) << "No pixel tracklet container found, will skip this event" << endmsg;
223  return false;
224  }
225 
226  SG::ReadHandle<xAOD::VertexContainer> vertices(m_primaryVerticesKey);
227  if( !vertices.isValid() ) {
228  msg(MSG::WARNING) << "No primary vertices container found, will skip this event" << endmsg;
229  return false;
230  }
231  const xAOD::Vertex* pv = 0;
232  for( const auto v: *vertices ){
233  if( v->vertexType() == xAOD::VxType::PriVtx ){
234  pv = v;
235  break;
236  }
237  }
238  if( !pv ){
239  ATH_MSG_WARNING("Cannot find a PV in the event; reject it!");
240  return false;
241  }
242 
243  bool passIsolatedTracklet = false;
244  for(const auto Tracklet : *pixelTrackletContainer){
245  passIsolatedTracklet = true;
246  for(unsigned int i=0;i<goodJets.size();i++){
247  double deltaPhi = (std::abs(Tracklet->phi() - goodJets.at(i)->phi()) > M_PI) ? 2.0*M_PI-std::abs(Tracklet->phi()-goodJets.at(i)->phi()) : std::abs(Tracklet->phi()-goodJets.at(i)->phi());
248  double deltaEta = std::abs(Tracklet->eta() - goodJets.at(i)->eta());
249  double deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
250 
251  //if(P4Helpers::deltaR(Tracklet->p4(), goodJets.at(i)->eta(), goodJets.at(i)->phi()) < 0.3){
252  if(deltaR < 0.3){
253  passIsolatedTracklet = false;
254  }
255  }// for goodJets
256 
257  if(passIsolatedTracklet==false)
258  continue;
259 
260  if( Tracklet->pt() < 20000.0 ){
261  passIsolatedTracklet = false;
262  continue;
263  }
264 
265  if(TMath::Abs(Tracklet->eta()) < 0.1 || TMath::Abs(Tracklet->eta()) > 1.9){
266  passIsolatedTracklet = false;
267  continue;
268  }
269 
270  if(TMath::Prob(Tracklet->chiSquared(), Tracklet->numberDoF()) < 0.1){
271  passIsolatedTracklet = false;
272  continue;
273  }
274 
275  static const SG::ConstAccessor<UChar_t> numberOfContribPixelLayersAcc("numberOfContribPixelLayers");
276  if(numberOfContribPixelLayersAcc(*Tracklet)<3){
277  passIsolatedTracklet = false;
278  continue;
279  }
280 
281  static const SG::ConstAccessor<UChar_t> numberOfPixelSpoiltHitsAcc("numberOfPixelSpoiltHits");
282  if(numberOfPixelSpoiltHitsAcc(*Tracklet)>0){
283  passIsolatedTracklet = false;
284  continue;
285  }
286 
287  double z0SinTheta = (Tracklet->z0() + Tracklet->vz() - pv->z() ) * TMath::Sin(Tracklet->p4().Theta());
288  if( std::abs(z0SinTheta) > 5.0 ){
289  passIsolatedTracklet = false;
290  continue;
291  }
292 
293  if(passIsolatedTracklet) break;
294 
295  }// for Tracklet
296 
297  if(passIsolatedTracklet==false){
298  return acceptEvent; // std track OFF
299 
300  bool passIsolatedStdTrack = false;
301  SG::ReadHandle<xAOD::TrackParticleContainer> standardTrackContainer(m_standardTrackKey);
302  if( !standardTrackContainer.isValid() ) {
303  msg(MSG::WARNING) << "No Standard Track container found, will skip this event" << endmsg;
304  return false;
305  }
306 
307 
308  for(const auto StdTrack : *standardTrackContainer){
309  if(StdTrack->pt()/1000.0 < 20.0)
310  continue;
311 
312  passIsolatedStdTrack = true;
313 
314  for(unsigned int i=0;i<goodJets.size();i++){
315  double deltaPhi = (std::abs(StdTrack->phi() - goodJets.at(i)->phi()) > M_PI) ? 2.0*M_PI-std::abs(StdTrack->phi()-goodJets.at(i)->phi()) : std::abs(StdTrack->phi()-goodJets.at(i)->phi());
316  double deltaEta = std::abs(StdTrack->eta() - goodJets.at(i)->eta());
317  double deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
318  //if(P4Helpers::deltaR(StdTrack->p4(), goodJets.at(i)->eta(), goodJets.at(i)->phi()) < 0.3){
319  if(deltaR < 0.3){
320  passIsolatedStdTrack = false;
321  }
322  }// for goodJets
323 
324  if(passIsolatedStdTrack){
325  double ptcone20 = 0.0;
326  for(auto Track : *standardTrackContainer){
327  if(Track->pt()/1000.0 < 0.4)
328  continue;
329 
330  double deltaPhi = (std::abs(StdTrack->phi() - Track->phi()) > M_PI) ? 2.0*M_PI-std::abs(StdTrack->phi()-Track->phi()) : std::abs(StdTrack->phi()-Track->phi());
331  double deltaEta = std::abs(StdTrack->eta() - Track->eta());
332  double deltaR = sqrt(deltaPhi*deltaPhi + deltaEta*deltaEta);
333  //if(P4Helpers::deltaR(StdTrack->p4(), Track->p4()) < 0.2)
334  if(deltaR < 0.2)
335  ptcone20 += Track->pt();
336  }// for Track
337 
338  ptcone20 = (ptcone20 - StdTrack->pt())/StdTrack->pt();
339  if(ptcone20 < 0.04){
340  break;
341  }else{
342  passIsolatedStdTrack = false;
343  }
344  }
345  }// for StdTrack
346 
347  if(passIsolatedStdTrack==false)
348  return acceptEvent;
349  }// if there is no isolated pixel tracklet, find isolated standard track
350 
351  }// m_isolatedTracklet
352 
353  acceptEvent = true;
354  ++m_npass;
355  return acceptEvent;
356 
357 }
LikeEnum::Loose
@ Loose
Definition: LikelihoodEnums.h:12
DerivationFramework::KinkTrkSingleJetMetFilterTool::eventPassesFilter
virtual bool eventPassesFilter() const
Check that the current event passes this filter.
Definition: KinkTrkSingleJetMetFilterTool.cxx:89
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:195
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_isolatedTrack
bool m_isolatedTrack
Definition: KinkTrkSingleJetMetFilterTool.h:48
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
LikeEnum::VeryLoose
@ VeryLoose
Definition: LikelihoodEnums.h:11
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
KinkTrkSingleJetMetFilterTool.h
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_jetPtCuts
std::vector< float > m_jetPtCuts
Definition: KinkTrkSingleJetMetFilterTool.h:62
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
xAOD::deltaPhi
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap setEtaBin setIsTgcFailure setDeltaPt deltaPhi
Definition: L2StandAloneMuon_v1.cxx:160
DerivationFramework::KinkTrkSingleJetMetFilterTool::initialize
StatusCode initialize()
Definition: KinkTrkSingleJetMetFilterTool.cxx:65
M_PI
#define M_PI
Definition: ActiveFraction.h:11
xAOD::Iso::ptcone20
@ ptcone20
Track isolation.
Definition: IsolationType.h:40
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_jetMetDphiMin
float m_jetMetDphiMin
Definition: KinkTrkSingleJetMetFilterTool.h:65
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_LeptonVeto
bool m_LeptonVeto
Definition: KinkTrkSingleJetMetFilterTool.h:47
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_jetMetPtMin
float m_jetMetPtMin
Definition: KinkTrkSingleJetMetFilterTool.h:66
IDTPM::z0SinTheta
float z0SinTheta(const U &p)
Definition: TrackParametersHelper.h:65
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_leptonEtaMax
float m_leptonEtaMax
Definition: KinkTrkSingleJetMetFilterTool.h:68
P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition: P4Helpers.h:29
met
Definition: IMETSignificance.h:24
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
DerivationFramework::KinkTrkSingleJetMetFilterTool::KinkTrkSingleJetMetFilterTool
KinkTrkSingleJetMetFilterTool(const std::string &t, const std::string &n, const IInterface *p)
Constructor with parameters.
Definition: KinkTrkSingleJetMetFilterTool.cxx:18
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:53
lumiFormat.i
int i
Definition: lumiFormat.py:92
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
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
xAOD::MissingET_v1
Principal data object for Missing ET.
Definition: MissingET_v1.h:25
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_metCut
float m_metCut
Definition: KinkTrkSingleJetMetFilterTool.h:61
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_electronIDKey
std::string m_electronIDKey
Definition: KinkTrkSingleJetMetFilterTool.h:53
DerivationFramework::KinkTrkSingleJetMetFilterTool::~KinkTrkSingleJetMetFilterTool
~KinkTrkSingleJetMetFilterTool()
Destructor.
Definition: KinkTrkSingleJetMetFilterTool.cxx:61
DerivationFramework::KinkTrkSingleJetMetFilterTool::finalize
StatusCode finalize()
Definition: KinkTrkSingleJetMetFilterTool.cxx:79
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
JetAnalysisAlgorithmsTest_EMTopo_eljob.jetContainer
string jetContainer
Definition: JetAnalysisAlgorithmsTest_EMTopo_eljob.py:36
P4Helpers.h
LikeEnum::Tight
@ Tight
Definition: LikelihoodEnums.h:15
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_jetNumCut
int m_jetNumCut
Definition: KinkTrkSingleJetMetFilterTool.h:64
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_leptonPtCut
float m_leptonPtCut
Definition: KinkTrkSingleJetMetFilterTool.h:67
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_metTerm
std::string m_metTerm
Definition: KinkTrkSingleJetMetFilterTool.h:50
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_muonIDKey
std::string m_muonIDKey
Definition: KinkTrkSingleJetMetFilterTool.h:52
python.PyAthena.v
v
Definition: PyAthena.py:157
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_passAll
bool m_passAll
Definition: KinkTrkSingleJetMetFilterTool.h:46
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
LikeEnum::Medium
@ Medium
Definition: LikelihoodEnums.h:14
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_jetEtaMax
float m_jetEtaMax
Definition: KinkTrkSingleJetMetFilterTool.h:63
python.changerun.pv
pv
Definition: changerun.py:81
Track
Definition: TriggerChamberClusterOnTrackCreator.h:21
sortJetContainer::operator()
bool operator()(const xAOD::Jet *left, const xAOD::Jet *right) const
Definition: KinkTrkSingleJetMetFilterTool.cxx:12
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
AthAlgTool
Definition: AthAlgTool.h:26
sortJetContainer
Definition: KinkTrkSingleJetMetFilterTool.cxx:10
DerivationFramework::KinkTrkSingleJetMetFilterTool::m_metHtCut
float m_metHtCut
Definition: KinkTrkSingleJetMetFilterTool.h:49
xAOD::Jet_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle.
Definition: Jet_v1.cxx:44
makeComparison.deltaR
float deltaR
Definition: makeComparison.py:36
Tracklet
Definition: Tracklet.h:15
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
readCCLHist.float
float
Definition: readCCLHist.py:83
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17