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 ATH_CHECK( m_truthParticleLinkKey.initialize() );
65 // ATLASRECTS-8290: this is for backward compatability, remove eventually
66 if (m_use_barcode) {
67 m_uidKey = "TruthParticles.barcode";
68 }
69 ATH_CHECK( m_uidKey.initialize() );
70
71 return StatusCode::SUCCESS;
72 }
73
74 StatusCode SoftElectronTruthDecoratorAlg::execute(const EventContext& ctx) const {
75 ATH_MSG_DEBUG( "Executing " << name() << "... " );
76
77 using EC = xAOD::ElectronContainer;
78
79 // read collections
81 ATH_CHECK( electrons.isValid() );
82 ATH_MSG_DEBUG( "Retrieved " << electrons->size() << " electrons..." );
83
84 // instantiate accessors
86 RDH acc_origin_label(m_acc_origin_label, ctx);
87 RDH acc_type_label(m_acc_type_label, ctx);
88 RDH acc_source_label(m_acc_source_label, ctx);
89 RDH acc_vertex_index(m_acc_vertex_index, ctx);
90 RDH acc_parent_uniqueID(m_acc_parent_uniqueID, ctx);
91
95
96 // instantiate decorators
98 WDH dec_origin_label(m_dec_origin_label, ctx);
99 WDH dec_type_label(m_dec_type_label, ctx);
100 WDH dec_source_label(m_dec_source_label, ctx);
101 WDH dec_vertex_index(m_dec_vertex_index, ctx);
102 WDH dec_uniqueID(m_dec_uniqueID, ctx);
103 WDH dec_parent_uniqueID(m_dec_parent_uniqueID, ctx);
104
105 std::vector<const xAOD::Electron*> el_vector(electrons->begin(), electrons->end());
106 for ( const auto& electron : el_vector ) {
107
108 // get the linked truth particle
109 const auto truth_link = truthParticleLink(*electron);
110
111 if (!truth_link || !truth_link.isValid()) {
112 // if the truth link is broken, assume PU
113 dec_origin_label(*electron) = InDet::ExclusiveOrigin::Pileup;
114 dec_type_label(*electron) = TruthDecoratorHelpers::TruthType::Label::NoTruth;
115 dec_source_label(*electron) = TruthDecoratorHelpers::TruthSource::Label::NoTruth;
116 dec_vertex_index(*electron) = -2;
117 dec_uniqueID(*electron) = HepMC::UNDEFINED_ID;
118 dec_parent_uniqueID(*electron) = HepMC::UNDEFINED_ID;
119 } else {
120 const auto *truth = *truth_link;
121 int electron_type = classifierParticleType(*truth);
122
123 if (m_valid_types.count(electron_type)) {
124 dec_origin_label(*electron) = acc_origin_label(*truth);
125 }
126 else {
127 dec_origin_label(*electron) = InDet::ExclusiveOrigin::Fake;
128 }
129
130 dec_vertex_index(*electron) = acc_vertex_index(*truth);
131 dec_type_label(*electron) = acc_type_label(*truth);
132 dec_source_label(*electron) = acc_source_label(*truth);
133 // ATLASRECTS-8290: replace uid with ->uid() eventually
134 dec_uniqueID(*electron) = uid(*truth);
135 dec_parent_uniqueID(*electron) = acc_parent_uniqueID(*truth);
136 }
137 }
138 return StatusCode::SUCCESS;
139 }
140}
#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::ReadDecorHandleKey< xAOD::TruthParticleContainer > m_uidKey
SG::ReadDecorHandleKey< xAOD::TruthParticleContainer > m_classifierParticleTypeKey
SG::ReadHandleKey< xAOD::ElectronContainer > m_ElectronContainerKey
virtual StatusCode execute(const EventContext &) const override
SoftElectronTruthDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadDecorHandleKey< xAOD::ElectronContainer > m_truthParticleLinkKey
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".