ATLAS Offline Software
xAODMultiCjetFilter.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-c-jet filter with the removal of the
5 // c-hadrons orriginating from b-hadrons decay.
6 // It can cut on:
7 // - Multiplicity of c-jets (both min and max can be specified)
8 // - Multiplicity of jets (regardless of flavor)
9 // - The pT of the leading jet
10 //
11 // Written by Dominik Derendarz (dominik.derendarz@cern.ch) based on MultiBjetFilter
12 
13 #include <math.h>
14 #include <fstream>
15 
16 // Header for this module:-
18 
19 // Other classes used by this class:-
20 #include "GaudiKernel/SystemOfUnits.h"
21 #include "xAODJet/JetContainer.h"
22 #include "CxxUtils/BasicTypes.h"
23 #include "TLorentzVector.h"
24 
25 
26 
27 xAODMultiCjetFilter::xAODMultiCjetFilter(const std::string& name, ISvcLocator* pSvcLocator)
28  : GenFilter(name,pSvcLocator){
29 
30  // Local Member Data:-
31 
32  m_NPass = 0;
33  m_Nevt = 0;
36 }
37 
39 
41 
42  m_Nevt = 0;
43  m_NPass = 0;
46 
47  ATH_MSG_INFO("Initialized");
48  return StatusCode::SUCCESS;
49 }
50 
52 
53  ATH_MSG_INFO(m_NPass << " Events out of " << m_Nevt << " passed the filter");
54  ATH_MSG_INFO(m_SumOfWeights_Pass << " out of " << m_SumOfWeights_Evt << " SumOfWeights counter, passed/total" );
55  return StatusCode::SUCCESS;
56 }
57 
58 
60 
61  bool pass = true;
62  m_Nevt++;
63 
64  // Retrieve truth jets
65  const xAOD::JetContainer* truthjetTES = 0;
66  StatusCode sc = evtStore()->retrieve(truthjetTES, m_TruthJetContainerName);
67  if(sc.isFailure() || !truthjetTES) {
68  ATH_MSG_INFO("No xAOD::JetContainer found in TDS " << m_TruthJetContainerName \
69  << sc.isFailure() << " "<< !truthjetTES );
70  return StatusCode::SUCCESS;
71  }
72 
74  double lead_jet_pt = 0.0;
75 
76  // Select jets according to kinematic cuts, record leading jet pt
77  std::vector<xAOD::JetContainer::const_iterator> jets,cjets_all,cjets;
78  for(jitr = (*truthjetTES).begin(); jitr !=(*truthjetTES).end(); ++jitr) {
79  if((*jitr)->pt() < m_jetPtMin) continue;
80  if(std::abs((*jitr)->eta()) > m_jetEtaMax) continue;
81  if((*jitr)->pt() > lead_jet_pt) lead_jet_pt = (*jitr)->pt();
82  jets.push_back(jitr);
83  }
84 
85  // Apply leading jet pt cut
86  if(lead_jet_pt < m_leadJet_ptMin || (lead_jet_pt > m_leadJet_ptMax && m_leadJet_ptMax > 0)) {
87  pass = false;
88  }
89 
90  // Apply jet multiplicity cut
91  int njets = jets.size();
92  if(njets < m_nJetsMin) pass = false;
93  if(njets > m_nJetsMax && m_nJetsMax > 0) pass = false;
94  int cJetCounter = 0;
95 
96 // Retrieve TruthGen container from xAOD Gen slimmer, contains all particles witout barcode_zero and
97 // duplicated barcode ones
98  const xAOD::TruthParticleContainer* xTruthParticleContainer;
99  if (evtStore()->retrieve(xTruthParticleContainer, "TruthGen").isFailure()) {
100  ATH_MSG_ERROR("No TruthParticle collection with name " << "TruthGen" << " found in StoreGate!");
101  return StatusCode::FAILURE;
102  }
103 
104 
105  // Make a vector containing all the event's b-hadrons
106  std::vector< const xAOD::TruthParticle* > bHadrons;
107 
108  unsigned int nPart = xTruthParticleContainer->size();
109  for (unsigned int iPart = 0; iPart < nPart; ++iPart) {
110  const xAOD::TruthParticle* part = (*xTruthParticleContainer)[iPart];
111 
112  if( !isBwithWeakDK( part->absPdgId()) ) continue;
113  if( part->pt() < m_bottomPtMin ) continue;
114  if( std::abs( part->abseta() ) > m_bottomEtaMax) continue;
115  bHadrons.push_back(part);
116 
117  }
118  // Make a vector containing all the event's c-hadrons
119  std::vector< const xAOD::TruthParticle* > cHadrons;
120 
121  for (unsigned int iPart = 0; iPart < nPart; ++iPart) {
122  const xAOD::TruthParticle* part = (*xTruthParticleContainer)[iPart];
123 
124  if( !isCwithWeakDK( part->absPdgId()) ) continue;
125  if( part->pt() < m_bottomPtMin ) continue;
126  if( std::abs( part->abseta() ) > m_bottomEtaMax) continue;
127  cHadrons.push_back(part);
128  }
129 
130  // Count how many truth jets contain c-hadrons
131  for(uint i = 0; i < jets.size(); i++){
132  for(uint j = 0; j < cHadrons.size(); j++){
133  TLorentzVector genpart(cHadrons.at(j)->px(), cHadrons.at(j)->py(), cHadrons.at(j)->pz(), cHadrons.at(j)->e());
134  double dR = (*jets[i])->p4().DeltaR(genpart);
135  if(dR<m_deltaRFromTruth){
136  cjets_all.push_back(jets[i]);
137  break;
138  }
139  }
140  }
141 
142 
143  // check if cjets contian b-hadron
144  // select only those withouty b-hadron
145  // @todo - removal based on parent
146 
147  for(uint i = 0; i < cjets_all.size(); i++){
148  bool b_inside_cjet = false;
149  for(uint j = 0; j < bHadrons.size(); j++){
150  TLorentzVector genpart(bHadrons.at(j)->px(), bHadrons.at(j)->py(), bHadrons.at(j)->pz(), bHadrons.at(j)->e());
151  double dR = (*cjets_all[i])->p4().DeltaR(genpart);
152  if(dR<m_deltaRFromTruth){
153  b_inside_cjet = true;
154  break;
155  }
156  }
157  // only those without b-hadron
158  if(!b_inside_cjet){
159  cjets.push_back(cjets_all[i]);
160  cJetCounter++;
161  }
162  }
163  //}
164 
165  // Apply c-jet multiplicity cut
166  if(cJetCounter < m_nCJetsMin) pass = false;
167  if(cJetCounter > m_nCJetsMax && m_nCJetsMax > 0) pass = false;
168 
169  // Bookkeeping
170  double weight = 1;
171  for(const HepMC::GenEvent* genEvt : *events_const()) {
172  weight = genEvt->weights().front();
173  }
174 
176  if(pass){
177  m_NPass++;
179  }
180 
181  setFilterPassed(pass);
182  return StatusCode::SUCCESS;
183 }
184 
185 bool xAODMultiCjetFilter::isBwithWeakDK(const int pID) const
186 {
187  int id = std::abs(pID);
188  return ( id == 511 || // B+
189  id == 521 || // B0
190  id == 531 || // Bs
191  id == 541 || // Bc
192  id == 5122 || // Lambda_B
193  id == 5132 || // Xi_b-
194  id == 5232 || // X_b0
195  id == 5112 || // Sigma_b-
196  id == 5212 || // Sigma_b0
197  id == 5222 ); // Sigma_b+
198 }
199 
200 bool xAODMultiCjetFilter::isCwithWeakDK(const int pID) const
201 {
202  int id = std::abs(pID);
203  return ( id == 411 || // D+
204  id == 421 || // D0
205  id == 431 || // Ds
206  id == 4122 || // Lambda_C
207  id == 4132 || // Xi_C^0
208  id == 4232 || // Xi_C^+
209  id == 4212 || // Xi_C^0
210  id == 4322 || // Xi'_C+ This is in fact EM not weak
211  id == 4332); // Omega_C
212 }
213 
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAODMultiCjetFilter::~xAODMultiCjetFilter
virtual ~xAODMultiCjetFilter()
Definition: xAODMultiCjetFilter.cxx:38
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
xAODMultiCjetFilter.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAODMultiCjetFilter::isBwithWeakDK
bool isBwithWeakDK(const int pID) const
Definition: xAODMultiCjetFilter.cxx:185
GenBase::events_const
const McEventCollection * events_const() const
Access the current event's McEventCollection (const)
Definition: GenBase.h:96
xAODMultiCjetFilter::m_nCJetsMin
Gaudi::Property< int > m_nCJetsMin
Definition: xAODMultiCjetFilter.h:45
xAODMultiCjetFilter::m_jetPtMin
Gaudi::Property< double > m_jetPtMin
Definition: xAODMultiCjetFilter.h:33
xAODMultiCjetFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: xAODMultiCjetFilter.cxx:40
xAODMultiCjetFilter::m_bottomPtMin
Gaudi::Property< double > m_bottomPtMin
Definition: xAODMultiCjetFilter.h:43
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
xAODMultiCjetFilter::m_TruthJetContainerName
Gaudi::Property< std::string > m_TruthJetContainerName
Definition: xAODMultiCjetFilter.h:49
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
GenFilter
Base class for event generator filtering modules.
Definition: GenFilter.h:30
xAODMultiCjetFilter::m_nJetsMax
Gaudi::Property< int > m_nJetsMax
Definition: xAODMultiCjetFilter.h:36
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
xAODMultiCjetFilter::m_nJetsMin
Gaudi::Property< int > m_nJetsMin
Definition: xAODMultiCjetFilter.h:35
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.
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
xAODMultiCjetFilter::m_leadJet_ptMin
Gaudi::Property< double > m_leadJet_ptMin
Definition: xAODMultiCjetFilter.h:39
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
xAODMultiCjetFilter::isCwithWeakDK
bool isCwithWeakDK(const int pID) const
Definition: xAODMultiCjetFilter.cxx:200
xAODMultiCjetFilter::m_Nevt
int m_Nevt
Definition: xAODMultiCjetFilter.h:53
xAODMultiCjetFilter::m_leadJet_ptMax
Gaudi::Property< double > m_leadJet_ptMax
Definition: xAODMultiCjetFilter.h:40
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
xAODMultiCjetFilter::m_NPass
int m_NPass
Definition: xAODMultiCjetFilter.h:52
xAODMultiCjetFilter::m_SumOfWeights_Pass
double m_SumOfWeights_Pass
Definition: xAODMultiCjetFilter.h:54
skel.genpart
tuple genpart
Check that the actual generators, tune, and main PDF are consistent with the JO name.
Definition: skel.ABtoEVGEN.py:262
xAODMultiCjetFilter::m_deltaRFromTruth
Gaudi::Property< double > m_deltaRFromTruth
Definition: xAODMultiCjetFilter.h:32
xAODMultiCjetFilter::m_jetEtaMax
Gaudi::Property< double > m_jetEtaMax
Definition: xAODMultiCjetFilter.h:34
JetContainer.h
xAODMultiCjetFilter::m_nCJetsMax
Gaudi::Property< int > m_nCJetsMax
Definition: xAODMultiCjetFilter.h:46
xAODMultiCjetFilter::m_bottomEtaMax
Gaudi::Property< double > m_bottomEtaMax
Definition: xAODMultiCjetFilter.h:44
xAODMultiCjetFilter::filterFinalize
virtual StatusCode filterFinalize()
Definition: xAODMultiCjetFilter.cxx:51
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
xAODMultiCjetFilter::filterEvent
virtual StatusCode filterEvent()
Definition: xAODMultiCjetFilter.cxx:59
xAODMultiCjetFilter::xAODMultiCjetFilter
xAODMultiCjetFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: xAODMultiCjetFilter.cxx:27
xAODMultiCjetFilter::m_SumOfWeights_Evt
double m_SumOfWeights_Evt
Definition: xAODMultiCjetFilter.h:55
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.