ATLAS Offline Software
MultiCjetFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 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 
28 MultiCjetFilter::MultiCjetFilter(const std::string& name, ISvcLocator* pSvcLocator)
29  : GenFilter(name,pSvcLocator){
30 
31  // Local Member Data:-
32  declareProperty("NJetsMin", m_nJetsMin = 0);
33  declareProperty("NJetsMax", m_nJetsMax = -1); // Negative number means no cut
34  declareProperty("NCJetsMin", m_nCJetsMin = 0);
35  declareProperty("NCJetsMax", m_nCJetsMax = -1); // Negative number means no cut
36  declareProperty("LeadJetPtMin", m_leadJet_ptMin = 0);
37  declareProperty("LeadJetPtMax", m_leadJet_ptMax = -1); // Negative number means no cut
38  declareProperty("BottomPtMin", m_bottomPtMin = 5.0*Gaudi::Units::GeV);
39  declareProperty("BottomEtaMax", m_bottomEtaMax = 3.0);
40  declareProperty("CharmPtMin", m_charmPtMin = 5.0*Gaudi::Units::GeV);
41  declareProperty("CharmEtaMax", m_charmEtaMax = 3.0);
42  declareProperty("JetPtMin", m_jetPtMin = 15.0*Gaudi::Units::GeV);
43  declareProperty("JetEtaMax", m_jetEtaMax = 2.7);
44  declareProperty("DeltaRFromTruth", m_deltaRFromTruth = 0.3);
45  declareProperty("TruthContainerName", m_TruthJetContainerName = "AntiKt4TruthJets");
46 
47  m_NPass = 0;
48  m_Nevt = 0;
51 }
52 
54 
56 
57  m_Nevt = 0;
58  m_NPass = 0;
61 
62  ATH_MSG_INFO("Initialized");
63  return StatusCode::SUCCESS;
64 }
65 
67 
68  ATH_MSG_INFO(m_NPass << " Events out of " << m_Nevt << " passed the filter");
69  ATH_MSG_INFO(m_SumOfWeights_Pass << " out of " << m_SumOfWeights_Evt << " SumOfWeights counter, passed/total" );
70  return StatusCode::SUCCESS;
71 }
72 
73 
75 
76  bool pass = true;
77  m_Nevt++;
78 
79  // Retrieve truth jets
80  const xAOD::JetContainer* truthjetTES = 0;
81  StatusCode sc = evtStore()->retrieve(truthjetTES, m_TruthJetContainerName);
82  if(sc.isFailure() || !truthjetTES) {
83  ATH_MSG_INFO("No xAOD::JetContainer found in TDS " << m_TruthJetContainerName \
84  << sc.isFailure() << " "<< !truthjetTES );
85  return StatusCode::SUCCESS;
86  }
87 
89  double lead_jet_pt = 0.0;
90 
91  // Select jets according to kinematic cuts, record leading jet pt
92  std::vector<xAOD::JetContainer::const_iterator> jets,cjets_all,cjets;
93  for(jitr = (*truthjetTES).begin(); jitr !=(*truthjetTES).end(); ++jitr) {
94  if((*jitr)->pt() < m_jetPtMin) continue;
95  if(std::abs((*jitr)->eta()) > m_jetEtaMax) continue;
96  if((*jitr)->pt() > lead_jet_pt) lead_jet_pt = (*jitr)->pt();
97  jets.push_back(jitr);
98  }
99 
100  // Apply leading jet pt cut
101  if(lead_jet_pt < m_leadJet_ptMin || (lead_jet_pt > m_leadJet_ptMax && m_leadJet_ptMax > 0)) {
102  pass = false;
103  }
104 
105  // Apply jet multiplicity cut
106  int njets = jets.size();
107  if(njets < m_nJetsMin) pass = false;
108  if(njets > m_nJetsMax && m_nJetsMax > 0) pass = false;
109 
110  int cJetCounter = 0;
111  double weight = 1;
113  for(const HepMC::GenEvent* genEvt : *events_const()) {
114  weight = genEvt->weights().front();
115 
116  // Make a vector containing all the event's b-hadrons
117  std::vector<HepMC::ConstGenParticlePtr> bHadrons;
118  for(const auto& pitr: *genEvt) {
119  if( !isBwithWeakDK( pitr->pdg_id()) ) continue;
120  if( pitr->momentum().perp() < m_bottomPtMin ) continue;
121  if( std::abs( pitr->momentum().pseudoRapidity() ) > m_bottomEtaMax) continue;
122  bHadrons.push_back(pitr);
123  }
124 
125 
126  // Make a vector containing all the event's c-hadrons
127  std::vector<HepMC::ConstGenParticlePtr> cHadrons;
128  for(const auto& pitr: *genEvt) {
129  if( !isCwithWeakDK( pitr->pdg_id()) ) continue;
130  if( pitr->momentum().perp() < m_charmPtMin ) continue;
131  if( std::abs( pitr->momentum().pseudoRapidity() ) > m_charmEtaMax) continue;
132  cHadrons.push_back(pitr);
133  }
134 
135  // Count how many truth jets contain c-hadrons
136  for(uint i = 0; i < jets.size(); i++){
137  for(uint j = 0; j < cHadrons.size(); j++){
138  HepMC::FourVector tmp = cHadrons.at(j)->momentum();
139  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
140  double dR = (*jets[i])->p4().DeltaR(genpart);
141  if(dR<m_deltaRFromTruth){
142  cjets_all.push_back(jets[i]);
143  break;
144  }
145  }
146  }
147 
148 
149  // check if cjets contian b-hadron
150  // select only those withouty b-hadron
151  // @todo - removal based on parrent
152 
153  for(uint i = 0; i < cjets_all.size(); i++){
154  bool b_inside_cjet = false;
155  for(uint j = 0; j < bHadrons.size(); j++){
156  HepMC::FourVector tmp = bHadrons.at(j)->momentum();
157  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
158  double dR = (*cjets_all[i])->p4().DeltaR(genpart);
159  if(dR<m_deltaRFromTruth){
160  b_inside_cjet = true;
161  break;
162  }
163  }
164  // only those without b-hadron
165  if(!b_inside_cjet){
166  cjets.push_back(cjets_all[i]);
167  cJetCounter++;
168  }
169  }
170  }
171 
172  // Apply c-jet multiplicity cut
173  if(cJetCounter < m_nCJetsMin) pass = false;
174  if(cJetCounter > m_nCJetsMax && m_nCJetsMax > 0) pass = false;
175 
176  // Bookkeeping
178  if(pass){
179  m_NPass++;
181  }
182 
183  setFilterPassed(pass);
184  return StatusCode::SUCCESS;
185 }
186 
187 bool MultiCjetFilter::isBwithWeakDK(const int pID) const
188 {
189  int id = std::abs(pID);
190  return ( id == 511 || // B+
191  id == 521 || // B0
192  id == 531 || // Bs
193  id == 541 || // Bc
194  id == 5122 || // Lambda_B
195  id == 5132 || // Xi_b-
196  id == 5232 || // X_b0
197  id == 5112 || // Sigma_b-
198  id == 5212 || // Sigma_b0
199  id == 5222 ); // Sigma_b+
200 }
201 
202 bool MultiCjetFilter::isCwithWeakDK(const int pID) const
203 {
204  int id = std::abs(pID);
205  return ( id == 411 || // D+
206  id == 421 || // D0
207  id == 431 || // Ds
208  id == 4122 || // Lambda_C
209  id == 4132 || // Xi_C^0
210  id == 4232 || // Xi_C^+
211  id == 4212 || // Xi_C^0
212  id == 4322 || // Xi'_C+ This is in fact EM not weak
213  id == 4332); // Omega_C
214 }
215 
MultiCjetFilter::m_Nevt
int m_Nevt
Definition: MultiCjetFilter.h:49
MultiCjetFilter::m_charmEtaMax
double m_charmEtaMax
Definition: MultiCjetFilter.h:41
MultiCjetFilter::m_charmPtMin
double m_charmPtMin
Definition: MultiCjetFilter.h:40
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
MultiCjetFilter::m_nCJetsMax
int m_nCJetsMax
Definition: MultiCjetFilter.h:43
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MultiCjetFilter::m_SumOfWeights_Pass
double m_SumOfWeights_Pass
Definition: MultiCjetFilter.h:50
GenBase::events_const
const McEventCollection * events_const() const
Access the current event's McEventCollection (const)
Definition: GenBase.h:96
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
MultiCjetFilter::filterFinalize
virtual StatusCode filterFinalize()
Definition: MultiCjetFilter.cxx:66
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
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
MultiCjetFilter::m_jetPtMin
double m_jetPtMin
Definition: MultiCjetFilter.h:28
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
MultiCjetFilter::filterEvent
virtual StatusCode filterEvent()
Definition: MultiCjetFilter.cxx:74
BasicTypes.h
Provide simplified clock_gettime() function for MacOSX.
MultiCjetFilter::m_nCJetsMin
int m_nCJetsMin
Definition: MultiCjetFilter.h:42
MultiCjetFilter::m_bottomPtMin
double m_bottomPtMin
Definition: MultiCjetFilter.h:38
MultiCjetFilter::m_TruthJetContainerName
std::string m_TruthJetContainerName
Definition: MultiCjetFilter.h:45
MultiCjetFilter::MultiCjetFilter
MultiCjetFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MultiCjetFilter.cxx:28
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
MultiCjetFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: MultiCjetFilter.cxx:55
MultiCjetFilter::m_SumOfWeights_Evt
double m_SumOfWeights_Evt
Definition: MultiCjetFilter.h:51
MultiCjetFilter::m_leadJet_ptMax
double m_leadJet_ptMax
Definition: MultiCjetFilter.h:35
MultiCjetFilter::m_nJetsMin
int m_nJetsMin
Definition: MultiCjetFilter.h:30
MultiCjetFilter::m_nJetsMax
int m_nJetsMax
Definition: MultiCjetFilter.h:31
MultiCjetFilter::~MultiCjetFilter
virtual ~MultiCjetFilter()
Definition: MultiCjetFilter.cxx:53
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
MultiCjetFilter.h
MultiCjetFilter::isBwithWeakDK
bool isBwithWeakDK(const int pID) const
Definition: MultiCjetFilter.cxx:187
skel.genpart
tuple genpart
Check that the actual generators, tune, and main PDF are consistent with the JO name.
Definition: skel.ABtoEVGEN.py:262
JetContainer.h
MultiCjetFilter::m_bottomEtaMax
double m_bottomEtaMax
Definition: MultiCjetFilter.h:39
MultiCjetFilter::isCwithWeakDK
bool isCwithWeakDK(const int pID) const
Definition: MultiCjetFilter.cxx:202
MultiCjetFilter::m_deltaRFromTruth
double m_deltaRFromTruth
Definition: MultiCjetFilter.h:27
MultiCjetFilter::m_leadJet_ptMin
double m_leadJet_ptMin
Definition: MultiCjetFilter.h:34
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
MultiCjetFilter::m_NPass
int m_NPass
Definition: MultiCjetFilter.h:48
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
MultiCjetFilter::m_jetEtaMax
double m_jetEtaMax
Definition: MultiCjetFilter.h:29