ATLAS Offline Software
xAODMultiBjetFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 // This is a general-purpose multi-b-jet filter. It can cut on:
5 // - Multiplicity of b-jets (both min and max can be specified)
6 // - Multiplicity of jets (regardless of flavor)
7 // - The pT of the leading jet
8 //
9 // Written by Bill Balunas (balunas@cern.ch)
10 
11 // Header for this module:-
13 
14 // Other classes used by this class:-
15 #include <math.h>
16 #include "GaudiKernel/SystemOfUnits.h"
17 #include "xAODJet/JetContainer.h"
18 #include "CxxUtils/BasicTypes.h"
19 #include "TLorentzVector.h"
20 
21 #include <fstream>
22 
23 
24 xAODMultiBjetFilter::xAODMultiBjetFilter(const std::string& name, ISvcLocator* pSvcLocator)
25  : GenFilter(name,pSvcLocator){
26 
27  // Local Member Data:-
28 
29  m_NPass = 0;
30  m_Nevt = 0;
33 }
34 
36 
38 
39  m_Nevt = 0;
40  m_NPass = 0;
43 
44  ATH_MSG_INFO("Initialized");
45  return StatusCode::SUCCESS;
46 }
47 
49 
50  ATH_MSG_INFO( m_NPass << " Events out of " << m_Nevt << " passed the filter");
51  ATH_MSG_INFO( m_SumOfWeights_Pass << " out of " << m_SumOfWeights_Evt << " SumOfWeights counter, passed/total");
52  return StatusCode::SUCCESS;
53 }
54 
55 
57 
58  bool pass = true;
59  m_Nevt++;
60 
61  // Retrieve truth jets
62  const xAOD::JetContainer* truthjetTES = 0;
63  StatusCode sc = evtStore()->retrieve(truthjetTES, m_TruthJetContainerName);
64  if(sc.isFailure() || !truthjetTES) {
66  "No xAOD::JetContainer found in TDS " << m_TruthJetContainerName \
67  << sc.isFailure() << " "<< !truthjetTES);
68  return StatusCode::SUCCESS;
69  }
70 
72  double lead_jet_pt = 0.0;
73 
74  // Select jets according to kinematic cuts, record leading jet pt
75  std::vector<xAOD::JetContainer::const_iterator> jets,bjets;
76  for(jitr = (*truthjetTES).begin(); jitr !=(*truthjetTES).end(); ++jitr) {
77  if((*jitr)->pt() < m_jetPtMin) continue;
78  if(std::abs((*jitr)->eta()) > m_jetEtaMax) continue;
79  if((*jitr)->pt() > lead_jet_pt) lead_jet_pt = (*jitr)->pt();
80  jets.push_back(jitr);
81  }
82 
83  // Retrieve TruthGen container from xAOD Gen slimmer, contains all particles witout barcode_zero and
84 // duplicated barcode ones
85  const xAOD::TruthParticleContainer* xTruthParticleContainer;
86  if (evtStore()->retrieve(xTruthParticleContainer, "TruthGen").isFailure()) {
87  ATH_MSG_ERROR("No TruthParticle collection with name " << "TruthGen" << " found in StoreGate!");
88  return StatusCode::FAILURE;
89  }
90 
91  // Apply leading jet pt cut
92  if(lead_jet_pt < m_leadJet_ptMin || (lead_jet_pt > m_leadJet_ptMax && m_leadJet_ptMax > 0)) pass = false;
93 
94  // Apply jet multiplicity cut
95  int njets = jets.size();
96  if(njets < m_nJetsMin) pass = false;
97  if(njets > m_nJetsMax && m_nJetsMax > 0) pass = false;
98 
99  int bJetCounter = 0;
100 
101  // Make a vector containing all the event's b-hadrons
102  std::vector< const xAOD::TruthParticle* > bHadrons;
103  unsigned int nPart = xTruthParticleContainer->size();
104  for (unsigned int iPart = 0; iPart < nPart; ++iPart) {
105  const xAOD::TruthParticle* part = (*xTruthParticleContainer)[iPart];
106 
107  if( !isBwithWeakDK( part->absPdgId()) ) continue;
108  if( part->pt() < m_bottomPtMin ) continue;
109  if( std::abs( part->abseta() ) > m_bottomEtaMax) continue;
110  bHadrons.push_back(part);
111  }
112 
113  // Count how many truth jets contain b-hadrons
114  for(uint i = 0; i < jets.size(); i++){
115  for(uint j = 0; j < bHadrons.size(); j++){
116  TLorentzVector genpart(bHadrons.at(j)->px(), bHadrons.at(j)->py(), bHadrons.at(j)->pz(), bHadrons.at(j)->e());
117  double dR = (*jets[i])->p4().DeltaR(genpart);
118  if(dR<m_deltaRFromTruth){
119  bJetCounter++;
120  bjets.push_back(jets[i]);
121  break;
122  }
123  }
124  }
125 
126  // Apply b-jet multiplicity cut
127  if(bJetCounter < m_nBJetsMin) pass = false;
128  if(bJetCounter > m_nBJetsMax && m_nBJetsMax > 0) pass = false;
129 
130  // Bookkeeping
131  double weight = 1;
132  for(const HepMC::GenEvent* genEvt : *events_const()) {
133  weight = genEvt->weights().front();
134  }
136  if(pass){
137  m_NPass++;
139  }
140 
141  setFilterPassed(pass);
142  return StatusCode::SUCCESS;
143 }
144 
145 bool xAODMultiBjetFilter::isBwithWeakDK(const int pID) const
146 {
147  int id = std::abs(pID);
148  if ( id == 511 || // B+
149  id == 521 || // B0
150  id == 531 || // Bs
151  id == 541 || // Bc
152  id == 5122 || // Lambda_B
153  id == 5132 || // Xi_b-
154  id == 5232 || // X_b0
155  id == 5112 || // Sigma_b-
156  id == 5212 || // Sigma_b0
157  id == 5222 ) // Sigma_b+
158  return true;
159  else
160  return false;
161 }
162 
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAODMultiBjetFilter::m_TruthJetContainerName
Gaudi::Property< std::string > m_TruthJetContainerName
Definition: xAODMultiBjetFilter.h:47
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
GenBase::events_const
const McEventCollection * events_const() const
Access the current event's McEventCollection (const)
Definition: GenBase.h:96
xAODMultiBjetFilter::m_nJetsMin
Gaudi::Property< int > m_nJetsMin
Definition: xAODMultiBjetFilter.h:35
xAODMultiBjetFilter::xAODMultiBjetFilter
xAODMultiBjetFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: xAODMultiBjetFilter.cxx:24
xAODMultiBjetFilter::m_deltaRFromTruth
Gaudi::Property< double > m_deltaRFromTruth
Definition: xAODMultiBjetFilter.h:32
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
xAODMultiBjetFilter::m_jetEtaMax
Gaudi::Property< double > m_jetEtaMax
Definition: xAODMultiBjetFilter.h:34
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
xAODMultiBjetFilter::isBwithWeakDK
bool isBwithWeakDK(const int pID) const
Definition: xAODMultiBjetFilter.cxx:145
GenFilter
Base class for event generator filtering modules.
Definition: GenFilter.h:30
xAODMultiBjetFilter::filterFinalize
virtual StatusCode filterFinalize()
Definition: xAODMultiBjetFilter.cxx:48
xAODMultiBjetFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: xAODMultiBjetFilter.cxx:37
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
BasicTypes.h
Provide simplified clock_gettime() function for MacOSX.
xAODMultiBjetFilter::m_jetPtMin
Gaudi::Property< double > m_jetPtMin
Definition: xAODMultiBjetFilter.h:33
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
xAODMultiBjetFilter::~xAODMultiBjetFilter
virtual ~xAODMultiBjetFilter()
Definition: xAODMultiBjetFilter.cxx:35
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
xAODMultiBjetFilter::m_bottomPtMin
Gaudi::Property< double > m_bottomPtMin
Definition: xAODMultiBjetFilter.h:43
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
xAODMultiBjetFilter::filterEvent
virtual StatusCode filterEvent()
Definition: xAODMultiBjetFilter.cxx:56
xAODMultiBjetFilter::m_nBJetsMax
Gaudi::Property< int > m_nBJetsMax
Definition: xAODMultiBjetFilter.h:46
xAODMultiBjetFilter::m_SumOfWeights_Pass
double m_SumOfWeights_Pass
Definition: xAODMultiBjetFilter.h:52
xAODMultiBjetFilter::m_leadJet_ptMax
Gaudi::Property< double > m_leadJet_ptMax
Definition: xAODMultiBjetFilter.h:40
xAODMultiBjetFilter::m_Nevt
int m_Nevt
Definition: xAODMultiBjetFilter.h:51
xAODMultiBjetFilter.h
skel.genpart
tuple genpart
Check that the actual generators, tune, and main PDF are consistent with the JO name.
Definition: skel.ABtoEVGEN.py:262
xAODMultiBjetFilter::m_leadJet_ptMin
Gaudi::Property< double > m_leadJet_ptMin
Definition: xAODMultiBjetFilter.h:39
JetContainer.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAODMultiBjetFilter::m_SumOfWeights_Evt
double m_SumOfWeights_Evt
Definition: xAODMultiBjetFilter.h:53
xAODMultiBjetFilter::m_NPass
int m_NPass
Definition: xAODMultiBjetFilter.h:50
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
xAODMultiBjetFilter::m_nBJetsMin
Gaudi::Property< int > m_nBJetsMin
Definition: xAODMultiBjetFilter.h:45
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAODMultiBjetFilter::m_nJetsMax
Gaudi::Property< int > m_nJetsMax
Definition: xAODMultiBjetFilter.h:36
xAODMultiBjetFilter::m_bottomEtaMax
Gaudi::Property< double > m_bottomEtaMax
Definition: xAODMultiBjetFilter.h:44