ATLAS Offline Software
Loading...
Searching...
No Matches
TruthClassificationTool Class Reference

a tool to classify particles based on their type and origin More...

#include <TruthClassificationTool.h>

Inheritance diagram for TruthClassificationTool:
Collaboration diagram for TruthClassificationTool:

Public Member Functions

 TruthClassificationTool (const std::string &type)
virtual StatusCode classify (const xAOD::IParticle &particle, unsigned int &classification) const override
 classify and return unsigned int
virtual StatusCode classify (const xAOD::IParticle &particle, Truth::Type &classification) const override
 classify and return Truth::Type
virtual StatusCode initialize ()
 Dummy implementation of the initialisation function.
virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode classifyElectron (const xAOD::IParticle &electron, Truth::Type &classification) const
 electron classification helper
StatusCode classifyMuon (const xAOD::IParticle &muon, Truth::Type &classification) const
 muon classification helper
bool isPromptElectron (const xAOD::IParticle &electron, bool isTruthParticle, const xAOD::TruthParticle *truthParticle) const
 a helper to check if an electron is prompt
bool isChargeFlipElectron (const xAOD::IParticle &electron, bool isTruthParticle, const xAOD::TruthParticle *truthParticle) const
 a helper to check if an electron has an incorrectly reconstructed charge
bool isChargeFlipMuon (const xAOD::IParticle &muon, bool isTruthParticle, const xAOD::TruthParticle *truthParticle) const
 a helper to check if a muon has an incorrectly reconstructed charge
bool hasBHadronOrigin (int origin) const
 a helper to check if the origin is a b-hadron
bool hasCHadronOrigin (int origin) const
 a helper to check if the origin is a c-hadron
bool hasLightHadronOrigin (int origin) const
 a helper to check if the origin is a light hadron
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

bool m_separateChargeFlipElectrons = false
 separately store charge-flip electrons/muons
bool m_separateChargeFlipMuons = false
bool m_useTruthParticleDecorations {false}
 use truth particle decorations
const SG::AuxElement::ConstAccessor< int > m_truthType {"truthType"}
const SG::AuxElement::ConstAccessor< int > m_truthOrigin {"truthOrigin"}
const SG::AuxElement::ConstAccessor< int > m_truthPdgId {"truthPdgId"}
const SG::AuxElement::ConstAccessor< unsigned int > m_classifierParticleType {"classifierParticleType"}
const SG::AuxElement::ConstAccessor< unsigned int > m_classifierParticleOrigin {"classifierParticleOrigin"}
const SG::AuxElement::ConstAccessor< int > m_firstMotherTruthType {"firstEgMotherTruthType"}
const SG::AuxElement::ConstAccessor< int > m_firstMotherTruthOrigin {"firstEgMotherTruthOrigin"}
const SG::AuxElement::ConstAccessor< int > m_firstMotherPdgId {"firstEgMotherPdgId"}
const SG::AuxElement::ConstAccessor< int > m_lastMotherTruthType {"lastEgMotherTruthType"}
const SG::AuxElement::ConstAccessor< int > m_lastMotherTruthOrigin {"lastEgMotherTruthOrigin"}
const SG::AuxElement::ConstAccessor< int > m_lastMotherPdgId {"lastEgMotherPdgId"}
const SG::AuxElement::ConstAccessor< int > m_fallbackTruthType {"TruthClassifierFallback_truthType"}
const SG::AuxElement::ConstAccessor< int > m_fallbackTruthOrigin {"TruthClassifierFallback_truthOrigin"}
const SG::AuxElement::ConstAccessor< float > m_fallbackDR {"TruthClassifierFallback_dR"}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

a tool to classify particles based on their type and origin

Definition at line 18 of file TruthClassificationTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ TruthClassificationTool()

TruthClassificationTool::TruthClassificationTool ( const std::string & type)
explicit

Definition at line 24 of file TruthClassificationTool.cxx.

25 : asg::AsgTool(type)
26{
27 declareProperty ("separateChargeFlipElectrons", m_separateChargeFlipElectrons, "separate prompt charge-flipped electrons");
28 declareProperty ("separateChargeFlipMuons", m_separateChargeFlipMuons, "separate prompt charge-flipped muons");
29 declareProperty ("useTruthParticleDecorations", m_useTruthParticleDecorations, "use truth particle decorations");
30}
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool m_separateChargeFlipElectrons
separately store charge-flip electrons/muons
bool m_useTruthParticleDecorations
use truth particle decorations

Member Function Documentation

◆ classify() [1/2]

StatusCode TruthClassificationTool::classify ( const xAOD::IParticle & particle,
Truth::Type & classification ) const
overridevirtual

classify and return Truth::Type

Implements ITruthClassificationTool.

Definition at line 43 of file TruthClassificationTool.cxx.

45{
46 const xAOD::TruthParticle *truthParticle = dynamic_cast<const xAOD::TruthParticle *> (&particle);
47 if (dynamic_cast<const xAOD::Electron *> (&particle) || (truthParticle != nullptr && MC::isElectron(truthParticle)))
48 {
49 ANA_CHECK(classifyElectron(particle, classification));
50 }
51 else if (dynamic_cast<const xAOD::Muon *> (&particle) || (truthParticle != nullptr && MC::isMuon(truthParticle)))
52 {
53 ANA_CHECK(classifyMuon(particle, classification));
54 }
55 else
56 {
57 ANA_MSG_ERROR("Only electrons and muons are supported.");
58 return StatusCode::FAILURE;
59 }
60
61 return StatusCode::SUCCESS;
62}
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
#define ANA_CHECK(EXP)
check whether the given expression was successful
StatusCode classifyElectron(const xAOD::IParticle &electron, Truth::Type &classification) const
electron classification helper
StatusCode classifyMuon(const xAOD::IParticle &muon, Truth::Type &classification) const
muon classification helper
bool isElectron(const T &p)
bool isMuon(const T &p)
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
TruthParticle_v1 TruthParticle
Typedef to implementation.
Muon_v1 Muon
Reference the current persistent version:
Electron_v1 Electron
Definition of the current "egamma version".

◆ classify() [2/2]

StatusCode TruthClassificationTool::classify ( const xAOD::IParticle & particle,
unsigned int & classification ) const
overridevirtual

classify and return unsigned int

Implements ITruthClassificationTool.

Definition at line 33 of file TruthClassificationTool.cxx.

35{
36 Truth::Type type = Truth::Type::Unknown;
37 ANA_CHECK(classify(particle, type));
38 classification = static_cast<int>(type);
39 return StatusCode::SUCCESS;
40}
virtual StatusCode classify(const xAOD::IParticle &particle, unsigned int &classification) const override
classify and return unsigned int
Type
truth classification type enum

◆ classifyElectron()

StatusCode TruthClassificationTool::classifyElectron ( const xAOD::IParticle & electron,
Truth::Type & classification ) const
private

electron classification helper

Definition at line 65 of file TruthClassificationTool.cxx.

