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