ATLAS Offline Software
Loading...
Searching...
No Matches
ElectronRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "CLHEP/Units/SystemOfUnits.h"
8
10
11// for associations:
13#include "CaloEvent/CaloClusterContainer.h"
14
15namespace JiveXML {
16
23 ElectronRetriever::ElectronRetriever(const std::string& type,const std::string& name,const IInterface* parent):
24 AthAlgTool(type,name,parent),
25 m_typeName("Electron"){
26
27 //Only declare the interface
28 declareInterface<IDataRetriever>(this);
29
30 declareProperty("StoreGateKey", m_sgKey= "ElectronAODCollection",
31 "Collection to be first in output, shown in Atlantis without switching");
32 }
33
38 StatusCode ElectronRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
39
40 ATH_MSG_DEBUG( "in retrieveAll()" );
41
43 const ElectronContainer* electrons;
44
45 //obtain the default collection first
46 ATH_MSG_DEBUG( "Trying to retrieve " << dataTypeName() << " (" << m_sgKey << ")" );
47 StatusCode sc = evtStore()->retrieve(electrons, m_sgKey);
48 if (sc.isFailure() ) {
49 ATH_MSG_WARNING( "Collection " << m_sgKey << " not found in SG " );
50 }else{
51 DataMap data = getData(electrons);
52 if ( FormatTool->AddToEvent(dataTypeName(), m_sgKey, &data).isFailure()){
53 ATH_MSG_WARNING( "Collection " << m_sgKey << " not found in SG " );
54 }else{
55 ATH_MSG_DEBUG( dataTypeName() << " (" << m_sgKey << ") Electron retrieved" );
56 }
57 }
58
59 //obtain all other collections from StoreGate
60 if (( evtStore()->retrieve(iterator, end)).isFailure()){
61 ATH_MSG_WARNING( "Unable to retrieve iterator for Jet collection" );
62 }
63
64 for (; iterator!=end; ++iterator) {
65 if (iterator.key()!=m_sgKey) {
66 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
68 if ( FormatTool->AddToEvent(dataTypeName(), iterator.key(), &data).isFailure()){
69 ATH_MSG_WARNING("Collection " << iterator.key() << " not found in SG ");
70 }else{
71 ATH_MSG_DEBUG( dataTypeName() << " (" << iterator.key() << ") Electron retrieved" );
72 }
73 }
74 }
75 //All collections retrieved okay
76 return StatusCode::SUCCESS;
77 }
78
79
85
86 if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in getData()" << endmsg;
87
89 const auto nElectrons = elCont->size();
90 DataVect pt; pt.reserve(nElectrons);
91 DataVect phi; phi.reserve(nElectrons);
92 DataVect eta; eta.reserve(nElectrons);
93 DataVect mass; mass.reserve(nElectrons);
94 DataVect energy; energy.reserve(nElectrons);
95 DataVect px; px.reserve(nElectrons);
96 DataVect py; py.reserve(nElectrons);
97 DataVect pz; pz.reserve(nElectrons);
98
99 DataVect eOverp; eOverp.reserve(nElectrons);
100 DataVect isEM; isEM.reserve(nElectrons);
101 DataVect isEMString; isEMString.reserve(nElectrons);
102 DataVect hasTrack; hasTrack.reserve(nElectrons);
103 DataVect author; author.reserve(nElectrons);
104 DataVect label; label.reserve(nElectrons);
105
106 DataVect pdgId; pdgId.reserve(nElectrons);
107 DataVect dataType; dataType.reserve(nElectrons);
108 DataVect hitsBLayer; hitsBLayer.reserve(nElectrons);
109 DataVect hitsPixel; hitsPixel.reserve(nElectrons);
110 DataVect hitsSCT; hitsSCT.reserve(nElectrons);
111 DataVect hitsTRT; hitsTRT.reserve(nElectrons);
112
113 // for associations:
114 DataVect clusterKeyVec; clusterKeyVec.reserve(nElectrons);
115 DataVect clusterIndexVec; clusterIndexVec.reserve(nElectrons);
116 DataVect trackKeyVec; trackKeyVec.reserve(nElectrons);
117 DataVect trackIndexVec; trackIndexVec.reserve(nElectrons);
118
120 ElectronContainer::const_iterator elItrE = elCont->end();
121
122 int MCdataType = 1;
123
124// isEM from
125// https://uimon.cern.ch/twiki/bin/view/Atlas/RemoveOverlap
126
127 double ep = 0., p=0., e=0.; // for eOverP calculation from track
128 //int counter = 0;
129 std::string electronAuthor = "";
130 std::string electronIsEMString = "none";
131 std::string electronLabel = "";
132
133 for (; elItr != elItrE; ++elItr) {
134 electronIsEMString = "none";
135 phi.emplace_back((*elItr)->phi());
136 eta.emplace_back((*elItr)->eta());
137 pt.emplace_back((*elItr)->pt()/CLHEP::GeV);
138
139 mass.emplace_back((*elItr)->m()/CLHEP::GeV);
140 energy.emplace_back( (*elItr)->e()/CLHEP::GeV );
141 px.emplace_back( (*elItr)->px()/CLHEP::GeV );
142 py.emplace_back( (*elItr)->py()/CLHEP::GeV );
143 pz.emplace_back( (*elItr)->pz()/CLHEP::GeV );
144
145 pdgId.emplace_back( (*elItr)->pdgId() );
146
147 electronAuthor = "author"+DataType( (*elItr)->author() ).toString(); // for odd ones eg FWD
148 electronLabel = electronAuthor;
149 if (( (*elItr)->author()) == 0){ electronAuthor = "unknown"; electronLabel += "_unknown"; }
150 if (( (*elItr)->author()) == 8){ electronAuthor = "forward"; electronLabel += "_forward"; }
151 if (( (*elItr)->author()) == 2){ electronAuthor = "softe"; electronLabel += "_softe"; }
152 if (( (*elItr)->author()) == 1){ electronAuthor = "egamma"; electronLabel += "_egamma"; }
153
154 // Tight but without the use of isolation criteria:
155 // code from https://twiki.cern.ch/twiki/bin/view/Atlas/ElectronReconstruction#isEM_flag
156 // New PP Ids: PhysicsAnalysis/D3PDMaker/TrigEgammaD3PDMaker/python/EFElectronD3PDObject.py
157
158 if ( (*elItr)->isem(egammaPIDObs::ElectronLoose)==0){
159 electronLabel += "_Loose";
160 electronIsEMString = "Loose"; // assume that hierarchy is obeyed !
161 }
162 if ( (*elItr)->isem(egammaPIDObs::ElectronMedium)==0){
163 electronLabel += "_Medium";
164 electronIsEMString = "Medium"; // assume that hierarchy is obeyed !
165 }
166 if ( (*elItr)->isem(egammaPIDObs::ElectronTight)==0){
167 electronLabel += "_Tight";
168 electronIsEMString = "Tight"; // assume that hierarchy is obeyed !
169 }
170 if ( (*elItr)->isem(egammaPIDObs::ElectronTightPP)==0){
171 electronLabel += "_TightPP";
172 electronIsEMString = "TightPP"; // last entry overwrites all others !
173 }
174 if ( (*elItr)->isem(egammaPIDObs::ElectronMediumPP)==0){
175 electronLabel += "_MediumPP";
176// electronIsEMString = "MediumNoIso"; // would need AtlantisJava changes
177 }
178
179 if ( (*elItr)->isem(egammaPIDObs::ElectronMediumNoIso)==0){
180 electronLabel += "_MediumNoIso";
181// electronIsEMString = "MediumNoIso"; // would need AtlantisJava changes
182 }
183 if ( (*elItr)->isem(egammaPIDObs::ElectronTightTRTNoIso)==0){
184 electronLabel += "_TightTRTNoIso";
185// electronIsEMString = "TightTRTNoIso"; // would need AtlantisJava changes
186 }
187 // Tight but without the use of isolation criteria:
188 if ( (*elItr)->isem(egammaPIDObs::ElectronTightNoIsolation)==0){
189 electronLabel += "_TightNoIsolation";
190// electronIsEMString = "_TightNoIsolation"; // would need AtlantisJava changes
191 }
192 MCdataType = (*elItr)->dataType();
193 dataType.emplace_back( MCdataType );
194
195// check: full simulation input file (1) or fast (0)
196// code from:
197// PhysicsAnalysis/AnalysisCommon/AnalysisExamples/src/MiscellaneousExamples.cxx
198
199 if (MCdataType != 3){ // full simulation
200
201 isEM.emplace_back( (**elItr).isem() );
202
203 const Trk::TrackSummary *summary;
204 bool elecTrack = (*elItr)->trackParticle();
205 if ( elecTrack ){
206
207// eOperp calculation from: Reconstruction/egamma/egammaRec/egammaAODBuilder.cxx,
208// advised by Frederic Derue 16Mar09
209// Old version with eOverP from EMTrackMatch is unreliable.
210
211 ep = 0.;
212 p = (*elItr)->trackParticle()->p();
213 e = (*elItr)->e();
214 ep = p>0. ? e/p : 0.;
215 eOverp.emplace_back( ep );
216
217 summary = (*elItr)->trackParticle()->trackSummary();
218 hasTrack.emplace_back( 1 );
219 hitsBLayer.emplace_back( summary->get(Trk::numberOfInnermostPixelLayerHits) );
220 hitsPixel.emplace_back( summary->get(Trk::numberOfPixelHits) );
221 hitsSCT.emplace_back( summary->get(Trk::numberOfSCTHits) );
222 hitsTRT.emplace_back( summary->get(Trk::numberOfTRTHits) );
223 } else {
224 eOverp.emplace_back( DataType( "0." ));
225 hasTrack.emplace_back( 0 );
226 hitsBLayer.emplace_back( -1 );
227 hitsPixel.emplace_back( -1 );
228 hitsSCT.emplace_back( -1 );
229 hitsTRT.emplace_back( -1 );
230 }
231
232// code from:
233// PhysicsAnalysis/AnalysisCommon/AnalysisExamples/src/MiscellaneousExamples.cxx
234
235// parameters for associations: Storegate key and Index
236
237 const ElementLink<CaloClusterContainer> clusterLink = (*elItr)->clusterElementLink();
238 if (clusterLink.isValid()) {
239 std::string clusterKey = clusterLink.dataID(); // Storegate key of
240 int clusterIndex = clusterLink.index(); // index into the contianer
241
242
243 clusterKeyVec.emplace_back( clusterKey );
244 clusterIndexVec.emplace_back( clusterIndex );
245 } else { // no clusterLink
246 clusterKeyVec.emplace_back( "none" );
247 clusterIndexVec.emplace_back( -1 );
248 }
249
250 const ElementLink<Rec::TrackParticleContainer> trackLink = (*elItr)->trackParticleElementLink();
251 if (trackLink.isValid()) {
252 std::string trackKey = trackLink.dataID(); // Storegate key of
253 int trackIndex = trackLink.index(); // index into the contianer
254
255
256 trackKeyVec.emplace_back( trackKey );
257 trackIndexVec.emplace_back( trackIndex);
258 } else { // no trackLink
259 trackKeyVec.emplace_back( "none" );
260 trackIndexVec.emplace_back( -1 );
261 }
262
263 //counter++;
264
265// end of associations data
266
267 } else { // fast simulation: placeholders
268 hasTrack.emplace_back( 1 );
269 eOverp.emplace_back( 1. );
270 isEM.emplace_back( 0 );
271 electronIsEMString += "fastSim";
272 electronLabel += "fastSim" ;
273 hitsBLayer.emplace_back( 0 );
274 hitsPixel.emplace_back( 0 );
275 hitsSCT.emplace_back( 0 );
276 hitsTRT.emplace_back( 0 );
277
278 clusterKeyVec.emplace_back( "none" );
279 clusterIndexVec.emplace_back( -1 );
280 trackKeyVec.emplace_back( "none" );
281 trackIndexVec.emplace_back( -1 );
282 } // end datatype case
283
284 author.emplace_back( electronAuthor );
285 label.emplace_back( electronLabel );
286 isEMString.emplace_back( electronIsEMString );
287 } // end ElectronIterator
288
289 // four-vectors
290 const auto nEntries = phi.size();
291 DataMap["phi"] = std::move(phi);
292 DataMap["eta"] = std::move(eta);
293 DataMap["pt"] = std::move(pt);
294 DataMap["energy"] = std::move(energy);
295 DataMap["mass"] = std::move(mass);
296 DataMap["px"] = std::move(px);
297 DataMap["py"] = std::move(py);
298 DataMap["pz"] = std::move(pz);
299
300 // special Electron parameters
301 DataMap["eOverp"] = std::move(eOverp);
302 DataMap["isEM"] = std::move(isEM);
303 DataMap["isEMString"] = std::move(isEMString);
304 DataMap["label"] = std::move(label);
305 DataMap["hasTrack"] = std::move(hasTrack);
306 DataMap["author"] = std::move(author);
307 DataMap["pdgId"] = std::move(pdgId);
308 DataMap["dataType"] = std::move(dataType);
309 DataMap["hitsBLayer"] = std::move(hitsBLayer);
310 DataMap["hitsPixel"] = std::move(hitsPixel);
311 DataMap["hitsSCT"] = std::move(hitsSCT);
312 DataMap["hitsTRT"] = std::move(hitsTRT);
313
314 // associations
315 DataMap["clusterKey"] = std::move(clusterKeyVec);
316 DataMap["clusterIndex"] = std::move(clusterIndexVec);
317 DataMap["trackKey"] = std::move(trackKeyVec);
318 DataMap["trackIndex"] = std::move(trackIndexVec);
319
320 ATH_MSG_DEBUG( dataTypeName() << " retrieved with " << nEntries << " entries");
321
322 //All collections retrieved okay
323 return DataMap;
324
325 } // retrieve
326
327 //--------------------------------------------------------------------------
328
329} // JiveXML namespace
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t sc
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
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.
ElectronRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
const DataMap getData(const ElectronContainer *)
Retrieve basic parameters, mainly four-vectors, for each collection.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
const std::string m_typeName
The data type that is generated by this retriever.
a const_iterator facade to DataHandle.
Definition SGIterator.h:164
A summary of the information contained by a track.
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
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfInnermostPixelLayerHits
these are the hits in the 1st pixel layer
const unsigned int ElectronLoose
Loose electron selection.
const unsigned int ElectronMediumNoIso
obsolete - kept not crash clients
const unsigned int ElectronMedium
Medium electron selecton.
const unsigned int ElectronMediumPP
Medium++ electron selecton.
const unsigned int ElectronTightNoIsolation
obsolete - kept not to crash clients
const unsigned int ElectronTightPP
Tight++ electron selecton.
const unsigned int ElectronTight
Tight electron selection.
const unsigned int ElectronTightTRTNoIso
obsolete - kept not to crash clients