67{
68
69
70 // Check if xAOD::TruthParticle or if not if it has the TruthParticleLink
71 const xAOD::TruthParticle *truthParticle = dynamic_cast<const xAOD::TruthParticle *> (&electron);
72 bool isTruthParticle{};
73 if (truthParticle == nullptr)
74 {
75 // need to find the truth particle
76 truthParticle = xAOD::TruthHelpers::getTruthParticle(electron);
77 }
78 else
79 {
80 isTruthParticle = true;
81 }
82
83 if (!m_truthPdgId.isAvailable(electron) && !isTruthParticle)
84 {
85 ANA_MSG_ERROR("Electron does not have the 'truthPdgId' decoration.");
86 return StatusCode::FAILURE;
87 }
88
89 if (!m_firstMotherTruthType.isAvailable(electron)
90 || !m_firstMotherTruthOrigin.isAvailable(electron)
91 || !m_firstMotherPdgId.isAvailable(electron))
92 {
93 ANA_MSG_ERROR("Electron does not have one or more 'firstEgMother' decorations.");
94 return StatusCode::FAILURE;
95 }
96
97 int type = isTruthParticle ? m_classifierParticleType(electron) : m_truthType(electron);
98 int origin = isTruthParticle ? m_classifierParticleOrigin(electron) : m_truthOrigin(electron);
99 int pdgId = isTruthParticle ? truthParticle->pdgId() : m_truthPdgId(electron);
100 if (m_useTruthParticleDecorations && !isTruthParticle)
101 {
102 type = m_classifierParticleType(*truthParticle);
103 origin = m_classifierParticleOrigin(*truthParticle);
104 }
105
106 int firstMotherType = m_firstMotherTruthType(electron);
107 int firstMotherOrigin = m_firstMotherTruthOrigin(electron);
108 int firstMotherPdgId = m_firstMotherPdgId(electron);
109 // not in the smart slimming list, thus only in few derivations
110 int lastMotherType = m_lastMotherTruthType.isAvailable(electron) ? m_lastMotherTruthType(electron) : -1;
111 int lastMotherOrigin = m_lastMotherTruthOrigin.isAvailable(electron) ? m_lastMotherTruthOrigin(electron) : -1;
112 int lastMotherPdgId = m_lastMotherPdgId.isAvailable(electron) ? m_lastMotherPdgId(electron) : -1;
113 // fallback recorations
114 int fallbackType{-1};
115 if (m_fallbackTruthType.isAvailable(electron) && m_fallbackDR.isAvailable(electron))
116 {
117 fallbackType = m_fallbackDR(electron) < 0.05 ? m_fallbackTruthType(electron) : -1;
118 }
119
120 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
121 // Prompt Photon Conversions
122 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
123
124 // gamma -> e+ e-
127 && firstMotherType == MCTruthPartClassifier::IsoPhoton && firstMotherOrigin == MCTruthPartClassifier::PromptPhot)
128 {
129 classification = Truth::Type::PromptPhotonConversion;
130 return StatusCode::SUCCESS;
131 }
132
133 // H -> gamma gamma, gamma -> e+ e-
135 && firstMotherType == MCTruthPartClassifier::IsoPhoton && firstMotherOrigin == MCTruthPartClassifier::Higgs)
136 {
137 classification = Truth::Type::PromptPhotonConversion;
138 return StatusCode::SUCCESS;
139 }
140
141 // bkg electrons from bkg photons
143 && firstMotherType == MCTruthPartClassifier::UnknownPhoton && firstMotherOrigin == MCTruthPartClassifier::NonDefined)
144 {
145 classification = Truth::Type::PromptPhotonConversion;
146 return StatusCode::SUCCESS;
147 }
148
149 // bkg photon from UndrPhot; (Here there is a generator level photon (not gen electron ) that later converts)
152 && firstMotherType == MCTruthPartClassifier::BkgPhoton && firstMotherOrigin == MCTruthPartClassifier::UndrPhot)
153 {
154 classification = Truth::Type::PromptPhotonConversion;
155 return StatusCode::SUCCESS;
156 }
157
158 // type = 16 and origin = 38 (again, this is a photon)
160 {
161 classification = Truth::Type::PromptPhotonConversion;
162 return StatusCode::SUCCESS;
163 }
164
165 // Is an isolated photon
166 if (type == MCTruthPartClassifier::IsoPhoton && pdgId == 22)
167 {
168 classification = Truth::Type::PromptPhotonConversion;
169 return StatusCode::SUCCESS;
170 }
171
172 // electrons from ElMagProc
173 // when FSR, a better classification can be made with the fall back vars
175 && firstMotherType == MCTruthPartClassifier::UnknownPhoton && firstMotherOrigin == MCTruthPartClassifier::NonDefined)
176 {
177 classification = Truth::Type::PromptPhotonConversion;
178 return StatusCode::SUCCESS;
179 }
181 && firstMotherType == MCTruthPartClassifier::NonIsoPhoton && firstMotherOrigin == MCTruthPartClassifier::FSRPhot)
182 {
183 classification = Truth::Type::PromptPhotonConversion;
184 return StatusCode::SUCCESS;
185 }
186
187 // TODO: Message from Otilia: """
188 // but it's not clear if these electrons are really
189 // "fakes" or they should go in the real category (we don't know from where
190 // this photon is coming...). I would say more truth studies should be done.
191 // """
192 // Hence the warning message...
194 && firstMotherType == MCTruthPartClassifier::Unknown && firstMotherOrigin == MCTruthPartClassifier::ZBoson)
195 {
196 ANA_MSG_WARNING("Electron identified as from a PromptPhotonConversion, "
197 "but this type of electron needs further study!");
198 classification = Truth::Type::PromptPhotonConversion;
199 return StatusCode::SUCCESS;
200 }
201
202 // when always a photon (last mum is a photon, even if the truth PDG is 11 and first mum PDG is 11 ):
203 // very likely these are internal conversions; last_mum_pdgId == 22 important as the cases with last_mum_pdgId == 11 were found to be quite often close to a true electron
206 && std::abs(firstMotherPdgId) == 11 && std::abs(pdgId) == 11)
207 { // electron
208 if(lastMotherType == -1 || (lastMotherType == MCTruthPartClassifier::GenParticle && (lastMotherPdgId == 22 || std::abs(lastMotherPdgId) == 11)))
209 {
210 // lastMotherType == -1 ==> when the last mother info is not stored in the derivations
211 classification = Truth::Type::PromptPhotonConversion;
212 return StatusCode::SUCCESS;
213 }
214 }
215
216
217 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
218 // Is muon reco as electron or ele radiated by muons
219 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
220
222 && (origin == MCTruthPartClassifier::Mu || firstMotherOrigin == MCTruthPartClassifier::Mu))
223 {
224 classification = Truth::Type::ElectronFromMuon;
225 return StatusCode::SUCCESS;
226 }
227
228 if (type == MCTruthPartClassifier::BkgElectron && firstMotherOrigin == MCTruthPartClassifier::Mu)
229 {
230 classification = Truth::Type::ElectronFromMuon;
231 return StatusCode::SUCCESS;
232 }
233
235 classification = Truth::Type::ElectronFromMuon;
236 return StatusCode::SUCCESS;
237 }
238
239
240 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
241 // Tau decays
242 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
243
244 // Non-isolated electron/photon from tau decay
247 {
248 classification = Truth::Type::TauDecay;
249 return StatusCode::SUCCESS;
250 }
251
252 // tau -> tau gamma, gamma -> e+ e-, etc
253 if ((firstMotherType == MCTruthPartClassifier::NonIsoElectron || firstMotherType == MCTruthPartClassifier::NonIsoPhoton)
254 && firstMotherOrigin == MCTruthPartClassifier::TauLep)
255 {
256 classification = Truth::Type::TauDecay;
257 return StatusCode::SUCCESS;
258 }
259
260
261 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
262 // Light hadron sources
263 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
264
266 {
267 classification = Truth::Type::LightFlavorDecay;
268 return StatusCode::SUCCESS;
269 }
270
271 if (firstMotherType == MCTruthPartClassifier::BkgElectron)
272 {
274 && (hasLightHadronOrigin(origin) || hasLightHadronOrigin(firstMotherOrigin)))
275 {
276 classification = Truth::Type::LightFlavorDecay;
277 return StatusCode::SUCCESS;
278 }
279 }
280
282 {
283 if (origin == MCTruthPartClassifier::DalitzDec || firstMotherOrigin == MCTruthPartClassifier::DalitzDec) {
284 classification = Truth::Type::LightFlavorDecay;
285 return StatusCode::SUCCESS;
286 }
287 if (hasLightHadronOrigin(origin) || hasLightHadronOrigin(firstMotherOrigin)) {
288 classification = Truth::Type::LightFlavorDecay;
289 return StatusCode::SUCCESS;
290 }
291 }
292
294 && (hasLightHadronOrigin(origin) || hasLightHadronOrigin(firstMotherOrigin)))
295 {
296 classification = Truth::Type::LightFlavorDecay;
297 return StatusCode::SUCCESS;
298 }
299
300
301 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
302 // From B hadron
303 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
304
305 if (hasBHadronOrigin(origin) || hasBHadronOrigin(firstMotherOrigin))
306 {
307 classification = Truth::Type::BHadronDecay;
308 return StatusCode::SUCCESS;
309 }
310
311 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
312 // From C hadron
313 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
314
315 if (type != MCTruthPartClassifier::IsoElectron && (hasCHadronOrigin(origin) || hasCHadronOrigin(firstMotherOrigin)))
316 {
317 classification = Truth::Type::CHadronDecay;
318 return StatusCode::SUCCESS;
319 }
320
321
322 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
323 // Prompt / Isolated electrons
324 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
325
326 if (isPromptElectron(electron, isTruthParticle, truthParticle))
327 {
328 if (m_separateChargeFlipElectrons && isChargeFlipElectron(electron, isTruthParticle, truthParticle))
329 {
330 classification = Truth::Type::ChargeFlipIsoElectron;
331 return StatusCode::SUCCESS;
332 }
333
334 classification = Truth::Type::IsoElectron;
335 return StatusCode::SUCCESS;
336 }
337
338
339 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
340 // Unknown & known Unknown
341 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
342
343 // TODO: See if we want this or not. Now we check if this is something we are
344 // able to classify or not. Note that this might be a bit dangerous because
345 // the reasons for not having origin and status codes might be complex. The
346 // main idea is to weed out things we don't have a hope of classifying due to
347 // missing or unknown information.
348 static const SG::ConstAccessor<int> statusAcc("status");
349 bool stable = (truthParticle != nullptr && statusAcc.isAvailable(*truthParticle)) ? MC::isStable(truthParticle) : false;
350
351
352 if (origin == MCTruthPartClassifier::NonDefined && firstMotherOrigin == MCTruthPartClassifier::NonDefined)
353 {
354 if (!stable)
355 {
357 {
358 classification = Truth::Type::KnownUnknown;
359 return StatusCode::SUCCESS;
360 }
361 } else {
362 if ((type == MCTruthPartClassifier::Unknown && firstMotherType == MCTruthPartClassifier::Unknown)
364 {
365 classification = Truth::Type::KnownUnknown;
366 return StatusCode::SUCCESS;
367 }
368
370 {
371 classification = Truth::Type::KnownUnknown;
372 return StatusCode::SUCCESS;
373 }
374 }
375 }
376
377 // non-iso photons with no info available to classify
378 if (type == MCTruthPartClassifier::NonIsoPhoton && origin == MCTruthPartClassifier::FSRPhot && pdgId == 22
379 && firstMotherType == 0 && firstMotherOrigin == 0 && firstMotherPdgId == 0)
380 {
381 if (lastMotherType == -1 || (lastMotherType == 0 && lastMotherOrigin == 0 && lastMotherPdgId == 0))
382 { // last_firstMotherType == -1 ==> when the last_mum info is not stored in the derivations
383 classification = Truth::Type::KnownUnknown;
384 return StatusCode::SUCCESS;
385 }
386 }
387
388 ANA_MSG_WARNING("Electron type unknown: type = " << type << ", origin = " << origin);
389
390 // debug printout
391 if (truthParticle != nullptr)
392 {
393 const xAOD::TruthParticle *parent = truthParticle;
394 ATH_MSG_DEBUG("Unknown particle decay chain (approximate):");
395 std::string out = "\t";
396 while (parent != nullptr)
397 {
398 out.append(std::to_string(parent->pdgId()));
399 parent = parent->parent(0); //AV: Note the ambiguity: only the first particle is considered.
400 if (parent) out.append(" -> ");
401 }
402 ATH_MSG_DEBUG(out);
403 }
404
405 classification = Truth::Type::Unknown;
406 return StatusCode::SUCCESS;
407}
#define ATH_MSG_DEBUG(x)
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
const SG::AuxElement::ConstAccessor< int > m_lastMotherTruthOrigin
const SG::AuxElement::ConstAccessor< int > m_lastMotherTruthType
const SG::AuxElement::ConstAccessor< int > m_truthPdgId
bool hasCHadronOrigin(int origin) const
a helper to check if the origin is a c-hadron
const SG::AuxElement::ConstAccessor< int > m_truthOrigin
const SG::AuxElement::ConstAccessor< float > m_fallbackDR
bool isChargeFlipElectron(const xAOD::IParticle &electron, bool isTruthParticle, const xAOD::TruthParticle *truthParticle) const
a helper to check if an electron has an incorrectly reconstructed charge
bool hasBHadronOrigin(int origin) const
a helper to check if the origin is a b-hadron
bool isPromptElectron(const xAOD::IParticle &electron, bool isTruthParticle, const xAOD::TruthParticle *truthParticle) const
a helper to check if an electron is prompt
const SG::AuxElement::ConstAccessor< int > m_firstMotherPdgId
const SG::AuxElement::ConstAccessor< int > m_firstMotherTruthOrigin
const SG::AuxElement::ConstAccessor< unsigned int > m_classifierParticleOrigin
const SG::AuxElement::ConstAccessor< int > m_firstMotherTruthType
bool hasLightHadronOrigin(int origin) const
a helper to check if the origin is a light hadron
const SG::AuxElement::ConstAccessor< int > m_truthType
const SG::AuxElement::ConstAccessor< int > m_fallbackTruthType
const SG::AuxElement::ConstAccessor< int > m_lastMotherPdgId
const SG::AuxElement::ConstAccessor< unsigned int > m_classifierParticleType
XAOD_AUXDATA_DEPRECATED bool isAvailable(const std::string &name, const std::string &clsname="") const
Check if a user property is available for reading or not.
int pdgId() const
PDG ID code.
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
Return the truthParticle associated to the given IParticle (if any)

