ATLAS Offline Software
ElectronRetriever.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 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 
15 namespace JiveXML {
16 
23  ElectronRetriever::ElectronRetriever(const std::string& type,const std::string& name,const IInterface* 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  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieveAll()" << endmsg;
41 
44 
45  //obtain the default collection first
46  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << dataTypeName() << " (" << m_sgKey << ")" << endmsg;
47  StatusCode sc = evtStore()->retrieve(electrons, m_sgKey);
48  if (sc.isFailure() ) {
49  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
50  }else{
52  if ( FormatTool->AddToEvent(dataTypeName(), m_sgKey, &data).isFailure()){
53  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
54  }else{
55  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << m_sgKey << ") Electron retrieved" << endmsg;
56  }
57  }
58 
59  //obtain all other collections from StoreGate
60  if (( evtStore()->retrieve(iterator, end)).isFailure()){
61  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve iterator for Jet collection" << endmsg;
62 // return StatusCode::WARNING;
63  }
64 
65  for (; iterator!=end; ++iterator) {
66  if (iterator.key()!=m_sgKey) {
67  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
69  if ( FormatTool->AddToEvent(dataTypeName(), iterator.key(), &data).isFailure()){
70  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << iterator.key() << " not found in SG " << endmsg;
71  }else{
72  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << iterator.key() << ") Electron retrieved" << endmsg;
73  }
74  }
75  }
76  //All collections retrieved okay
77  return StatusCode::SUCCESS;
78  }
79 
80 
86 
87  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in getData()" << endmsg;
88 
90 
91  DataVect pt; pt.reserve(elCont->size());
92  DataVect phi; phi.reserve(elCont->size());
93  DataVect eta; eta.reserve(elCont->size());
94  DataVect mass; mass.reserve(elCont->size());
95  DataVect energy; energy.reserve(elCont->size());
96  DataVect px; px.reserve(elCont->size());
97  DataVect py; py.reserve(elCont->size());
98  DataVect pz; pz.reserve(elCont->size());
99 
100  DataVect eOverp; eOverp.reserve(elCont->size());
101  DataVect isEM; isEM.reserve(elCont->size());
102  DataVect isEMString; isEMString.reserve(elCont->size());
103  DataVect hasTrack; hasTrack.reserve(elCont->size());
104  DataVect author; author.reserve(elCont->size());
105  DataVect label; label.reserve(elCont->size());
106 
107  DataVect pdgId; pdgId.reserve(elCont->size());
108  DataVect dataType; dataType.reserve(elCont->size());
109  DataVect hitsBLayer; hitsBLayer.reserve(elCont->size());
110  DataVect hitsPixel; hitsPixel.reserve(elCont->size());
111  DataVect hitsSCT; hitsSCT.reserve(elCont->size());
112  DataVect hitsTRT; hitsTRT.reserve(elCont->size());
113 
114  // for associations:
115  DataVect clusterKeyVec; clusterKeyVec.reserve(elCont->size());
116  DataVect clusterIndexVec; clusterIndexVec.reserve(elCont->size());
117  DataVect trackKeyVec; trackKeyVec.reserve(elCont->size());
118  DataVect trackIndexVec; trackIndexVec.reserve(elCont->size());
119 
120  ElectronContainer::const_iterator elItr = elCont->begin();
121  ElectronContainer::const_iterator elItrE = elCont->end();
122 
123  int MCdataType = 1;
124 
125 // isEM from
126 // https://uimon.cern.ch/twiki/bin/view/Atlas/RemoveOverlap
127 
128  double ep = 0., p=0., e=0.; // for eOverP calculation from track
129  //int counter = 0;
130  std::string electronAuthor = "";
131  std::string electronIsEMString = "none";
132  std::string electronLabel = "";
133 
134  for (; elItr != elItrE; ++elItr) {
135  electronIsEMString = "none";
136  phi.push_back(DataType((*elItr)->phi()));
137  eta.push_back(DataType((*elItr)->eta()));
138  pt.push_back(DataType((*elItr)->pt()/CLHEP::GeV));
139 
140  mass.push_back(DataType((*elItr)->m()/CLHEP::GeV));
141  energy.push_back( DataType((*elItr)->e()/CLHEP::GeV ) );
142  px.push_back( DataType((*elItr)->px()/CLHEP::GeV ) );
143  py.push_back( DataType((*elItr)->py()/CLHEP::GeV ) );
144  pz.push_back( DataType((*elItr)->pz()/CLHEP::GeV ) );
145 
146  pdgId.push_back( DataType((*elItr)->pdgId() ) );
147 
148  electronAuthor = "author"+DataType( (*elItr)->author() ).toString(); // for odd ones eg FWD
149  electronLabel = electronAuthor;
150  if (( (*elItr)->author()) == 0){ electronAuthor = "unknown"; electronLabel += "_unknown"; }
151  if (( (*elItr)->author()) == 8){ electronAuthor = "forward"; electronLabel += "_forward"; }
152  if (( (*elItr)->author()) == 2){ electronAuthor = "softe"; electronLabel += "_softe"; }
153  if (( (*elItr)->author()) == 1){ electronAuthor = "egamma"; electronLabel += "_egamma"; }
154 
155  // Tight but without the use of isolation criteria:
156  // code from https://twiki.cern.ch/twiki/bin/view/Atlas/ElectronReconstruction#isEM_flag
157  // New PP Ids: PhysicsAnalysis/D3PDMaker/TrigEgammaD3PDMaker/python/EFElectronD3PDObject.py
158 
159  if ( (*elItr)->isem(egammaPIDObs::ElectronLoose)==0){
160  electronLabel += "_Loose";
161  electronIsEMString = "Loose"; // assume that hierarchy is obeyed !
162  }
163  if ( (*elItr)->isem(egammaPIDObs::ElectronMedium)==0){
164  electronLabel += "_Medium";
165  electronIsEMString = "Medium"; // assume that hierarchy is obeyed !
166  }
167  if ( (*elItr)->isem(egammaPIDObs::ElectronTight)==0){
168  electronLabel += "_Tight";
169  electronIsEMString = "Tight"; // assume that hierarchy is obeyed !
170  }
171  if ( (*elItr)->isem(egammaPIDObs::ElectronTightPP)==0){
172  electronLabel += "_TightPP";
173  electronIsEMString = "TightPP"; // last entry overwrites all others !
174  }
175  if ( (*elItr)->isem(egammaPIDObs::ElectronMediumPP)==0){
176  electronLabel += "_MediumPP";
177 // electronIsEMString = "MediumNoIso"; // would need AtlantisJava changes
178  }
179 
180  if ( (*elItr)->isem(egammaPIDObs::ElectronMediumNoIso)==0){
181  electronLabel += "_MediumNoIso";
182 // electronIsEMString = "MediumNoIso"; // would need AtlantisJava changes
183  }
184  if ( (*elItr)->isem(egammaPIDObs::ElectronTightTRTNoIso)==0){
185  electronLabel += "_TightTRTNoIso";
186 // electronIsEMString = "TightTRTNoIso"; // would need AtlantisJava changes
187  }
188  // Tight but without the use of isolation criteria:
189  if ( (*elItr)->isem(egammaPIDObs::ElectronTightNoIsolation)==0){
190  electronLabel += "_TightNoIsolation";
191 // electronIsEMString = "_TightNoIsolation"; // would need AtlantisJava changes
192  }
193  MCdataType = (*elItr)->dataType();
194  dataType.push_back( DataType( MCdataType ) );
195 
196 // check: full simulation input file (1) or fast (0)
197 // code from:
198 // PhysicsAnalysis/AnalysisCommon/AnalysisExamples/src/MiscellaneousExamples.cxx
199 
200  if (MCdataType != 3){ // full simulation
201 
202  isEM.push_back( DataType((**elItr).isem() ) );
203 
204  const Trk::TrackSummary *summary;
205  bool elecTrack = (*elItr)->trackParticle();
206  if ( elecTrack ){
207 
208 // eOperp calculation from: Reconstruction/egamma/egammaRec/egammaAODBuilder.cxx,
209 // advised by Frederic Derue 16Mar09
210 // Old version with eOverP from EMTrackMatch is unreliable.
211 
212  ep = 0.;
213  p = (*elItr)->trackParticle()->p();
214  e = (*elItr)->e();
215  ep = p>0. ? e/p : 0.;
216  eOverp.push_back( DataType( ep ));
217 
218  summary = (*elItr)->trackParticle()->trackSummary();
219  hasTrack.push_back( DataType( 1 ) );
220  hitsBLayer.push_back( DataType( summary->get(Trk::numberOfInnermostPixelLayerHits) ));
221  hitsPixel.push_back( DataType( summary->get(Trk::numberOfPixelHits) ));
222  hitsSCT.push_back( DataType( summary->get(Trk::numberOfSCTHits) ));
223  hitsTRT.push_back( DataType( summary->get(Trk::numberOfTRTHits) ));
224  } else {
225  eOverp.push_back( DataType( "0." ));
226  hasTrack.push_back( DataType( 0 ) );
227  hitsBLayer.push_back( DataType( -1 ));
228  hitsPixel.push_back( DataType( -1 ));
229  hitsSCT.push_back( DataType( -1 ));
230  hitsTRT.push_back( DataType( -1 ));
231  }
232 
233 // code from:
234 // PhysicsAnalysis/AnalysisCommon/AnalysisExamples/src/MiscellaneousExamples.cxx
235 
236 // parameters for associations: Storegate key and Index
237 
238  const ElementLink<CaloClusterContainer> clusterLink = (*elItr)->clusterElementLink();
239  if (clusterLink.isValid()) {
240  std::string clusterKey = clusterLink.dataID(); // Storegate key of
241  int clusterIndex = clusterLink.index(); // index into the contianer
242 // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << counter << " CaloCluster " << clusterKey << " ,"
243 // << " Index " << clusterIndex << " " << endmsg;
244 
245  clusterKeyVec.push_back(DataType( clusterKey ));
246  clusterIndexVec.push_back(DataType( clusterIndex ));
247  } else { // no clusterLink
248  clusterKeyVec.push_back(DataType( "none" ));
249  clusterIndexVec.push_back(DataType( -1 ));
250  }
251 
252  const ElementLink<Rec::TrackParticleContainer> trackLink = (*elItr)->trackParticleElementLink();
253  if (trackLink.isValid()) {
254  std::string trackKey = trackLink.dataID(); // Storegate key of
255  int trackIndex = trackLink.index(); // index into the contianer
256  // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << counter << " TrackParticle " << trackKey << " ,"
257  // << " Index " << trackIndex << " " << endmsg;
258 
259  trackKeyVec.push_back(DataType( trackKey ));
260  trackIndexVec.push_back(DataType( trackIndex));
261  } else { // no trackLink
262  trackKeyVec.push_back(DataType( "none" ));
263  trackIndexVec.push_back(DataType( -1 ));
264  }
265 
266  //counter++;
267 
268 // end of associations data
269 
270  } else { // fast simulation: placeholders
271  hasTrack.push_back( DataType( 1 ) );
272  eOverp.push_back( DataType( 1. ) );
273  isEM.push_back( DataType( 0 ) );
274  electronIsEMString += "fastSim";
275  electronLabel += "fastSim" ;
276  hitsBLayer.push_back( DataType( 0 ) );
277  hitsPixel.push_back( DataType( 0 ) );
278  hitsSCT.push_back( DataType( 0 ) );
279  hitsTRT.push_back( DataType( 0 ) );
280 
281  clusterKeyVec.push_back(DataType( "none" ));
282  clusterIndexVec.push_back(DataType( -1 ));
283  trackKeyVec.push_back(DataType( "none" ));
284  trackIndexVec.push_back(DataType( -1 ));
285  } // end datatype case
286 
287  author.push_back( DataType( electronAuthor ) );
288  label.push_back( DataType( electronLabel ) );
289  isEMString.push_back( DataType( electronIsEMString ) );
290  } // end ElectronIterator
291 
292  // four-vectors
293  DataMap["phi"] = phi;
294  DataMap["eta"] = eta;
295  DataMap["pt"] = pt;
296  DataMap["energy"] = energy;
297  DataMap["mass"] = mass;
298  DataMap["px"] = px;
299  DataMap["py"] = py;
300  DataMap["pz"] = pz;
301 
302  // special Electron parameters
303  DataMap["eOverp"] = eOverp;
304  DataMap["isEM"] = isEM;
305  DataMap["isEMString"] = isEMString;
306  DataMap["label"] = label;
307  DataMap["hasTrack"] = hasTrack;
308  DataMap["author"] = author;
309  DataMap["pdgId"] = pdgId;
310  DataMap["dataType"] = dataType;
311  DataMap["hitsBLayer"] = hitsBLayer;
312  DataMap["hitsPixel"] = hitsPixel;
313  DataMap["hitsSCT"] = hitsSCT;
314  DataMap["hitsTRT"] = hitsTRT;
315 
316  // associations
317  DataMap["clusterKey"] = clusterKeyVec;
318  DataMap["clusterIndex"] = clusterIndexVec;
319  DataMap["trackKey"] = trackKeyVec;
320  DataMap["trackIndex"] = trackIndexVec;
321 
322  if (msgLvl(MSG::DEBUG)) {
323  msg(MSG::DEBUG) << dataTypeName() << " retrieved with " << phi.size() << " entries"<< endmsg;
324  }
325 
326  //All collections retrieved okay
327  return DataMap;
328 
329  } // retrieve
330 
331  //--------------------------------------------------------------------------
332 
333 } // JiveXML namespace
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
Trk::numberOfPixelHits
@ numberOfPixelHits
number of pixel layers on track with absence of hits
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:57
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
ElectronContainer.h
egammaPIDObs::ElectronMediumPP
const unsigned int ElectronMediumPP
Medium++ electron selecton.
Definition: egammaPIDdefsObs.h:378
JiveXML::ElectronRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: ElectronRetriever.cxx:38
test_pyathena.px
px
Definition: test_pyathena.py:18
JiveXML::ElectronRetriever::ElectronRetriever
ElectronRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: ElectronRetriever.cxx:23
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
Trk::numberOfInnermostPixelLayerHits
@ numberOfInnermostPixelLayerHits
these are the hits in the 1st pixel layer
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:53
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
PlotCalibFromCool.label
label
Definition: PlotCalibFromCool.py:78
JiveXML::DataVect
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition: DataType.h:58
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
test_pyathena.pt
pt
Definition: test_pyathena.py:11
downloadSingle.dataType
string dataType
Definition: downloadSingle.py:18
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
JiveXML::ElectronRetriever::getData
const DataMap getData(const ElectronContainer *)
Retrieve basic parameters, mainly four-vectors, for each collection.
Definition: ElectronRetriever.cxx:85
JiveXML::ElectronRetriever::m_sgKey
std::string m_sgKey
Definition: ElectronRetriever.h:53
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
egammaPIDObs::ElectronTightNoIsolation
const unsigned int ElectronTightNoIsolation
obsolete - kept not to crash clients
Definition: egammaPIDdefsObs.h:798
PowhegPy8EG_H2a.pdgId
dictionary pdgId
Definition: PowhegPy8EG_H2a.py:128
dqt_zlumi_pandas.mass
mass
Definition: dqt_zlumi_pandas.py:170
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
egammaPIDObs::ElectronMediumNoIso
const unsigned int ElectronMediumNoIso
obsolete - kept not crash clients
Definition: egammaPIDdefsObs.h:793
egammaPIDObs::ElectronLoose
const unsigned int ElectronLoose
Loose electron selection.
Definition: egammaPIDdefsObs.h:407
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Trk::numberOfSCTHits
@ numberOfSCTHits
number of SCT holes
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:71
Amg::pz
@ pz
Definition: GeoPrimitives.h:40
JiveXML::ElectronRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: ElectronRetriever.h:47
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ElectronRetriever.h
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
Trk::numberOfTRTHits
@ numberOfTRTHits
number of TRT outliers
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:79
Amg::py
@ py
Definition: GeoPrimitives.h:39
Trk::TrackSummary
A summary of the information contained by a track.
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:287
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
egammaPIDObs::ElectronMedium
const unsigned int ElectronMedium
Medium electron selecton.
Definition: egammaPIDdefsObs.h:430
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
CaloCondBlobAlgs_fillNoiseFromASCII.author
string author
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:26
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
egammaPIDObs::ElectronTightPP
const unsigned int ElectronTightPP
Tight++ electron selecton.
Definition: egammaPIDdefsObs.h:390
ElectronContainer
Definition: Reconstruction/egamma/egammaEvent/egammaEvent/ElectronContainer.h:32
AthAlgTool
Definition: AthAlgTool.h:26
egammaPIDObs::ElectronTightTRTNoIso
const unsigned int ElectronTightTRTNoIso
obsolete - kept not to crash clients
Definition: egammaPIDdefsObs.h:796
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
SG::ConstIterator
Definition: SGIterator.h:163
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
egammaPIDObs::ElectronTight
const unsigned int ElectronTight
Tight electron selection.
Definition: egammaPIDdefsObs.h:475
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
TrackParticleContainer.h
SCT_Monitoring::summary
@ summary
Definition: SCT_MonitoringNumbers.h:65