ATLAS Offline Software
SkimmingToolHIGG5VBF.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // SkimmingToolHIGG5VBF.cxx, (c) ATLAS Detector software
8 // Author: Yasu Okumura (yasuyuki.okumura@cern.ch)
9 // Based on DerivationFramework::SkimmingToolExample and DerivationFramework::SkimmingToolHIGG2
10 
13 #include <vector>
14 #include <string>
15 
16 #include "CLHEP/Units/SystemOfUnits.h"
17 
18 // Constructor
20  const std::string& n,
21  const IInterface* p) :
22  AthAlgTool(t, n, p),
23  m_trigDecisionTool("Trig::TrigDecisionTool/TrigDecisionTool"),
24  m_ntot(0),
25  m_npass(0)
26 {
27  declareInterface<DerivationFramework::ISkimmingTool>(this);
28 
29  // for jet multiplicity requirement
30  declareProperty("JetContainerKey", m_jetSGKey="AntiKt4EMTopoJets");
31  declareProperty("CalibedJetMomentKey", m_calibedJetMomKey="DFCommonJets_Calib");
32 
33  // for jet multiplicity
34  declareProperty("ReqNAllJets", m_reqNAllJets=false);
35  declareProperty("NumberOfAllJets", m_nAllJets=4);
36  declareProperty("AllJetPtCut", m_allJetPtCut=40.*CLHEP::GeV);
37  declareProperty("AllJetEtaCut", m_allJetEtaCut=4.9);
38 
39  declareProperty("ReqNCentralJets", m_reqNCentralJets=false);
40  declareProperty("NumberOfCentralJets", m_nCentralJets=2);
41  declareProperty("CentralJetPtCut", m_centralJetPtCut=40.*CLHEP::GeV);
42  declareProperty("CentralJetEtaCut", m_centralJetEtaCut=2.6);
43 
44  // for trigger requirement
45  declareProperty("ReqTrigger", m_reqTrigger=false);
46  declareProperty("Triggers", m_triggers=std::vector<std::string>());
47 
48  // for Mjj requirement ()
49  declareProperty("ReqVBFMjj", m_reqVbfMjj=false); // logical "ORed" with ReqPhoton
51 
52  declareProperty("DoDebug", m_debug=false);
53 
54  // photon requirement (p. rose)
55  declareProperty("PhotonContainerKey", m_phSGKey="Photons");
56  declareProperty("ReqPhoton", m_reqPh=false); // logical "ORed" with ReqVBFMjj
57  declareProperty("PhotonPtCut", m_phPtCut=0.*CLHEP::GeV);
58  declareProperty("CentralPhotonEtaCut", m_centralPhEtaCut=2.6);
59 
60 }
61 
62 // Destructor
64 }
65 
66 // Athena initialize and finalize
68 {
69  ATH_MSG_VERBOSE("initialize() ...");
70 
71  // trigger decision tool
72  if(m_trigDecisionTool.retrieve(DisableTool{!m_reqTrigger}).isFailure()) {
73  ATH_MSG_FATAL("Failed to retrieve tool: " << m_trigDecisionTool);
74  return StatusCode::FAILURE;
75  }
76  ATH_MSG_INFO("Retrieved tool: " << m_trigDecisionTool);
77 
78  return StatusCode::SUCCESS;
79 }
80 
82 {
83  ATH_MSG_VERBOSE("finalize() ...");
84  ATH_MSG_INFO("Processed " << m_ntot << " events, " << m_npass << " events passed filter ");
85  return StatusCode::SUCCESS;
86 }
87 
88 // The filter itself
90 {
91  m_ntot++;
92  bool acceptEvent(true);
93 
94  StatusCode sc(StatusCode::SUCCESS);
95 
96  bool isTriggerFired(m_triggers.empty());
97  for(unsigned int i(0); i<m_triggers.size(); i++) {
98  if(m_trigDecisionTool->isPassed(m_triggers.at(i))) {
99  isTriggerFired = true;
100  break;
101  }
102  }
103 
104  // (1) Count Jet Multiplicity
105  std::vector<TLorentzVector> goodAllJets;
106  std::vector<TLorentzVector> goodCentralJets;
107 
108  const xAOD::JetContainer *jets(nullptr);
109  ATH_CHECK(evtStore()->retrieve(jets, m_jetSGKey), false);
110  xAOD::JetContainer::const_iterator jet_itr(jets->begin());
112  for(; jet_itr != jet_end; ++jet_itr) {
113  TLorentzVector jetP4 = getCalibedJets( (*jet_itr) );
114  if(this->checkAllJetQuality(jetP4)) { goodAllJets.push_back(jetP4); }
115  if(this->checkCentralJetQuality(jetP4)) { goodCentralJets.push_back(jetP4); }
116  }
117 
118  // (2) evaluate maximum Mjj in the event
119  double maxM = 0.;
120  for(unsigned int jet_i = 0; jet_i<goodAllJets.size(); jet_i++) {
121  const TLorentzVector& iP4 = goodAllJets.at(jet_i);
122 
123  for(unsigned int jet_k=jet_i+1; jet_k<goodAllJets.size(); jet_k++) {
124  const TLorentzVector& kP4 = goodAllJets.at(jet_k);
125 
126  const TLorentzVector jjP4 = iP4 + kP4;
127  const double jjM = jjP4.M();
128 
129  if (maxM<jjM) {maxM=jjM;}
130  }
131  }
132 
133  //get max pt of any photon in the event (p. rose)
134  double maxPhPt=0.;
135  if(m_reqPh){
136  const xAOD::PhotonContainer *phots(nullptr);
137  ATH_CHECK(evtStore()->retrieve(phots, m_phSGKey), false);
138  for (const auto* ph : *phots){
139  if(abs(ph->eta())<m_centralPhEtaCut)
140  if(ph->pt()>maxPhPt) maxPhPt = ph->pt();
141  }//for
142  }//if
143 
144 
145 
146  const bool passNAllJet = (goodAllJets.size()>=m_nAllJets);
147  const bool passNCentralJet = (goodCentralJets.size()>=m_nCentralJets);
148  const bool passMjjCut = (maxM>m_vbfMjjCut);
149  const bool passPhPtCut = (maxPhPt>m_phPtCut);
150 
151  if (m_reqNAllJets) { if (not passNAllJet) {acceptEvent=false;} }
152  if (m_reqNCentralJets) { if (not passNCentralJet) {acceptEvent=false;} }
153  //if (m_reqVbfMjj) { if (not passMjjCut) {acceptEvent=false;} }
154  if (m_reqTrigger) { if (not isTriggerFired) {acceptEvent=false;} }
155  //vbf+gamma addition -- logical OR of mjj and phpt cut
156  if(m_reqVbfMjj and not m_reqPh) { if (not passMjjCut) {acceptEvent=false;} }
157  if(m_reqPh and not m_reqVbfMjj) { if (not passPhPtCut) {acceptEvent=false;} }
158  if(m_reqPh and m_reqVbfMjj) { if (not (passMjjCut or passPhPtCut) ) {acceptEvent=false;} }
159 
160  if (acceptEvent) {m_npass++;}
161 
162  if (m_debug) {
163  printf("dbg> L%3d : event accepted [%s] "
164  "(NJets=%2d [%6s], NCentralJets=%2d [%6s] Mjj=%10.1f [%6s], Trigger [%6s]) \n",
165  __LINE__,
166  acceptEvent? "Y" : "N",
167  (int)goodAllJets.size(), passNAllJet ? "PASSED" : "FAILED",
168  (int)goodCentralJets.size(), passNCentralJet ? "PASSED" : "FAILED",
169  maxM, passMjjCut ? "PASSED" : "FAILED",
170  isTriggerFired ? "PASSED" : "FAILED"
171  );
172  }
173 
174  return acceptEvent;
175 }
176 
178 {
179  if(jet.Pt()<m_allJetPtCut) return false;
180  if(fabs(jet.Eta())>m_allJetEtaCut) return false;
181 
182  return true;
183 }
184 
186 {
187  if(jet.Pt()<m_centralJetPtCut) return false;
188  if(fabs(jet.Eta())>m_centralJetEtaCut) return false;
189 
190  return true;
191 }
192 
193 TLorentzVector
195 {
196  TLorentzVector rc;
197 
198  if(!jet) return rc;
199 
200  SG::ConstAccessor<float> ptAcc(m_calibedJetMomKey+"_pt");
201  SG::ConstAccessor<float> etaAcc(m_calibedJetMomKey+"_eta");
202  SG::ConstAccessor<float> phiAcc(m_calibedJetMomKey+"_phi");
203  SG::ConstAccessor<float> mAcc(m_calibedJetMomKey+"_m");
204  const float& pt =ptAcc(*jet);
205  const float& eta=etaAcc(*jet);
206  const float& phi=phiAcc(*jet);
207  const float& m =mAcc(*jet);
208 
209  rc.SetPtEtaPhiM(pt, eta, phi, m);
210 
211  return rc;
212 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
DerivationFramework::SkimmingToolHIGG5VBF::SkimmingToolHIGG5VBF
SkimmingToolHIGG5VBF(const std::string &t, const std::string &n, const IInterface *p)
Constructor with parameters.
Definition: SkimmingToolHIGG5VBF.cxx:19
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:17
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
DerivationFramework::SkimmingToolHIGG5VBF::m_reqNCentralJets
bool m_reqNCentralJets
Definition: SkimmingToolHIGG5VBF.h:67
DerivationFramework::SkimmingToolHIGG5VBF::m_triggers
std::vector< std::string > m_triggers
Definition: SkimmingToolHIGG5VBF.h:74
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
DerivationFramework::SkimmingToolHIGG5VBF::initialize
virtual StatusCode initialize() override
Definition: SkimmingToolHIGG5VBF.cxx:67
DerivationFramework::SkimmingToolHIGG5VBF::checkCentralJetQuality
bool checkCentralJetQuality(const TLorentzVector &jet) const
Definition: SkimmingToolHIGG5VBF.cxx:185
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SkimmingToolHIGG5VBF.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
test_pyathena.pt
pt
Definition: test_pyathena.py:11
DerivationFramework::SkimmingToolHIGG5VBF::m_reqPh
bool m_reqPh
Definition: SkimmingToolHIGG5VBF.h:86
SG::ConstAccessor< float >
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
DerivationFramework::SkimmingToolHIGG5VBF::~SkimmingToolHIGG5VBF
~SkimmingToolHIGG5VBF()
Destructor.
Definition: SkimmingToolHIGG5VBF.cxx:63
DerivationFramework::SkimmingToolHIGG5VBF::m_calibedJetMomKey
std::string m_calibedJetMomKey
Definition: SkimmingToolHIGG5VBF.h:59
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
DerivationFramework::SkimmingToolHIGG5VBF::m_debug
bool m_debug
Definition: SkimmingToolHIGG5VBF.h:51
DerivationFramework::SkimmingToolHIGG5VBF::m_centralJetPtCut
double m_centralJetPtCut
Definition: SkimmingToolHIGG5VBF.h:69
DerivationFramework::SkimmingToolHIGG5VBF::m_nCentralJets
unsigned int m_nCentralJets
Definition: SkimmingToolHIGG5VBF.h:68
DerivationFramework::SkimmingToolHIGG5VBF::getCalibedJets
TLorentzVector getCalibedJets(const xAOD::Jet *jet) const
Definition: SkimmingToolHIGG5VBF.cxx:194
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
DerivationFramework::SkimmingToolHIGG5VBF::m_allJetEtaCut
double m_allJetEtaCut
Definition: SkimmingToolHIGG5VBF.h:65
lumiFormat.i
int i
Definition: lumiFormat.py:85
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::SkimmingToolHIGG5VBF::m_centralPhEtaCut
double m_centralPhEtaCut
Definition: SkimmingToolHIGG5VBF.h:88
DerivationFramework::SkimmingToolHIGG5VBF::m_reqVbfMjj
bool m_reqVbfMjj
Definition: SkimmingToolHIGG5VBF.h:77
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DerivationFramework::SkimmingToolHIGG5VBF::m_centralJetEtaCut
double m_centralJetEtaCut
Definition: SkimmingToolHIGG5VBF.h:70
DerivationFramework::SkimmingToolHIGG5VBF::m_phPtCut
double m_phPtCut
Definition: SkimmingToolHIGG5VBF.h:87
DerivationFramework::SkimmingToolHIGG5VBF::m_phSGKey
std::string m_phSGKey
Definition: SkimmingToolHIGG5VBF.h:85
DerivationFramework::SkimmingToolHIGG5VBF::m_allJetPtCut
double m_allJetPtCut
Definition: SkimmingToolHIGG5VBF.h:64
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
DerivationFramework::SkimmingToolHIGG5VBF::m_vbfMjjCut
double m_vbfMjjCut
Definition: SkimmingToolHIGG5VBF.h:78
DerivationFramework::SkimmingToolHIGG5VBF::m_nAllJets
unsigned int m_nAllJets
Definition: SkimmingToolHIGG5VBF.h:63
DerivationFramework::SkimmingToolHIGG5VBF::m_jetSGKey
std::string m_jetSGKey
Definition: SkimmingToolHIGG5VBF.h:58
DerivationFramework::SkimmingToolHIGG5VBF::checkAllJetQuality
bool checkAllJetQuality(const TLorentzVector &jet) const
Definition: SkimmingToolHIGG5VBF.cxx:177
DerivationFramework::SkimmingToolHIGG5VBF::m_reqNAllJets
bool m_reqNAllJets
Definition: SkimmingToolHIGG5VBF.h:62
DerivationFramework::SkimmingToolHIGG5VBF::finalize
virtual StatusCode finalize() override
Definition: SkimmingToolHIGG5VBF.cxx:81
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
DerivationFramework::SkimmingToolHIGG5VBF::eventPassesFilter
virtual bool eventPassesFilter() const override
Check that the current event passes this filter.
Definition: SkimmingToolHIGG5VBF.cxx:89
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
AthAlgTool
Definition: AthAlgTool.h:26
DerivationFramework::SkimmingToolHIGG5VBF::m_reqTrigger
bool m_reqTrigger
Definition: SkimmingToolHIGG5VBF.h:73