◆ classifyMuon()

StatusCode TruthClassificationTool::classifyMuon ( const xAOD::IParticle & muon,
Truth::Type & classification ) const
private

muon classification helper

Definition at line 410 of file TruthClassificationTool.cxx.

412{
413
414
415 // Check if xAOD::TruthParticle or if not if it has the TruthParticleLink
416 const xAOD::TruthParticle *truthParticle
417 = dynamic_cast<const xAOD::TruthParticle *> (&muon);
418 bool isTruthParticle{};
419 if (truthParticle == nullptr)
420 {
421 // need to find the truth particle
422 truthParticle = xAOD::TruthHelpers::getTruthParticle(muon);
423 }
424 else
425 {
426 isTruthParticle = true;
427 }
428
429 int type = isTruthParticle ? m_classifierParticleType(muon) : m_truthType(muon);
430 int origin = isTruthParticle ? m_classifierParticleOrigin(muon) : m_truthOrigin(muon);
431 if (m_useTruthParticleDecorations && !isTruthParticle && truthParticle != nullptr)
432 {
433 type = m_classifierParticleType(*truthParticle);
434 origin = m_classifierParticleOrigin(*truthParticle);
435 }
436
437 // fallback recorations
438 int fallbackType{-1};
439 if (m_fallbackTruthType.isAvailable(muon) && m_fallbackDR.isAvailable(muon))
440 {
441 fallbackType = m_fallbackDR(muon) < 0.05 ? m_fallbackTruthType(muon) : -1;
442 }
443
444 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
445 // muons from taus
446 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
447
449 {
450 classification = Truth::Type::TauDecay;
451 return StatusCode::SUCCESS;
452 }
453
454
455 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
456 // Light hadron sources
457 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
458
460 {
461 classification = Truth::Type::LightFlavorDecay;
462 return StatusCode::SUCCESS;
463 }
464
465 if (type == MCTruthPartClassifier::Hadron || fallbackType == MCTruthPartClassifier::Hadron )
466 {
467 classification = Truth::Type::LightFlavorDecay;
468 return StatusCode::SUCCESS;
469 }
470
471
472 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
473 // From B hadron
474 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
475
476 if (hasBHadronOrigin(origin))
477 {
478 classification = Truth::Type::BHadronDecay;
479 return StatusCode::SUCCESS;
480 }
481
482 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
483 // From C hadron
484 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
485
487 {
488 classification = Truth::Type::CHadronDecay;
489 return StatusCode::SUCCESS;
490 }
491 // TODO:: There is a comment in the example code about J/psi but there is a
492 // separate origin code for that: `MCTruthPartClassifier::JPsi == 28.` --> this might not be in all samples/generators?
493
494
495 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
496 // prompt muons
497 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
498 // Check if the type of muon is IsoMuon(6) and whether the origin
499 // of the muon is from a prompt source
500 static const std::set<int> promptOrigin({
501 MCTruthPartClassifier::SingleMuon, // Single muon (origin = 2) from muon twiki
509 MCTruthPartClassifier::CCbarMeson, // PromptQuarkoniumDecay
512 });
513 if (type == MCTruthPartClassifier::IsoMuon && isInSet(origin, promptOrigin))
514 {
515 //separate charge-flip muons
516 if (m_separateChargeFlipMuons && isChargeFlipMuon(muon, isTruthParticle, truthParticle))
517 {
518 classification = Truth::Type::ChargeFlipMuon;
519 return StatusCode::SUCCESS;
520 }
521 classification = Truth::Type::PromptMuon;
522 return StatusCode::SUCCESS;
523 }
524
525
526 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
527 // Known Unknown
528 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
529
531 {
532 classification = Truth::Type::KnownUnknown;
533 return StatusCode::SUCCESS;
534 }
535
536 static const SG::ConstAccessor<int> statusAcc("status");
537 bool stable = (truthParticle != nullptr && statusAcc.isAvailable(*truthParticle)) ? MC::isStable(truthParticle) : false;
538
539 if (!stable) {
541 { // Data
542 classification = Truth::Type::KnownUnknown;
543 return StatusCode::SUCCESS;
544 }
545 if (type == -99999 && origin == -99999)
546 { // MC - no status = 1 truth particle associated with the primary track
547 classification = Truth::Type::KnownUnknown;
548 return StatusCode::SUCCESS;
549 }
550 }
551
552 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
553 // NonMuonlike
554 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
555 // Check if the type of muon is related to electrons, ie IsoElectron (2) or NonIsoElectron (3) or BkgElectron (4)
557 {
558 classification = Truth::Type::NonMuonlike;
559 return StatusCode::SUCCESS;
560 }
561
562 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
563 // TauLike, BHadLike, CHadLike
564 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
565 // Check if the matched parent of truth muon fall into these 3 xxxLike
566 // Only truth muon with one matched parent is considered
567 // If parent is tau, the muons is TauLike
568 // If parent is bhadron/b quark, the muons is BHadLike
569 // If parent is chadron/c quark, the muons is CHadLike
571 if( truthParticle != nullptr && truthParticle->nParents() == 1 && truthParticle->parent(0) != nullptr){
572 const xAOD::TruthParticle *parent = truthParticle->parent(0);
573 int parent_pdgid = parent->pdgId();
574 if(parent->isTau()){
575 classification = Truth::Type::TauDecayLike;
576 ATH_MSG_WARNING("Muon type taudecaylike: type = " << type << ", origin = " << origin << ", parent = " << parent_pdgid) ;
577 return StatusCode::SUCCESS;
578 }
579 if(parent->isBottomHadron() || parent->hasBottom()){
580 classification = Truth::Type::BHadronDecayLike;
581 ATH_MSG_WARNING("Muon type bhadrondecaylike: type = " << type << ", origin = " << origin << ", parent = " << parent_pdgid) ;
582 return StatusCode::SUCCESS;
583 }
584 if(parent->isCharmHadron() || parent->hasCharm()){
585 if( (parent_pdgid / 1000) % 10 != 0 || (parent_pdgid / 100) % 10 != 4 || (parent_pdgid / 10) % 10 != 4){ // to exclude ccbarmeson
586 classification = Truth::Type::CHadronDecayLike;
587 ATH_MSG_WARNING("Muon type chadrondecaylike: type = " << type << ", origin = " << origin << ", parent = " << parent_pdgid) ;
588 return StatusCode::SUCCESS;
589 }
590 }
591 }
592 }
593
594 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
595 // Unknown
596 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
597 classification = Truth::Type::Unknown;
598 ATH_MSG_WARNING("Muon type unknown: type = " << type << ", origin = " << origin) ;
599
600 return StatusCode::SUCCESS;
602}
#define ATH_MSG_WARNING(x)
if(febId1==febId2)
bool isChargeFlipMuon(const xAOD::IParticle &muon, bool isTruthParticle, const xAOD::TruthParticle *truthParticle) const
a helper to check if a muon has an incorrectly reconstructed charge
const TruthParticle_v1 * parent(size_t i) const
Retrieve the i-th mother (TruthParticle) of this TruthParticle.
size_t nParents() const
Number of parents of this particle.

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::TEvent, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }
ServiceHandle< StoreGateSvc > & evtStore()

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::TEvent, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ hasBHadronOrigin()

