ATLAS Offline Software
DiBjetFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // -------------------------------------------------------------
6 // File: GeneratorFilters/DiBjetFilter.cxx
7 // Description:
8 // This is a multi-purpose di-b-jet filter. It cuts on:
9 // - The presence of two b-hadron match jets in the end
10 // - The pT of the leading jet
11 // - It can also pass light jets and reweight the event accordingly to make an
12 // statisticaly inclusive sample of jets but with baised towards
13 // heavy flavour events
14 //
15 // AuthorList:
16 // S. Bieniek
17 
18 // Header for this module:-
20 
21 // Other classes used by this class:-
22 #include <math.h>
23 #include "GaudiKernel/SystemOfUnits.h"
24 #include "xAODJet/JetContainer.h"
25 #include "CxxUtils/BasicTypes.h"
26 #include "TRandom3.h"
27 #include "TLorentzVector.h"
28 
29 //--------------------------------------------------------------------------
30 DiBjetFilter::DiBjetFilter(const std::string& name, ISvcLocator* pSvcLocator)
31  : GenFilter(name,pSvcLocator)
32 {
33  //--------------------------------------------------------------------------
34  // Local Member Data:-
38  declareProperty("BottomEtaMax",m_bottomEtaMax=3.0);
40  declareProperty("JetEtaMax",m_jetEtaMax=2.7);
41  declareProperty("DeltaRFromTruth",m_deltaRFromTruth=0.3);
42  declareProperty("TruthContainerName",m_TruthJetContainerName="AntiKt4TruthJets");
43  declareProperty("LightJetSuppressionFactor",m_LightJetSuppressionFactor=10);
44  declareProperty("AcceptSomeLightEvents",m_AcceptSomeLightEvents=false);
45 
46  m_NPass = 0;
47  m_Nevt = 0;
50  m_ranNumGen = 0;
51 }
52 
53 //--------------------------------------------------------------------------
55 //--------------------------------------------------------------------------
56 
57 }
58 
59 //---------------------------------------------------------------------------
61 //---------------------------------------------------------------------------
62 
63  m_Nevt = 0;
64  m_NPass = 0;
67 
69  m_ranNumGen = new TRandom3();
70  /* Set seed with respect to computer clock time */
71  m_ranNumGen->SetSeed(0);
72  }
73  msg(MSG::INFO) << "Initialized" << endmsg;
74  return StatusCode::SUCCESS;
75 }
76 
77 //---------------------------------------------------------------------------
79 //---------------------------------------------------------------------------
80 
82  delete m_ranNumGen;
83  }
84  msg(MSG::INFO) << m_NPass << " Events out of " << m_Nevt << " passed the filter" << endmsg;
85  msg(MSG::INFO) << m_SumOfWeigths_Pass << " out of " << m_SumOfWeigths_Evt << " SumOfWeights counter, passed/total" << endmsg;
86  return StatusCode::SUCCESS;
87 }
88 
89 
90 //---------------------------------------------------------------------------
92 //---------------------------------------------------------------------------
93 
94  bool pass = false;
95  m_Nevt++;
96 
97  const xAOD::JetContainer* truthjetTES = 0;
98  StatusCode sc=evtStore()->retrieve( truthjetTES, m_TruthJetContainerName);
99  if( sc.isFailure() || !truthjetTES ) {
100  msg(MSG::WARNING)
101  << "No xAOD::JetContainer found in TDS " << m_TruthJetContainerName \
102  << sc.isFailure() << " "<< !truthjetTES
103  << endmsg;
104  return StatusCode::SUCCESS;
105  }
106 
107  bool passLeadJetCut = false;
109  double lead_jet_pt = 0.0;
110  std::vector<xAOD::JetContainer::const_iterator> jets;
111  for (jitr = (*truthjetTES).begin(); jitr !=(*truthjetTES).end(); ++jitr) {
112  if( (*jitr)->pt() > lead_jet_pt ){
113  lead_jet_pt = (*jitr)->pt();
114  }
115  if( (*jitr)->pt() < m_jetPtMin ) continue;
116  if( std::abs( (*jitr)->eta() ) > m_jetEtaMax ) continue;
117  jets.push_back(jitr);
118  }
119 
120  if( lead_jet_pt > m_leadJet_ptMin && lead_jet_pt < m_leadJet_ptMax ) passLeadJetCut = true;
121 
122  int bJetCounter = 0;
123  double weight = 1;
124  for (const HepMC::GenEvent* genEvt : *events()) {
125  weight = genEvt->weights().front();
126  std::vector<HepMC::ConstGenParticlePtr> bHadrons;
127  for(const auto& pitr: *genEvt) {
128  if( !isBwithWeakDK( pitr->pdg_id()) ) continue;
129  if( pitr->momentum().perp() < m_bottomPtMin ) continue;
130  if( std::abs( pitr->momentum().pseudoRapidity() ) > m_bottomEtaMax) continue;
131  bHadrons.push_back(pitr);
132  }
133  for(uint i = 0; i < jets.size(); i++){
134  for(uint j = 0; j < bHadrons.size(); j++){
135  HepMC::FourVector tmp = bHadrons[j]->momentum();
136  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
137  double dR = (*jets[i])->p4().DeltaR(genpart);
138  if(dR<m_deltaRFromTruth){
139  bJetCounter++;
140  break;
141  }
142  }
143  }
144  }
145 
147 
148  pass = (bJetCounter >= 2) && passLeadJetCut;
149  if( (bJetCounter <= 1) && m_AcceptSomeLightEvents
150  && m_ranNumGen->Uniform() < (1.0 / m_LightJetSuppressionFactor )
151  && passLeadJetCut ){
152  /* Modify event weight to account for light jet prescale */
153  for (HepMC::GenEvent* genEvt : *events()) {
154  genEvt->weights().front() *= m_LightJetSuppressionFactor;
155  }
156  pass = true;
157  }
158 
159  if(pass){
160  m_NPass++;
162  }
163 
164  setFilterPassed(pass);
165  return StatusCode::SUCCESS;
166 }
167 
168 bool DiBjetFilter::isBwithWeakDK(const int pID) const
169 {
170  int id = abs(pID);
171  if ( id == 511 || // B+
172  id == 521 || // B0
173  id == 531 || // Bs
174  id == 541 || // Bc
175  id == 5122 || // Lambda_B
176  id == 5132 || // Xi_b-
177  id == 5232 || // X_b0
178  id == 5112 || // Sigma_b-
179  id == 5212 || // Sigma_b0
180  id == 5222 ) // Sigma_b+
181  return true;
182  else
183  return false;
184 }
185 
DiBjetFilter::m_SumOfWeigths_Evt
double m_SumOfWeigths_Evt
Definition: DiBjetFilter.h:53
DiBjetFilter::m_NPass
int m_NPass
Definition: DiBjetFilter.h:50
DiBjetFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: DiBjetFilter.cxx:60
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
DiBjetFilter::~DiBjetFilter
virtual ~DiBjetFilter()
Definition: DiBjetFilter.cxx:54
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
DiBjetFilter::m_LightJetSuppressionFactor
double m_LightJetSuppressionFactor
Definition: DiBjetFilter.h:46
DiBjetFilter::m_bottomPtMin
double m_bottomPtMin
Definition: DiBjetFilter.h:36
python.DataFormatRates.events
events
Definition: DataFormatRates.py:105
DiBjetFilter::m_jetPtMin
double m_jetPtMin
Definition: DiBjetFilter.h:39
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
DiBjetFilter::m_SumOfWeigths_Pass
double m_SumOfWeigths_Pass
Definition: DiBjetFilter.h:52
DiBjetFilter.h
DiBjetFilter::m_leadJet_ptMax
double m_leadJet_ptMax
Definition: DiBjetFilter.h:43
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
DiBjetFilter::DiBjetFilter
DiBjetFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: DiBjetFilter.cxx:30
DiBjetFilter::filterEvent
virtual StatusCode filterEvent()
Definition: DiBjetFilter.cxx:91
DiBjetFilter::m_AcceptSomeLightEvents
bool m_AcceptSomeLightEvents
Definition: DiBjetFilter.h:47
lumiFormat.i
int i
Definition: lumiFormat.py:92
DiBjetFilter::m_Nevt
int m_Nevt
Definition: DiBjetFilter.h:51
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
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.
DiBjetFilter::m_jetEtaMax
double m_jetEtaMax
Definition: DiBjetFilter.h:40
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
DiBjetFilter::isBwithWeakDK
bool isBwithWeakDK(const int pID) const
Definition: DiBjetFilter.cxx:168
DiBjetFilter::m_ranNumGen
TRandom3 * m_ranNumGen
Definition: DiBjetFilter.h:54
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
DiBjetFilter::m_bottomEtaMax
double m_bottomEtaMax
Definition: DiBjetFilter.h:37
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
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
DiBjetFilter::m_deltaRFromTruth
double m_deltaRFromTruth
Definition: DiBjetFilter.h:38
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
DiBjetFilter::filterFinalize
virtual StatusCode filterFinalize()
Definition: DiBjetFilter.cxx:78
DiBjetFilter::m_TruthJetContainerName
std::string m_TruthJetContainerName
Definition: DiBjetFilter.h:44
DiBjetFilter::m_leadJet_ptMin
double m_leadJet_ptMin
Definition: DiBjetFilter.h:42