ATLAS Offline Software
MultiBjetFilter.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-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"
21 #include "CLHEP/Random/RandomEngine.h"
22 
23 #include <fstream>
24 
25 MultiBjetFilter::MultiBjetFilter(const std::string& name, ISvcLocator* pSvcLocator)
26  : GenFilter(name,pSvcLocator) {
27 
28  // Local Member Data:-
29  declareProperty("NJetsMin", m_nJetsMin = 0);
30  declareProperty("NJetsMax", m_nJetsMax = -1); // Negative number means no cut
31  declareProperty("NBJetsMin", m_nBJetsMin = 0);
32  declareProperty("NBJetsMax", m_nBJetsMax = -1); // Negative number means no cut
33  declareProperty("LeadJetPtMin", m_leadJet_ptMin = 0);
34  declareProperty("LeadJetPtMax", m_leadJet_ptMax = -1); // Negative number means no cut
35  declareProperty("BottomPtMin", m_bottomPtMin = 5.0*Gaudi::Units::GeV);
36  declareProperty("BottomEtaMax", m_bottomEtaMax = 3.0);
37  declareProperty("JetPtMin", m_jetPtMin = 15.0*Gaudi::Units::GeV);
38  declareProperty("JetEtaMax", m_jetEtaMax = 2.7);
39  declareProperty("DeltaRFromTruth", m_deltaRFromTruth = 0.3);
40  declareProperty("TruthContainerName", m_TruthJetContainerName = "AntiKt4TruthJets");
41  declareProperty("InclusiveEfficiency", m_inclusiveEff = 0.);
42 
43  m_NPass = 0;
44  m_Nevt = 0;
47 }
48 
50 
52 
53  CHECK(m_rndmSvc.retrieve());
54  m_Nevt = 0;
55  m_NPass = 0;
58 
59  ATH_MSG_INFO("Initialized");
60  return StatusCode::SUCCESS;
61 }
62 
64 
65  ATH_MSG_INFO( m_NPass << " Events out of " << m_Nevt << " passed the filter");
66  ATH_MSG_INFO( m_SumOfWeights_Pass << " out of " << m_SumOfWeights_Evt << " SumOfWeights counter, passed/total");
67  return StatusCode::SUCCESS;
68 }
69 
70 
71 CLHEP::HepRandomEngine* MultiBjetFilter::getRandomEngine(const std::string& streamName,
72  const EventContext& ctx) const
73 {
74  ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this, streamName);
75  std::string rngName = name()+streamName;
76  rngWrapper->setSeed( rngName, ctx );
77  return rngWrapper->getEngine(ctx);
78 }
79 
80 
82  const EventContext& ctx = Gaudi::Hive::currentContext();
83  CLHEP::HepRandomEngine* rndm = this->getRandomEngine("MultiBjetFilter", ctx);
84  if (!rndm) {
85  ATH_MSG_WARNING("Failed to retrieve random number engine " << "MultiBjetFilter");
86  setFilterPassed(false);
87  return StatusCode::FAILURE;
88  }
89 
90  bool pass = true;
91  m_Nevt++;
92 
93  // Retrieve truth jets
94  const xAOD::JetContainer* truthjetTES = 0;
95  StatusCode sc = evtStore()->retrieve(truthjetTES, m_TruthJetContainerName);
96  if(sc.isFailure() || !truthjetTES) {
97  ATH_MSG_WARNING("No xAOD::JetContainer found in TDS " << m_TruthJetContainerName \
98  << sc.isFailure() << " "<< !truthjetTES);
99  return StatusCode::SUCCESS;
100  }
101 
103  double lead_jet_pt = 0.0;
104 
105  // Select jets according to kinematic cuts, record leading jet pt
106  std::vector<xAOD::JetContainer::const_iterator> jets,bjets;
107  for(jitr = (*truthjetTES).begin(); jitr !=(*truthjetTES).end(); ++jitr) {
108  if((*jitr)->pt() < m_jetPtMin) continue;
109  if(std::abs((*jitr)->eta()) > m_jetEtaMax) continue;
110  if((*jitr)->pt() > lead_jet_pt) lead_jet_pt = (*jitr)->pt();
111  jets.push_back(jitr);
112  }
113 
114  // Apply leading jet pt cut
115  if(lead_jet_pt < m_leadJet_ptMin || (lead_jet_pt > m_leadJet_ptMax && m_leadJet_ptMax > 0)) pass = false;
116 
117  // Apply jet multiplicity cut
118  int njets = jets.size();
119  if(njets < m_nJetsMin) pass = false;
120  if(njets > m_nJetsMax && m_nJetsMax > 0) pass = false;
121 
122  int bJetCounter = 0;
123  double weight = 1;
124  for(const HepMC::GenEvent* genEvt : *events_const()) {
125  weight = genEvt->weights().front();
126 
127  // Make a vector containing all the event's b-hadrons
128  std::vector<HepMC::ConstGenParticlePtr> bHadrons;
129  for(const auto& pitr: *genEvt) {
130  if( !isBwithWeakDK( pitr->pdg_id()) ) continue;
131  if( pitr->momentum().perp() < m_bottomPtMin ) continue;
132  if( std::abs( pitr->momentum().pseudoRapidity() ) > m_bottomEtaMax) continue;
133  bHadrons.push_back(pitr);
134  }
135  // Count how many truth jets contain b-hadrons
136  for(uint i = 0; i < jets.size(); i++){
137  for(uint j = 0; j < bHadrons.size(); j++){
138  HepMC::FourVector tmp = bHadrons.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  bJetCounter++;
143  bjets.push_back(jets[i]);
144  break;
145  }
146  }
147  }
148  }
149 
150  // Apply b-jet multiplicity cut
151  if(bJetCounter < m_nBJetsMin) pass = false;
152  if(bJetCounter > m_nBJetsMax && m_nBJetsMax > 0) pass = false;
153 
154  // Bookkeeping
156  if(pass){
157 
158  m_NPass++;
160 
161  } else if (m_inclusiveEff > 0.) {
162 
163  if (rndm) {
164  double rnd = rndm->flat();
165  if (m_inclusiveEff > rnd) {
166 
167  pass = true;
168  m_NPass++;
170 
171  const McEventCollection* mecc = 0;
172  CHECK(evtStore()->retrieve(mecc));
173  ATH_MSG_DEBUG("Adding prescaled inclusive event. Will mod event weights by " << 1./m_inclusiveEff << " rnd " << rnd);
174  double orig = 1.;
175  McEventCollection* mec = const_cast<McEventCollection*> (&(*mecc));
176  for (unsigned int i=0;i<mec->size();++i) {
177  if ( !(*mec)[i] ) continue;
178  orig = (*mec)[i]->weights().size()>0?(*mec)[i]->weights()[0]:1.;
179  if ((*mec)[i]->weights().size()>0) (*mec)[i]->weights()[0] = orig/m_inclusiveEff;
180  else (*mec)[i]->weights().push_back( orig/m_inclusiveEff );
181  }
182  }
183  } // random number generator
184 
185  } // pass vs inclusive
186 
187  setFilterPassed(pass);
188  return StatusCode::SUCCESS;
189 }
190 
191 bool MultiBjetFilter::isBwithWeakDK(const int pID) const
192 {
193  int id = std::abs(pID);
194  if ( id == 511 || // B+
195  id == 521 || // B0
196  id == 531 || // Bs
197  id == 541 || // Bc
198  id == 5122 || // Lambda_B
199  id == 5132 || // Xi_b-
200  id == 5232 || // X_b0
201  id == 5112 || // Sigma_b-
202  id == 5212 || // Sigma_b0
203  id == 5222 ) // Sigma_b+
204  return true;
205  else
206  return false;
207 }
208 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ATHRNG::RNGWrapper::setSeed
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition: RNGWrapper.h:169
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
MultiBjetFilter.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MultiBjetFilter::isBwithWeakDK
bool isBwithWeakDK(const int pID) const
Definition: MultiBjetFilter.cxx:191
MultiBjetFilter::m_deltaRFromTruth
double m_deltaRFromTruth
Definition: MultiBjetFilter.h:33
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
MultiBjetFilter::m_SumOfWeights_Evt
double m_SumOfWeights_Evt
Definition: MultiBjetFilter.h:58
MultiBjetFilter::m_jetEtaMax
double m_jetEtaMax
Definition: MultiBjetFilter.h:35
MultiBjetFilter::m_nJetsMax
int m_nJetsMax
Definition: MultiBjetFilter.h:37
MultiBjetFilter::getRandomEngine
CLHEP::HepRandomEngine * getRandomEngine(const std::string &streamName, const EventContext &ctx) const
Definition: MultiBjetFilter.cxx:71
MultiBjetFilter::m_NPass
int m_NPass
Definition: MultiBjetFilter.h:55
MultiBjetFilter::m_rndmSvc
ServiceHandle< IAthRNGSvc > m_rndmSvc
Definition: MultiBjetFilter.h:51
MultiBjetFilter::filterFinalize
virtual StatusCode filterFinalize()
Definition: MultiBjetFilter.cxx:63
MultiBjetFilter::~MultiBjetFilter
virtual ~MultiBjetFilter()
Definition: MultiBjetFilter.cxx:49
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
MultiBjetFilter::m_bottomEtaMax
double m_bottomEtaMax
Definition: MultiBjetFilter.h:45
MultiBjetFilter::m_jetPtMin
double m_jetPtMin
Definition: MultiBjetFilter.h:34
MultiBjetFilter::m_TruthJetContainerName
std::string m_TruthJetContainerName
Definition: MultiBjetFilter.h:52
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
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
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
MultiBjetFilter::m_leadJet_ptMin
double m_leadJet_ptMin
Definition: MultiBjetFilter.h:40
BasicTypes.h
Provide simplified clock_gettime() function for MacOSX.
MultiBjetFilter::m_SumOfWeights_Pass
double m_SumOfWeights_Pass
Definition: MultiBjetFilter.h:57
MultiBjetFilter::filterEvent
virtual StatusCode filterEvent()
Definition: MultiBjetFilter.cxx:81
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
McEventCollection
This defines the McEventCollection, which is really just an ObjectVector of McEvent objects.
Definition: McEventCollection.h:33
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
MultiBjetFilter::m_bottomPtMin
double m_bottomPtMin
Definition: MultiBjetFilter.h:44
MultiBjetFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: MultiBjetFilter.cxx:51
MultiBjetFilter::m_nBJetsMin
int m_nBJetsMin
Definition: MultiBjetFilter.h:46
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ATHRNG::RNGWrapper
A wrapper class for event-slot-local random engines.
Definition: RNGWrapper.h:56
MultiBjetFilter::m_inclusiveEff
double m_inclusiveEff
Definition: MultiBjetFilter.h:50
MultiBjetFilter::m_Nevt
int m_Nevt
Definition: MultiBjetFilter.h:56
ATHRNG::RNGWrapper::getEngine
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition: RNGWrapper.h:134
RNGWrapper.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
MultiBjetFilter::m_nBJetsMax
int m_nBJetsMax
Definition: MultiBjetFilter.h:47
AthenaPoolExample_Copy.streamName
string streamName
Definition: AthenaPoolExample_Copy.py:39
JetContainer.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MultiBjetFilter::m_leadJet_ptMax
double m_leadJet_ptMax
Definition: MultiBjetFilter.h:41
MultiBjetFilter::MultiBjetFilter
MultiBjetFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MultiBjetFilter.cxx:25
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
MultiBjetFilter::m_nJetsMin
int m_nJetsMin
Definition: MultiBjetFilter.h:36