ATLAS Offline Software
HeavyFlavorHadronFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "GaudiKernel/SystemOfUnits.h"
7 #include "xAODJet/JetContainer.h"
8 #include "CxxUtils/BasicTypes.h"
9 #include <cmath>
10 
11 
12 HeavyFlavorHadronFilter::HeavyFlavorHadronFilter(const std::string& name, ISvcLocator* pSvcLocator)
13  : GenFilter(name, pSvcLocator),
14  m_NPass(0), m_Nevt(0), m_NbPass(0),
15  m_NcPass(0), m_NBHadronPass(0), m_NDHadronPass(0),
16  m_NPDGIDPass(0)
17 {
20  declareProperty("CharmEtaMax",m_charmEtaMax=3.0);
21  declareProperty("BottomEtaMax",m_bottomEtaMax=3.0);
24  declareProperty("cEtaMax",m_cEtaMax=5.0);
25  declareProperty("bEtaMax",m_bEtaMax=5.0);
27  declareProperty("JetEtaMax",m_jetEtaMax=2.5);
29  declareProperty("PDGEtaMax",m_PDGEtaMax=2.5);
30  declareProperty("PDGID",m_PDGID=0);
31  declareProperty("PDGAntiParticleToo",m_PDGAntiParticleToo=true);
32  declareProperty("RequestCharm",m_RequestCharm=true);
33  declareProperty("RequestBottom",m_RequestBottom=true);
34  declareProperty("Request_cQuark",m_Request_cQuark=true);
35  declareProperty("Request_bQuark",m_Request_bQuark=true);
36  declareProperty("RequestSpecificPDGID",m_RequestSpecificPDGID=false);
37  declareProperty("RequireTruthJet",m_RequireTruthJet=false);
38  declareProperty("DeltaRFromTruth",m_deltaRFromTruth=0.4);
39  declareProperty("TruthContainerName",m_TruthJetContainerName="AntiKt4TruthJets");
40 }
41 
42 
44  m_Nevt = 0;
45  m_NPass = 0;
46  m_NbPass = 0;
47  m_NcPass = 0;
48  m_NBHadronPass = 0;
49  m_NDHadronPass = 0;
50  m_NPDGIDPass = 0;
51  return StatusCode::SUCCESS;
52 }
53 
54 
56  ATH_MSG_INFO(m_NPass << " events out of " << m_Nevt << " passed the filter");
57  if (m_Request_bQuark) ATH_MSG_INFO(m_NbPass << " passed b-quark selection");
58  if (m_Request_cQuark) ATH_MSG_INFO(m_NcPass << " passed c-quark selection");
59  if (m_RequestBottom) ATH_MSG_INFO(m_NBHadronPass << " passed B Hadron selection");
60  if (m_RequestCharm) ATH_MSG_INFO(m_NDHadronPass << " passed Charm Hadron selection");
61  if (m_RequestSpecificPDGID) ATH_MSG_INFO(m_NPDGIDPass << " passed selection for PDG code " << m_PDGID);
62  return StatusCode::SUCCESS;
63 }
64 
65 
67  bool pass = false;
68  bool bPass = false;
69  bool cPass = false;
70  bool BHadronPass = false;
71  bool DHadronPass = false;
72  bool PDGIDPass = false;
73 
74  m_Nevt++;
75 
76  std::vector<xAOD::JetContainer::const_iterator> jets;
77  if (m_RequireTruthJet) {
78  const xAOD::JetContainer* truthjetTES;
80  for (xAOD::JetContainer::const_iterator j = truthjetTES->begin(); j != truthjetTES->end() ; ++j) {
81  if ((*j)->pt() > m_jetPtMin && std::abs((*j)->eta()) < m_jetEtaMax) {
82  jets.push_back(j);
83  }
84  }
85  }
86 
87  for (McEventCollection::const_iterator itr = events()->begin(); itr != events()->end(); ++itr) {
88  const HepMC::GenEvent* genEvt = *itr;
89 
90  // Loop over all truth particles in the event
91  for (const auto& part: *genEvt) {
93 
94  // b-quarks
95  // ==========
96  // Warning: Since no navigation is done, the filter does not distinguish
97  // between the final quark in the decay chain and intermediates
98  // That means the code is NOT appropriate for counting the number
99  // of heavy flavor quarks!
100  if (m_Request_bQuark && std::abs(part->pdg_id())==5 &&
101  part->momentum().perp()>m_bPtMin &&
102  std::abs(part->momentum().pseudoRapidity())<m_bEtaMax) {
103  if (m_RequireTruthJet) {
104  HepMC::FourVector tmp = part->momentum();
105  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
106  for (uint i=0; i<jets.size(); i++) {
107  double dR = (*jets[i])->p4().DeltaR(genpart);
108  if (dR<m_deltaRFromTruth) bPass=true;
109  }
110  } else {
111  bPass = true;
112  }
113  }
114 
115  // c-quarks
116  // ========
117  // Warning: Since no navigation is done, the filter does not distinguish
118  // between the final quark in the decay chain and intermediates
119  // That means the code is NOT appropriate for counting the number
120  // of heavy flavor quarks!
121  if (m_Request_cQuark &&
122  std::abs(part->pdg_id())==4 &&
123  part->momentum().perp()>m_cPtMin &&
124  std::abs(part->momentum().pseudoRapidity())<m_cEtaMax) {
125  if (m_RequireTruthJet) {
126  HepMC::FourVector tmp = part->momentum();
127  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
128  for (uint i=0; i<jets.size(); i++) {
129  double dR = (*jets[i])->p4().DeltaR(genpart);
130  if (dR<m_deltaRFromTruth) cPass=true;
131  }
132  } else {
133  cPass = true;
134  }
135  }
136 
137  // B hadrons
138  // =========
139  if (m_RequestBottom &&
140  isBwithWeakDK(part->pdg_id()) &&
141  part->momentum().perp()>m_bottomPtMin &&
142  std::abs(part->momentum().pseudoRapidity())<m_bottomEtaMax) {
143  if (m_RequireTruthJet) {
144  HepMC::FourVector tmp = part->momentum();
145  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
146  for (uint i=0; i<jets.size(); i++) {
147  double dR = (*jets[i])->p4().DeltaR(genpart);
148  if (dR < m_deltaRFromTruth) BHadronPass=true;
149  }
150  } else {
151  BHadronPass = true;
152  }
153  }
154 
155  // Charm Hadrons
156  // ==============
157  if (m_RequestCharm &&
158  isDwithWeakDK(part->pdg_id()) &&
159  part->momentum().perp()>m_charmPtMin &&
160  std::abs(part->momentum().pseudoRapidity())<m_charmEtaMax) {
161  if (m_RequireTruthJet) {
162  HepMC::FourVector tmp = part->momentum();
163  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
164  for (uint i=0; i<jets.size(); i++) {
165  double dR = (*jets[i])->p4().DeltaR(genpart);
166  if (dR < m_deltaRFromTruth) DHadronPass=true;
167  }
168  } else {
169  DHadronPass = true;
170  }
171  }
172 
173  // Request Specific PDGID
174  // =========================
175  bool pdgok = m_RequestSpecificPDGID &&
176  (part->pdg_id() == m_PDGID ||
177  (m_PDGAntiParticleToo && std::abs(part->pdg_id()) == m_PDGID));
178  if (pdgok && part->momentum().perp() > m_PDGPtMin &&
179  std::abs(part->momentum().pseudoRapidity()) < m_PDGEtaMax) {
180  if (m_RequireTruthJet) {
181  HepMC::FourVector tmp = part->momentum();
182  TLorentzVector genpart(tmp.x(), tmp.y(), tmp.z(), tmp.t());
183  for (size_t i = 0; i < jets.size(); ++i) {
184  double dR = (*jets[i])->p4().DeltaR(genpart);
185  if (dR < m_deltaRFromTruth) PDGIDPass = true;
186  }
187  } else {
188  PDGIDPass = true;
189  }
190  }
191 
192  } //end of particles in one event
193  }
194 
196  pass = BHadronPass || DHadronPass || bPass || cPass || PDGIDPass;
197  if (pass) m_NPass++;
198  if (bPass) m_NbPass++;
199  if (cPass) m_NcPass++;
200  if (BHadronPass) m_NBHadronPass++;
201  if (DHadronPass) m_NDHadronPass++;
202  if (PDGIDPass) m_NPDGIDPass++;
203  setFilterPassed(pass);
204 
205  return StatusCode::SUCCESS;
206 }
207 
208 
209 bool HeavyFlavorHadronFilter::isBwithWeakDK(const int pID) const {
210  int id = std::abs(pID);
211  return ( id == 511 || // B+
212  id == 521 || // B0
213  id == 531 || // Bs
214  id == 541 || // Bc
215  id == 5122 || // Lambda_B
216  id == 5132 || // Xi_b-
217  id == 5232 || // X_b0
218  id == 5112 || // Sigma_b-
219  id == 5212 || // Sigma_b0
220  id == 5222 || // Sigma_b+
221  id == 5332 ); // Omega_B
222 }
223 
224 
225 bool HeavyFlavorHadronFilter::isDwithWeakDK(const int pID) const {
226  int id = std::abs(pID);
227  return ( id == 411 || // D+
228  id == 421 || // D0
229  id == 431 || // Ds
230  id == 4122 || // Lambda_C
231  id == 4132 || // Xi_C^0
232  id == 4232 || // Xi_C^+
233  id == 4212 || // Xi_C^0
234  id == 4322 || // Xi'_C+ This is in fact EM not weak
235  id == 4332); // Omega_C
236 
237 }
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
HeavyFlavorHadronFilter::m_PDGID
int m_PDGID
Definition: HeavyFlavorHadronFilter.h:51
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
HeavyFlavorHadronFilter::filterFinalize
virtual StatusCode filterFinalize()
Definition: HeavyFlavorHadronFilter.cxx:55
HeavyFlavorHadronFilter.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
HeavyFlavorHadronFilter::m_RequireTruthJet
bool m_RequireTruthJet
Definition: HeavyFlavorHadronFilter.h:48
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
HeavyFlavorHadronFilter::m_charmEtaMax
double m_charmEtaMax
Definition: HeavyFlavorHadronFilter.h:33
HeavyFlavorHadronFilter::m_PDGPtMin
double m_PDGPtMin
Definition: HeavyFlavorHadronFilter.h:39
HeavyFlavorHadronFilter::isDwithWeakDK
bool isDwithWeakDK(const int pID) const
Definition: HeavyFlavorHadronFilter.cxx:225
HeavyFlavorHadronFilter::m_NDHadronPass
int m_NDHadronPass
Definition: HeavyFlavorHadronFilter.h:60
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
HeavyFlavorHadronFilter::m_cPtMin
double m_cPtMin
Definition: HeavyFlavorHadronFilter.h:35
HeavyFlavorHadronFilter::m_NPDGIDPass
int m_NPDGIDPass
Definition: HeavyFlavorHadronFilter.h:61
HeavyFlavorHadronFilter::filterEvent
virtual StatusCode filterEvent()
Definition: HeavyFlavorHadronFilter.cxx:66
HeavyFlavorHadronFilter::m_jetEtaMax
double m_jetEtaMax
Definition: HeavyFlavorHadronFilter.h:43
python.DataFormatRates.events
events
Definition: DataFormatRates.py:105
HeavyFlavorHadronFilter::m_RequestBottom
bool m_RequestBottom
Definition: HeavyFlavorHadronFilter.h:45
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
HeavyFlavorHadronFilter::m_Nevt
int m_Nevt
Definition: HeavyFlavorHadronFilter.h:56
GenFilter
Base class for event generator filtering modules.
Definition: GenFilter.h:30
HeavyFlavorHadronFilter::m_NPass
int m_NPass
Definition: HeavyFlavorHadronFilter.h:55
HeavyFlavorHadronFilter::m_PDGEtaMax
double m_PDGEtaMax
Definition: HeavyFlavorHadronFilter.h:40
lumiFormat.i
int i
Definition: lumiFormat.py:92
HeavyFlavorHadronFilter::HeavyFlavorHadronFilter
HeavyFlavorHadronFilter(const std::string &fname, ISvcLocator *pSvcLocator)
Definition: HeavyFlavorHadronFilter.cxx:12
HeavyFlavorHadronFilter::m_RequestSpecificPDGID
bool m_RequestSpecificPDGID
Definition: HeavyFlavorHadronFilter.h:49
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.
HeavyFlavorHadronFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: HeavyFlavorHadronFilter.cxx:43
HeavyFlavorHadronFilter::m_cEtaMax
double m_cEtaMax
Definition: HeavyFlavorHadronFilter.h:37
HeavyFlavorHadronFilter::m_jetPtMin
double m_jetPtMin
Definition: HeavyFlavorHadronFilter.h:42
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
HeavyFlavorHadronFilter::m_bottomEtaMax
double m_bottomEtaMax
Definition: HeavyFlavorHadronFilter.h:34
HeavyFlavorHadronFilter::m_RequestCharm
bool m_RequestCharm
Definition: HeavyFlavorHadronFilter.h:44
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
HeavyFlavorHadronFilter::m_bEtaMax
double m_bEtaMax
Definition: HeavyFlavorHadronFilter.h:38
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
HeavyFlavorHadronFilter::m_bottomPtMin
double m_bottomPtMin
Definition: HeavyFlavorHadronFilter.h:32
HeavyFlavorHadronFilter::m_Request_bQuark
bool m_Request_bQuark
Definition: HeavyFlavorHadronFilter.h:47
HeavyFlavorHadronFilter::m_PDGAntiParticleToo
bool m_PDGAntiParticleToo
Definition: HeavyFlavorHadronFilter.h:50
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
HeavyFlavorHadronFilter::isBwithWeakDK
bool isBwithWeakDK(const int pID) const
Definition: HeavyFlavorHadronFilter.cxx:209
HeavyFlavorHadronFilter::m_Request_cQuark
bool m_Request_cQuark
Definition: HeavyFlavorHadronFilter.h:46
HeavyFlavorHadronFilter::m_bPtMin
double m_bPtMin
Definition: HeavyFlavorHadronFilter.h:36
HeavyFlavorHadronFilter::m_NcPass
int m_NcPass
Definition: HeavyFlavorHadronFilter.h:58
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
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
HeavyFlavorHadronFilter::m_NBHadronPass
int m_NBHadronPass
Definition: HeavyFlavorHadronFilter.h:59
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
HeavyFlavorHadronFilter::m_TruthJetContainerName
std::string m_TruthJetContainerName
Definition: HeavyFlavorHadronFilter.h:52
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
HeavyFlavorHadronFilter::m_deltaRFromTruth
double m_deltaRFromTruth
Definition: HeavyFlavorHadronFilter.h:41
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
HeavyFlavorHadronFilter::m_NbPass
int m_NbPass
Definition: HeavyFlavorHadronFilter.h:57
HeavyFlavorHadronFilter::m_charmPtMin
double m_charmPtMin
Definition: HeavyFlavorHadronFilter.h:31