ATLAS Offline Software
Loading...
Searching...
No Matches
SoftElectronTruthDecoratorAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5
8
11
13
16
19
21
22namespace FlavorTagDiscriminants {
23
25 const std::string& name, ISvcLocator* loc )
26 : AthReentrantAlgorithm(name, loc) {}
27
29 ATH_MSG_DEBUG( "Initializing " << name() << "... " );
30
31 // Initialize Container keys
32 ATH_MSG_DEBUG( "Initializing containers:" );
34
35 ATH_CHECK( m_ElectronContainerKey.initialize() );
36
37 // Initialise accessors
38 m_acc_origin_label = "TruthParticles." + m_acc_origin_label.key();
39 m_acc_type_label = "TruthParticles." + m_acc_type_label.key();
40 m_acc_source_label = "TruthParticles." + m_acc_source_label.key();
41 m_acc_vertex_index = "TruthParticles." + m_acc_vertex_index.key();
42 m_acc_parent_uniqueID = "TruthParticles." + m_acc_parent_uniqueID.key();
43 ATH_CHECK( m_acc_origin_label.initialize() );
44 ATH_CHECK( m_acc_type_label.initialize() );
45 ATH_CHECK( m_acc_source_label.initialize() );
46 ATH_CHECK( m_acc_vertex_index.initialize() );
47 ATH_CHECK( m_acc_parent_uniqueID.initialize() );
48
49 // Initialise decorators
56 ATH_CHECK( m_dec_origin_label.initialize() );
57 ATH_CHECK( m_dec_type_label.initialize() );
58 ATH_CHECK( m_dec_source_label.initialize() );
59 ATH_CHECK( m_dec_vertex_index.initialize() );
60 ATH_CHECK( m_dec_uniqueID.initialize() );
61 ATH_CHECK( m_dec_parent_uniqueID.initialize() );
62
63 // ATLASRECTS-8290: this is for backward compatability, remove eventually
65
66 return StatusCode::SUCCESS;
67 }
68
69 StatusCode SoftElectronTruthDecoratorAlg::execute(const EventContext& ctx) const {
70 ATH_MSG_DEBUG( "Executing " << name() << "... " );
71
72 using EC = xAOD::ElectronContainer;
73
74 // read collections
76 ATH_CHECK( electrons.isValid() );
77 ATH_MSG_DEBUG( "Retrieved " << electrons->size() << " electrons..." );
78
79 // instantiate accessors
81 RDH acc_origin_label(m_acc_origin_label, ctx);
82 RDH acc_type_label(m_acc_type_label, ctx);
83 RDH acc_source_label(m_acc_source_label, ctx);
84 RDH acc_vertex_index(m_acc_vertex_index, ctx);
85 RDH acc_parent_uniqueID(m_acc_parent_uniqueID, ctx);
86
87 // instantiate decorators
89 WDH dec_origin_label(m_dec_origin_label, ctx);
90 WDH dec_type_label(m_dec_type_label, ctx);
91 WDH dec_source_label(m_dec_source_label, ctx);
92 WDH dec_vertex_index(m_dec_vertex_index, ctx);
93 WDH dec_uniqueID(m_dec_uniqueID, ctx);
94 WDH dec_parent_uniqueID(m_dec_parent_uniqueID, ctx);
95
96 std::vector<const xAOD::Electron*> el_vector(electrons->begin(), electrons->end());
97 for ( const auto& electron : el_vector ) {
98
99 // get the linked truth particle
100 const auto truth_link = m_truthParticleLink(*electron);
101
102 if (!truth_link || !truth_link.isValid()) {
103 // if the truth link is broken, assume PU
104 dec_origin_label(*electron) = InDet::ExclusiveOrigin::Pileup;
105 dec_type_label(*electron) = TruthDecoratorHelpers::TruthType::Label::NoTruth;
106 dec_source_label(*electron) = TruthDecoratorHelpers::TruthSource::Label::NoTruth;
107 dec_vertex_index(*electron) = -2;
108 dec_uniqueID(*electron) = HepMC::UNDEFINED_ID;
109 dec_parent_uniqueID(*electron) = HepMC::UNDEFINED_ID;
110 } else {
111 const auto *truth = *truth_link;
112 int electron_type = m_classifierParticleType(*truth);
113
114 if (m_valid_types.count(electron_type)) {
115 dec_origin_label(*electron) = acc_origin_label(*truth);
116 }
117 else {
118 dec_origin_label(*electron) = InDet::ExclusiveOrigin::Fake;
119 }
120
121 dec_vertex_index(*electron) = acc_vertex_index(*truth);
122 dec_type_label(*electron) = acc_type_label(*truth);
123 dec_source_label(*electron) = acc_source_label(*truth);
124 // ATLASRECTS-8290: replace m_uid with ->uid() eventually
125 dec_uniqueID(*electron) = m_uid(*truth);
126 dec_parent_uniqueID(*electron) = acc_parent_uniqueID(*truth);
127 }
128 }
129 return StatusCode::SUCCESS;
130 }
131}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
An algorithm that can be simultaneously executed in multiple threads.
SG::ReadHandleKey< xAOD::ElectronContainer > m_ElectronContainerKey
virtual StatusCode execute(const EventContext &) const override
Acc< ElementLink< xAOD::TruthParticleContainer > > m_truthParticleLink
SoftElectronTruthDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
Helper class to provide constant type-safe access to aux data.
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
constexpr int UNDEFINED_ID
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".