ATLAS Offline Software
Loading...
Searching...
No Matches
xAODElectronRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
8
9using Athena::Units::GeV;
10
11namespace JiveXML {
12
19 xAODElectronRetriever::xAODElectronRetriever(const std::string& type,const std::string& name,const IInterface* parent):
20 AthAlgTool(type,name,parent)
21 {}
22
23
25 ATH_CHECK(m_keys.initialize());
26 return StatusCode::SUCCESS;
27 }
28
33 StatusCode xAODElectronRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
34
35 ATH_MSG_DEBUG("in retrieve()");
36
37 // Loop through the keys and retrieve the corresponding data
38 for (const auto& key : m_keys) {
40 if (cont.isValid()) {
41 DataMap data = getData(&(*cont));
42 if (FormatTool->AddToEvent(dataTypeName(), key.key() + "_xAOD", &data).isFailure()) {
43 ATH_MSG_WARNING("Failed to add collection " << key.key());
44 } else {
45 ATH_MSG_DEBUG(" (" << key.key() << ") retrieved");
46 }
47 } else {
48 ATH_MSG_WARNING("Collection " << key.key() << " not found in SG");
49 }
50 }
51 return StatusCode::SUCCESS;
52 }
53
54
60
61 ATH_MSG_DEBUG("in getData()");
62
64
65 DataVect pt; pt.reserve(elCont->size());
66 DataVect phi; phi.reserve(elCont->size());
67 DataVect eta; eta.reserve(elCont->size());
68 DataVect mass; mass.reserve(elCont->size());
69 DataVect energy; energy.reserve(elCont->size());
70 DataVect pdgId; energy.reserve(elCont->size());
71
72 DataVect isEMString; isEMString.reserve(elCont->size());
73 DataVect author; author.reserve(elCont->size());
74 DataVect label; label.reserve(elCont->size());
75
78
79 int counter = 0;
80 auto prefix = [](const std::string & root)->std::string {
81 return '_' + root;
82 };
83 for (; elItr != elItrE; ++elItr) {
84
85 std::string electronAuthor = "";
86 std::string electronIsEMString = "none";
87 std::string electronLabel = "";
88 phi.emplace_back(DataType((*elItr)->phi()));
89 eta.emplace_back(DataType((*elItr)->eta()));
90 pt.emplace_back(DataType((*elItr)->pt()/GeV));
91 mass.emplace_back(DataType((*elItr)->m()/GeV));
92 energy.emplace_back( DataType((*elItr)->e()/GeV ));
93
94 if ((*elItr)->trackParticle()){ // ForwardElectrons have no track !
95 pdgId.emplace_back(DataType( -11.*(*elItr)->trackParticle()->charge() )); // pdgId not available anymore in xAOD
96 }else{
97 pdgId.emplace_back(DataType( 0. ) );
98 }
99
100 ATH_MSG_DEBUG(" Electron #" << counter++ << " : eta = " << (*elItr)->eta() << ", phi = "
101 << (*elItr)->phi()
102 // << ", ntrk = " << (*elItr)->getNumberOfTrackParticles()
103 << ", author = " << (*elItr)->author()
104 // these don't work for ForwardElectrons !
105 // << ", isEM/Tight: " << (*elItr)->passSelection(passesTight, "Tight")
106 // << ", charge = " << (*elItr)->trackParticle()->charge()
107 // << ", pdgId = " << -11.*(*elItr)->trackParticle()->charge()
108 );
109
110
111 bool passesTight(false);
112 bool passesMedium(false);
113 bool passesLoose(false);
114 static const std::string tightStr{"Tight"};
115 const bool tightSelectionExists = (*elItr)->passSelection(passesTight, tightStr);
116 ATH_MSG_VERBOSE("tight exists " << tightSelectionExists
117 << " and passes? " << passesTight);
118 static const std::string mediumStr{"Medium"};
119 const bool mediumSelectionExists = (*elItr)->passSelection(passesMedium, mediumStr);
120 ATH_MSG_VERBOSE("medium exists " << mediumSelectionExists
121 << " and passes? " << passesMedium);
122 static const std::string looseStr{"Loose"};
123 const bool looseSelectionExists = (*elItr)->passSelection(passesLoose, looseStr);
124 ATH_MSG_VERBOSE("loose exists " << looseSelectionExists
125 << " and passes? " << passesLoose);
126
127 electronAuthor = "author"+DataType( (*elItr)->author() ).toString(); // for odd ones eg FWD
128 electronLabel = electronAuthor;
129 if (( (*elItr)->author()) == 0){ electronAuthor = "unknown"; electronLabel += "_unknown"; }
130 if (( (*elItr)->author()) == 8){ electronAuthor = "forward"; electronLabel += "_forward"; }
131 if (( (*elItr)->author()) == 2){ electronAuthor = "softe"; electronLabel += "_softe"; }
132 if (( (*elItr)->author()) == 1){ electronAuthor = "egamma"; electronLabel += "_egamma"; }
133
134 if ( passesLoose ){
135 electronLabel += prefix(looseStr);
136 electronIsEMString = looseStr; // assume that hierarchy is obeyed !
137 }
138 if ( passesMedium ){
139 electronLabel += prefix(mediumStr);
140 electronIsEMString = mediumStr; // assume that hierarchy is obeyed !
141 }
142 if ( passesTight ){
143 electronLabel += prefix(tightStr);
144 electronIsEMString = tightStr; // assume that hierarchy is obeyed !
145 }
146 author.emplace_back( DataType( electronAuthor ) );
147 label.emplace_back( DataType( electronLabel ) );
148 isEMString.emplace_back( DataType( electronIsEMString ) );
149
150 } // end ElectronIterator
151
152 // four-vectors
153 std::size_t nEntries = phi.size();
154 DataMap["phi"] = std::move(phi);
155 DataMap["eta"] = std::move(eta);
156 DataMap["pt"] = std::move(pt);
157 DataMap["energy"] = std::move(energy);
158 DataMap["mass"] = std::move(mass);
159 DataMap["pdgId"] = std::move(pdgId);
160 DataMap["isEMString"] = std::move(isEMString);
161 DataMap["label"] = std::move(label);
162 DataMap["author"] = std::move(author);
163
164 ATH_MSG_DEBUG(dataTypeName() << " retrieved with " << nEntries << " entries");
165
166 return DataMap;
167 }
168
169
170} // JiveXML namespace
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Wrapper to avoid constant divisions when using units.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:861
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual std::string dataTypeName() const
Return the name of the data type that is generated by this retriever.
xAODElectronRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
const DataMap getData(const xAOD::ElectronContainer *)
Puts the variables into a DataMap.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
For each electron collection retrieve basic parameters.
SG::ReadHandleKeyArray< xAOD::ElectronContainer > m_keys
virtual bool isValid() override final
Can the handle be successfully dereferenced?
std::string label(const std::string &format, int i)
Definition label.h:19
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
std::map< std::string, DataVect > DataMap
Definition DataType.h:59
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition DataType.h:58
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".