bool TruthClassificationTool::hasBHadronOrigin ( int origin) const
private

a helper to check if the origin is a b-hadron

Definition at line 731 of file TruthClassificationTool.cxx.

732{
733 static const std::set<int> b_hadrons({
737 });
738 return isInSet(origin, b_hadrons);
739}

◆ hasCHadronOrigin()

bool TruthClassificationTool::hasCHadronOrigin ( int origin) const
private

a helper to check if the origin is a c-hadron

Definition at line 742 of file TruthClassificationTool.cxx.

742 {
743 static const std::set<int> c_hadrons({
747 });
748 return isInSet(origin, c_hadrons);
749}

◆ hasLightHadronOrigin()

bool TruthClassificationTool::hasLightHadronOrigin ( int origin) const
private

◆ initialize()

virtual StatusCode asg::AsgTool::initialize ( void )
inlinevirtualinherited

Dummy implementation of the initialisation function.

It's here to allow the dual-use tools to skip defining an initialisation function. Since many are doing so...

Reimplemented in asg::DataHandleTestTool, asg::UnitTestTool1, asg::UnitTestTool1A, asg::UnitTestTool2, asg::UnitTestTool3, AsgDeadHVCellRemovalTool, AsgElectronChargeIDSelectorTool, AsgElectronEfficiencyCorrectionTool, AsgElectronIsEMSelector, AsgElectronLikelihoodTool, AsgElectronSelectorTool, AsgForwardElectronIsEMSelector, AsgForwardElectronLikelihoodTool, AsgHelloTool, AsgPhotonEfficiencyCorrectionTool, AsgPhotonIsEMSelector, AthAsgExUnittestTool, AthONNX::JSSMLTool, AthOnnx::OnnxRuntimeInferenceTool, AthOnnx::OnnxRuntimeSessionToolCPU, AthOnnx::OnnxRuntimeSessionToolCUDA, BaseFakeBkgTool, BDTVertexWeightCalculator, BJetCorrectionTool, BookkeeperDumperTool, BookkeeperTool, BoostedJetTaggerTool, BTaggingEfficiencyJsonTool, BTaggingEfficiencyTool, BTaggingEigenVectorRecompositionTool, BTaggingSelectionJsonTool, BTaggingSelectionTool, BTaggingTruthTaggingTool, CaloClusterConstituentsOrigin, CenterOfMassShapesTool, ChargedHadronSubtractionTool, ClusterAtEMScaleTool, ClusterAtMLScaleTool, ClusterMatching::CaloClusterMatchingTool, columnar::ConfigurableColumnExampleTool, columnar::LinkColumnExampleTool, columnar::ModularExampleTool, columnar::MomentumAccessorExampleTool, columnar::OptionalColumnExampleTool, columnar::SimpleSelectorExampleTool, columnar::StringExampleTool, columnar::VariantExampleTool, columnar::VectorExampleTool, ConstitTimeCutTool, ConstituentSubtractorTool, CopyTruthJetParticles, CopyTruthParticles, CorrectPFOTool, CP::ApplyE2YFakeRate, CP::ApplyFakeFactor, CP::AsgFlagSelectionTool, CP::AsgMaskSelectionTool, CP::AsgMassSelectionTool, CP::AsgNumDecorationSelectionTool< T >, CP::AsgNumDecorationSelectionTool< int >, CP::AsgNumDecorationSelectionTool< uint8_t >, CP::AsgPtEtaSelectionTool, CP::AsymptMatrixTool, CP::BaseFakeBkgTool, CP::BaseLinearFakeBkgTool, CP::EgammaCalibrationAndSmearingTool, CP::EgammaIsGoodOQSelectionTool, CP::ElectronChargeEfficiencyCorrectionTool, CP::ElectronLRTOverlapRemovalTool, CP::FFJetSmearingTool, CP::FJvtEfficiencyTool, CP::FJvtSelectionTool, CP::IsolationCloseByCorrectionTool, CP::IsolationCorrectionTool, CP::IsolationHelper, CP::IsolationLowPtPLVTool, CP::IsolationSelectionTool, CP::JetQGTagger, CP::JetQGTaggerBDT, CP::JetTileCorrectionTool, CP::JvtEfficiencyTool, CP::JvtEfficiencyToolBase, CP::JvtSelectionTool, CP::JvtSelectionToolBase, CP::LhoodMM_tools, CP::MuonCalibIntHighpTSmearTool, CP::MuonCalibIntSagittaTool, CP::MuonCalibIntScaleSmearTool, CP::MuonCalibTool, CP::MuonEfficiencyScaleFactors, CP::MuonLRTOverlapRemovalTool, CP::MuonSelectionTool, CP::MuonTriggerScaleFactors, CP::MVATrackVertexAssociationTool, CP::NNJvtEfficiencyTool, CP::NNJvtSelectionTool, CP::PhotonPointingTool, CP::PhotonVertexSelectionTool, CP::PileupReweightingTool, CP::TrackVertexAssociationTool, D3PD::D3PDMCTruthClassifier, Diagram, DiTauMassTools::MissingMassTool, DiTauRecTools::DiTauDiscriminantTool, DiTauRecTools::DiTauIDVarCalculator, DiTauRecTools::DiTauOnnxDiscriminantTool, dRMatchingTool, ECUtils::EventCleaningTool, EfficiencyResponseHistos, EGammaAmbiguityTool, egammaMVACalibTool, EL::UnitTestTool, ElectronPhotonVariableCorrectionBase, ElectronPhotonVariableCorrectionTool, EnergyCorrelatorGeneralizedRatiosTool, EnergyCorrelatorGeneralizedTool, EnergyCorrelatorRatiosTool, EnergyCorrelatorTool, EnhancedBiasWeighter, EtaJESCalibStep, EventDensityTool, EventShapeCopier, ExtendTrackToLayerTool, FastJetInterfaceTool, FlavorTagDiscriminants::DL2Tool, FlavorTagDiscriminants::HbbTagTool, FlavorTagDiscriminants::TrackClassifier, FlavorTagDiscriminants::VRJetOverlapDecoratorTool, FlavorTagInference::GNNTool, FlavorTagInference::MultifoldGNNTool, FSR::FsrPhotonTool, GoodRunsListSelectionTool, GSCCalibStep, HI::HIEventSelectionTool, HI::HIPileupTool, HI::HIVertexSelectionTool, HIClusterSubtraction, HIEfficiencyResponseHistos, HIEventShapeFillerTool, HIEventShapeJetIteration, HIEventShapeMapTool, HIEventShapeSummaryTool, HiggsTruthCategoryTool, HIJetClusterIndexAssociationTool, HIJetClusterSubtractorTool, HIJetConstituentModifierTool, HIJetConstituentSubtractionTool, HIJetDRAssociationTool, HIJetMaxOverMeanTool, HIJetSignificanceTool, HIJetUEMonitoring, HistoDefinitionTool, HistoGroupBase, HistosForJetSelection, HIUEModulatorTool, IDTPM::DeltaRMatchingToolBase< T, R >, IDTPM::DeltaRMatchingToolBase< xAOD::TrackParticle >, IDTPM::DeltaRMatchingToolBase< xAOD::TrackParticle, xAOD::TruthParticle >, IDTPM::DeltaRMatchingToolBase< xAOD::TruthParticle, xAOD::TrackParticle >, IDTPM::EFTrackMatchingTool, IDTPM::JsonPlotsDefReadTool, IDTPM::OfflineTrackQualitySelectionTool, IDTPM::RoiSelectionTool, IDTPM::StableDeltaRMatchingTool< T, R >, IDTPM::StableDeltaRMatchingTool< xAOD::TrackParticle, xAOD::TrackParticle >, IDTPM::StableDeltaRMatchingTool< xAOD::TrackParticle, xAOD::TruthParticle >, IDTPM::StableDeltaRMatchingTool< xAOD::TruthParticle, xAOD::TrackParticle >, IDTPM::TrackAnalysisInfoWriteTool, IDTPM::TrackObjectSelectionTool, IDTPM::TrackQualitySelectionTool, IDTPM::TrackRoiSelectionTool, IDTPM::TrackTruthMatchingTool, IDTPM::TruthQualitySelectionTool, IDTPM::TruthTrackMatchingTool, IDTPM::VertexQualitySelectionTool, IDTPM::VertexRoiSelectionTool, IHIEventShapeMapTool, InDet::InclusiveTrackFilterTool, InDet::InDetHardScatterSelectionTool, InDet::InDetSecVtxTrackSelectionTool, InDet::InDetTrackBiasingTool, InDet::InDetTrackSelectionTool, InDet::InDetTrackSmearingTool, InDet::InDetTrackSystematicsTool, InDet::InDetTrackTruthFilterTool, InDet::InDetTrackTruthOriginTool, InDet::InDetUsedInFitTrackDecoratorTool, InDet::JetTrackFilterTool, InDetGNNHardScatterSelection::GNNTool, InDetSecVtxTruthMatchTool, InDetVertexTruthMatchTool, InSituCalibStep, JetAttributeHisto, JetAttributeRatioSelector, JetAttributeSelector, JetBadChanCorrTool, JetBalancePFlowJvtTool, JetBottomUpSoftDrop, JetCalibrationTool, JetCalibTool, JetCaloCellQualityTool, JetCaloEnergies, JetCaloQualityTool, JetCaloQualityToolFE, JetCleaningTool, JetClusterer, JetClustererByVertex, JetClusterMomentsTool, JetConstitFourMomTool, JetConstituentFrac, JetConstituentModSequence, JetConstituentsRetriever, JetContainerHistoFiller, JetCopier, JetDRTrackAssocTool, JetECPSFractionTool, JetEMScaleMomTool, JetEventSelector, JetFinder, JetForwardJvtTool, JetForwardJvtToolBDT, JetForwardPFlowJvtTool, JetFromPseudojet, JetGrooming::JetGroomer, JetGrooming::JetTrimming, JetGrooming::RecSoftDrop, JetGrooming::SoftDrop, JetGroomMRatio, JetHelper::HistoInput1D, JetHelper::HistoInput2D, JetHelper::HistoInput3D, JetHelper::VarTool, JetHistoBase, JetInputElRemovalTool, JetIsolationTool, JetLArHVTool, JetModifiedMassDrop, JetOriginCorrectionTool, JetParticleAssociation, JetPileupLabelingTool, JetPileupTag::JetVertexNNTagger, JetPruner, JetPseudojetCopier, JetPseudojetRetriever, JetPtAssociationTool, JetQGTaggerVariableTool, JetQuarkChargeLabelingTool, JetReclusterer, JetReclusteringTool, JetRecTool, JetRecursiveSoftDrop, JetSelectorAttribute, JetSelectorAttributeRunII, JetSoftDrop, JetSplitter, JetSubStructureMomentToolsBase, JetToolRunner, JetTrackMomentsTool, JetTrackSumMomentsTool, JetTrimmer, JetTruthLabelingTool, JetTruthParticleSelectorTool, JetUncertaintiesTool, JetUsedInFitTrackDecoratorTool, JetVertexFractionTool, JetVertexTaggerTool, JetVoronoiDiagramHelpers::Diagram, JetVoronoiMomentsTool, JetWidthTool, JMSCalibStep, JSSTaggerBase, JSSTaggerUtils, JSSWTopTaggerANN, JSSWTopTaggerDNN, KTSplittingScaleTool, LeadingJetsRelations, LVL1::L1CaloCells2TriggerTowers, LVL1::L1CaloFcal23Cells2RxMappingTool, LVL1::L1CaloLArTowerEnergy, LVL1::L1CaloMonitoringCaloTool, LVL1::L1CaloOfflineTriggerTowerTools, LVL1::L1CaloTTIdTools, LVL1::L1CaloxAODOfflineTriggerTowerTools, LVL1::TrigT1CaloMonErrorTool, LVL1::TrigT1CaloMonErrorToolV1, LVL1BS::PpmByteStreamReadV1V2Tool, LVL1BS::TrigT1CaloDataAccessV2, MBTSTimeFilterTool, MCTruthClassifier, met::ColumnarMETMaker, met::METAssociationTool, met::METAssociator, met::METBuilderTool, met::METCaloRegionsTool, met::METEgammaAssociator, met::METElectronAssociator, met::METJetAssocTool, met::METJetTool, met::METMaker, met::METMuonAssociator, met::METNet, met::METPhotonAssociator, met::METRecoTool, met::METRefinerTool, met::METRegionsTool, met::METSignificance, met::METSoftAssociator, met::METSoftTermsTool, met::METSystematicsTool, met::METTauAssociator, met::METTrackFilterTool, met::METTruthAssociator, met::METTruthTool, MissingCellListTool, MvaTESEvaluator, MvaTESVariableDecorator, NSubjettinessRatiosTool, NSubjettinessTool, ORUtils::BaseOverlapTool, ORUtils::OverlapRemovalTool, PanTau::PanTauProcessor, PanTau::Tool_DecayModeDeterminator, PanTau::Tool_DetailsArranger, PanTau::Tool_FeatureExtractor, PanTau::Tool_InformationStore, PanTau::Tool_InputConverter, PanTau::Tool_ModeDiscriminator, PanTau::Tool_TauConstituentGetter, PanTau::Tool_TauConstituentSelector, ParticleJetDeltaRLabelTool, ParticleJetGhostLabelTool, ParticleScaleFactorTool, PDFWeight, Pileup1DResidualCalibStep, PileupAreaCalibStep, PMGTools::PMGCrossSectionTool, PMGTools::PMGDecayProductsSelectionTool, PMGTools::PMGHFProductionFractionTool, PMGTools::PMGSherpa22VJetsWeightTool, PMGTools::PMGSherpaVjetsSysTool, PMGTools::PMGTruthWeightTool, PuppiWeightTool, QwTool, Ringer::AsgRingerSelectorTool, SimpleMuonTriggerScaleFactors, SmearingCalibStep, SmoothedTopTagger, SmoothedWZTagger, SoftKillerWeightTool, ST::SUSYObjDef_xAOD, TauAnalysisTools::BuildTruthTaus, TauAnalysisTools::CommonDiTauEfficiencyTool, TauAnalysisTools::CommonDiTauSmearingTool, TauAnalysisTools::CommonEfficiencyTool, TauAnalysisTools::CommonSmearingTool, TauAnalysisTools::DiTauEfficiencyCorrectionsTool, TauAnalysisTools::DiTauSelectionTool, TauAnalysisTools::DiTauSmearingTool, TauAnalysisTools::DiTauTruthMatchingTool, TauAnalysisTools::TauEfficiencyCorrectionsTool, TauAnalysisTools::TauHFVetoTool, TauAnalysisTools::TauSelectionTool, TauAnalysisTools::TauSmearingTool, TauAnalysisTools::TauTruthMatchingTool, TauAnalysisTools::TauTruthTrackMatchingTool, TauAODMuonRemovalTool, TauCalibrateLC, TauCombinedTES, TauDecayModeNNClassifier, TauElectronVetoVariables, TauEleOverlapChecker, TauGNNEvaluator, TauJetRNNEvaluator, TauPi0CreateROI, TauPi0ScoreCalculator, TauRecToolBase, tauRecTools::TauTrackRNNClassifier, tauRecTools::TrackRNN, TauShotFinder, TauTrackFinder, TauVertexedClusterDecorator, TauVertexFinder, TauVertexVariables, TauWPDecorator, TrackTruthSelectionTool, TrackVertexAssociationTool, Trig::DRScoringTool, Trig::EgammaDRScoringTool, Trig::IParticleRetrievalTool, Trig::JetManagerTool, Trig::MatchFromCompositeTool, Trig::MatchingTool, Trig::R3IParticleRetrievalTool, Trig::R3MatchingTool, Trig::StaticBunchCrossingTool, Trig::TrigConfBunchCrossingTool, Trig::TrigDecisionTool, Trig::TrigDecisionToolLite, Trig::TrigEgammaEmulationBaseHypoTool, Trig::TrigEgammaEmulationChain, Trig::TrigEgammaEmulationFastCaloHypoTool, Trig::TrigEgammaEmulationPrecisionElectronHypoTool, Trig::TrigEgammaEmulationPrecisionPhotonHypoTool, Trig::TrigEgammaEmulationToolMT, Trig::TrigEgammaMatchingTool, Trig::TrigMuonMatching, Trig::TypedScoringTool, Trig::xAODBunchCrossingTool, TrigConf::xAODConfigTool, TrigEgammaMatchingToolMT, TrigFastCalibWithRings, TrigGlobalEfficiencyCorrectionTool, Validator, VoronoiWeightTool, WeightsAgregator, WeightToolBase, xAOD::BPhysBlindingTool, xAOD::BPhysTrackVertexMapTool, xAOD::CaloIsolationTool, xAOD::TrackIsolationTool, xAODMaker::TriggerMenuMetaDataTool, xAODMaker::TruthMetaDataTool, xAODtoHepMCTool, ZDC::RPDAnalysisTool, ZDC::RpdSubtractCentroidTool, ZDC::ZdcAnalysisTool, ZDC::ZdcLEDAnalysisTool, ZDC::ZdcRecTool, ZDC::ZdcTrigValidTool, ZdcByteStreamReadV1V2Tool, ZdcDataAccessV2, ZdcRecChannelToolLucrod, ZdcRecChannelToolV2, and ZMassConstraint::ConstraintFit.

Definition at line 133 of file AsgTool.h.

133{ return StatusCode::SUCCESS; }

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isChargeFlipElectron()

bool TruthClassificationTool::isChargeFlipElectron ( const xAOD::IParticle & electron,
bool isTruthParticle,
const xAOD::TruthParticle * truthParticle ) const
private

a helper to check if an electron has an incorrectly reconstructed charge

Definition at line 652 of file TruthClassificationTool.cxx.

655{
656
657
658 int type = isTruthParticle ? m_classifierParticleType(electron) : m_truthType(electron);
659 int origin = isTruthParticle ? m_classifierParticleOrigin(electron) : m_truthOrigin(electron);
660 int pdgId = isTruthParticle && truthParticle ? truthParticle->pdgId() : m_truthPdgId(electron);
661 if (m_useTruthParticleDecorations && !isTruthParticle && truthParticle != nullptr)
662 {
663 type = m_classifierParticleType(*truthParticle);
664 origin = m_classifierParticleOrigin(*truthParticle);
665 }
666
667 int firstMotherType = m_firstMotherTruthType(electron);
668 int firstMotherOrigin = m_firstMotherTruthOrigin(electron);
669 int firstMotherPdgId = m_firstMotherPdgId(electron);
670
671 // not consider FSR photons from electrons (the photon has no charge)
672 if (origin == MCTruthPartClassifier::FSRPhot && type == MCTruthPartClassifier::NonIsoPhoton && std::abs(pdgId) == 11)
673 {
674 return false;
675 }
677 && firstMotherType == MCTruthPartClassifier::NonIsoPhoton && firstMotherOrigin == MCTruthPartClassifier::FSRPhot
678 && std::abs(pdgId) == 11)
679 {
680 return false;
681 }
682
683 // bkg electrons with no additional info to help us classify them FSR -- not in the charge flip category
685 && firstMotherType == MCTruthPartClassifier::BkgElectron && firstMotherOrigin == MCTruthPartClassifier::PhotonConv
686 && std::abs(pdgId) == 11)
687 {
688 return false;
689 }
690
691 if (isTruthParticle)
692 {
693 if (truthParticle->charge() != 0)
694 {
695 return (firstMotherPdgId * truthParticle->charge()) > 0;
696 }
697 }
698 else
699 {
700 const xAOD::Electron &xAODElectron = *dynamic_cast<const xAOD::Electron *> (&electron);
701 if (xAODElectron.charge() != 0)
702 {
703 return (firstMotherPdgId * xAODElectron.charge()) > 0;
704 }
705 }
706
707 return (firstMotherPdgId * (-pdgId)) > 0;
708}
float charge() const
Obtain the charge of the object.
double charge() const
Physical charge.

◆ isChargeFlipMuon()

bool TruthClassificationTool::isChargeFlipMuon ( const xAOD::IParticle & muon,
bool isTruthParticle,
const xAOD::TruthParticle * truthParticle ) const
private

a helper to check if a muon has an incorrectly reconstructed charge

Definition at line 711 of file TruthClassificationTool.cxx.

714{
715 if (isTruthParticle)
716 {
717 return false;
718 }
719
720 if (truthParticle != nullptr && xAOD::P4Helpers::isInDeltaR(*truthParticle, muon, 0.025))
721 {
722 const xAOD::Muon &xAODMuon = *dynamic_cast<const xAOD::Muon *> (&muon);
723 return (truthParticle->charge() * xAODMuon.charge()) < 0;
724 }
725
726 ANA_MSG_DEBUG("Cannot find associated truth-particle... assuming muon has correct charge");
727 return false;
728}
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
float charge() const
bool isInDeltaR(const xAOD::IParticle &p1, const xAOD::IParticle &p2, double dR, bool useRapidity=true)
Check if 2 xAOD::IParticle are in a cone.

◆ isPromptElectron()

bool TruthClassificationTool::isPromptElectron ( const xAOD::IParticle & electron,
bool isTruthParticle,
const xAOD::TruthParticle * truthParticle ) const
private

a helper to check if an electron is prompt

Definition at line 604 of file TruthClassificationTool.cxx.

607{
608
609
610 int type = isTruthParticle ? m_classifierParticleType(electron) : m_truthType(electron);
611 int origin = isTruthParticle ? m_classifierParticleOrigin(electron) : m_truthOrigin(electron);
612 if (m_useTruthParticleDecorations && !isTruthParticle && truthParticle != nullptr)
613 {
614 type = m_classifierParticleType(*truthParticle);
615 origin = m_classifierParticleOrigin(*truthParticle);
616 }
617
618 // Electron is IsoElectron - return true
620 {
621 return true;
622 }
623
624 int pdgId = isTruthParticle ? truthParticle->pdgId() : m_truthPdgId(electron);
625 int firstMotherType = m_firstMotherTruthType(electron);
626 int firstMotherOrigin = m_firstMotherTruthOrigin(electron);
627
628 // Adding these cases from ElectronEfficiencyHelpers
629 if (firstMotherType == MCTruthPartClassifier::IsoElectron && std::abs(m_firstMotherPdgId(electron)) == 11)
630 {
631 return true;
632 }
633
634 // FSR photons from electrons
635 if (origin == MCTruthPartClassifier::FSRPhot && type == MCTruthPartClassifier::NonIsoPhoton && std::abs(pdgId) == 11)
636 {
637 return true;
638 }
639
641 && firstMotherType == MCTruthPartClassifier::NonIsoPhoton && firstMotherOrigin == MCTruthPartClassifier::FSRPhot
642 && std::abs(pdgId) == 11)
643 {
644 return true;
645 }
646
647 // If we reach here then it is not a prompt electron
648 return false;
649}

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
MsgStream & msg() const
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ print()

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_classifierParticleOrigin

const SG::AuxElement::ConstAccessor<unsigned int> TruthClassificationTool::m_classifierParticleOrigin {"classifierParticleOrigin"}
private

Definition at line 54 of file TruthClassificationTool.h.

54{"classifierParticleOrigin"};

◆ m_classifierParticleType

const SG::AuxElement::ConstAccessor<unsigned int> TruthClassificationTool::m_classifierParticleType {"classifierParticleType"}
private

Definition at line 53 of file TruthClassificationTool.h.

53{"classifierParticleType"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_fallbackDR

const SG::AuxElement::ConstAccessor<float> TruthClassificationTool::m_fallbackDR {"TruthClassifierFallback_dR"}
private

Definition at line 63 of file TruthClassificationTool.h.

63{"TruthClassifierFallback_dR"};

◆ m_fallbackTruthOrigin

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_fallbackTruthOrigin {"TruthClassifierFallback_truthOrigin"}
private

Definition at line 62 of file TruthClassificationTool.h.

62{"TruthClassifierFallback_truthOrigin"};

◆ m_fallbackTruthType

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_fallbackTruthType {"TruthClassifierFallback_truthType"}
private

Definition at line 61 of file TruthClassificationTool.h.

61{"TruthClassifierFallback_truthType"};

◆ m_firstMotherPdgId

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_firstMotherPdgId {"firstEgMotherPdgId"}
private

Definition at line 57 of file TruthClassificationTool.h.

57{"firstEgMotherPdgId"};

◆ m_firstMotherTruthOrigin

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_firstMotherTruthOrigin {"firstEgMotherTruthOrigin"}
private

Definition at line 56 of file TruthClassificationTool.h.

56{"firstEgMotherTruthOrigin"};

◆ m_firstMotherTruthType

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_firstMotherTruthType {"firstEgMotherTruthType"}
private

Definition at line 55 of file TruthClassificationTool.h.

55{"firstEgMotherTruthType"};

◆ m_lastMotherPdgId

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_lastMotherPdgId {"lastEgMotherPdgId"}
private

Definition at line 60 of file TruthClassificationTool.h.

60{"lastEgMotherPdgId"};

◆ m_lastMotherTruthOrigin

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_lastMotherTruthOrigin {"lastEgMotherTruthOrigin"}
private

Definition at line 59 of file TruthClassificationTool.h.

59{"lastEgMotherTruthOrigin"};

◆ m_lastMotherTruthType

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_lastMotherTruthType {"lastEgMotherTruthType"}
private

Definition at line 58 of file TruthClassificationTool.h.

58{"lastEgMotherTruthType"};

◆ m_separateChargeFlipElectrons

bool TruthClassificationTool::m_separateChargeFlipElectrons = false
private

separately store charge-flip electrons/muons

Definition at line 43 of file TruthClassificationTool.h.

◆ m_separateChargeFlipMuons

bool TruthClassificationTool::m_separateChargeFlipMuons = false
private

Definition at line 44 of file TruthClassificationTool.h.

◆ m_truthOrigin

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_truthOrigin {"truthOrigin"}
private

Definition at line 51 of file TruthClassificationTool.h.

51{"truthOrigin"};

◆ m_truthPdgId

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_truthPdgId {"truthPdgId"}
private

Definition at line 52 of file TruthClassificationTool.h.

52{"truthPdgId"};

◆ m_truthType

const SG::AuxElement::ConstAccessor<int> TruthClassificationTool::m_truthType {"truthType"}
private

Definition at line 50 of file TruthClassificationTool.h.

50{"truthType"};

◆ m_useTruthParticleDecorations

bool TruthClassificationTool::m_useTruthParticleDecorations {false}
private

use truth particle decorations

Definition at line 47 of file TruthClassificationTool.h.

47{false};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: