ATLAS Offline Software
PhotonRetriever.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 
8 #include "egammaEvent/EMShower.h"
9 
10 #include "CLHEP/Units/SystemOfUnits.h"
11 
12 namespace JiveXML {
13 
20  PhotonRetriever::PhotonRetriever(const std::string& type,const std::string& name,const IInterface* parent):
22  m_typeName("Photon"){
23 
24  //Only declare the interface
25  declareInterface<IDataRetriever>(this);
26 
27  declareProperty("StoreGateKey", m_sgKey = "PhotonAODCollection",
28  "Collection to be first in output, shown in Atlantis without switching");
29  }
30 
35  StatusCode PhotonRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
36 
37  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieveAll()" << endmsg;
38 
40  const PhotonContainer* photons;
41 
42  //obtain the default collection first
43  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << dataTypeName() << " (" << m_sgKey << ")" << endmsg;
44  StatusCode sc = evtStore()->retrieve(photons, m_sgKey);
45  if (sc.isFailure() ) {
46  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
47  }else{
48  DataMap data = getData(photons);
49  if ( FormatTool->AddToEvent(dataTypeName(), m_sgKey, &data).isFailure()){
50  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
51  }else{
52  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << m_sgKey << ") Photon retrieved" << endmsg;
53  }
54  }
55 
56  //obtain all other collections from StoreGate
57  if (( evtStore()->retrieve(iterator, end)).isFailure()){
58  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to retrieve iterator for Jet collection" << endmsg;
59 // return StatusCode::WARNING;
60  }
61 
62  for (; iterator!=end; ++iterator) {
63  if (iterator.key()!=m_sgKey) {
64  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
66  if ( FormatTool->AddToEvent(dataTypeName(), iterator.key(), &data).isFailure()){
67  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << iterator.key() << " not found in SG " << endmsg;
68  }else{
69  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << iterator.key() << ") Photon retrieved" << endmsg;
70  }
71  }
72  }
73  //All collections retrieved okay
74  return StatusCode::SUCCESS;
75  }
76 
77 
83 
84  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "retrieve()" << endmsg;
85 
87 
88  DataVect phi; phi.reserve(photcont->size());
89  DataVect eta; eta.reserve(photcont->size());
90  DataVect pt; pt.reserve(photcont->size());
91  DataVect mass; mass.reserve(photcont->size());
92  DataVect energy; energy.reserve(photcont->size());
93  DataVect px; px.reserve(photcont->size());
94  DataVect py; py.reserve(photcont->size());
95  DataVect pz; pz.reserve(photcont->size());
96 
97  DataVect isEM; isEM.reserve(photcont->size());
98  DataVect f1Vec; f1Vec.reserve(photcont->size());
99  DataVect etConeVec; etConeVec.reserve(photcont->size());
100  DataVect fracs1Vec; fracs1Vec.reserve(photcont->size());
101  DataVect et37Vec; et37Vec.reserve(photcont->size());
102 
103  DataVect author; author.reserve(photcont->size());
104  DataVect label; label.reserve(photcont->size());
105  DataVect isEMString; isEMString.reserve(photcont->size());
106 
107  // for associations:
108  DataVect clusterKeyVec; clusterKeyVec.reserve(photcont->size());
109  DataVect clusterIndexVec; clusterIndexVec.reserve(photcont->size());
110 
111  PhotonContainer::const_iterator photonItr = photcont->begin();
112  PhotonContainer::const_iterator photonItrE = photcont->end();
113 
114  int MCdataType = 1;
115  std::string clusterKey = "none"; // Storegate key of container
116  int clusterIndex = -1; // index number inside the container
117 
118  std::string photonAuthor = "";
119  std::string photonIsEMString = "none";
120  std::string photonLabel = "";
121 
122  // reference for authors: Reconstruction/egamma/egammaEvent/egammaParamDefs.h
123  // https://twiki.cern.ch/twiki/bin/view/AtlasProtected/PhotonIdentification
124  for (; photonItr != photonItrE; ++photonItr) {
125  photonIsEMString = "none";
126  photonAuthor = "author"+DataType( (*photonItr)->author() ).toString(); // for odd ones eg FWD
127  photonLabel = photonAuthor;
128  if (( (*photonItr)->author()) == 0x0){ photonAuthor = "unknown"; photonLabel += "_unknown"; }
129  if (( (*photonItr)->author()) == 0x8){ photonAuthor = "forward"; photonLabel += "_forward"; }
130  if (( (*photonItr)->author()) == 0x10){ photonAuthor = "rconv"; photonLabel += "_recoveredconversion"; }
131  if (( (*photonItr)->author()) == 0x4){ photonAuthor = "photon"; photonLabel += "_photon"; }
132  if ( (*photonItr)->isem(egammaPIDObs::PhotonLoose)==0){
133  photonLabel += "_Loose";
134  photonIsEMString = "Loose"; // assume that hierarchy is obeyed !
135  }
136  if ( (*photonItr)->isem(egammaPIDObs::PhotonTight)==0){
137  photonLabel += "_Tight";
138  photonIsEMString = "Tight"; // assume that hierarchy is obeyed !
139  }
140  if ( (*photonItr)->isem(egammaPIDObs::PhotonLooseAR)==0){
141  photonLabel += "_LooseAR";
142  }
143  if ( (*photonItr)->isem(egammaPIDObs::PhotonTightAR)==0){
144  photonLabel += "_TightAR";
145  }
146  if ( (*photonItr)->isem(egammaPIDObs::PhotonTightARIso)==0){
147  photonLabel += "_TightARIso";
148  }
149  if ( (*photonItr)->isem(egammaPIDObs::PhotonTightIso)==0){
150  photonLabel += "_TightIso";
151  }
152 
153  phi.push_back(DataType((*photonItr)->phi()));
154  eta.push_back(DataType((*photonItr)->eta()));
155  pt.push_back(DataType((*photonItr)->pt()/CLHEP::GeV));
156  mass.push_back(DataType((*photonItr)->m()/CLHEP::GeV));
157  energy.push_back( DataType((*photonItr)->e()/CLHEP::GeV ) );
158  px.push_back( DataType((*photonItr)->px()/CLHEP::GeV ) );
159  py.push_back( DataType((*photonItr)->py()/CLHEP::GeV ) );
160  pz.push_back( DataType((*photonItr)->pz()/CLHEP::GeV ) );
161 
162  MCdataType = (*photonItr)->dataType();
163  // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Which MC datatype, fast or full ? " << m_dataType() << " (" << m_sgKey << ")" << endmsg;
164 
165  if (MCdataType != 3){ // full simulation
166  isEM.push_back( DataType((**photonItr).isem()) );
167 // do associations:
168  const ElementLink<CaloClusterContainer> clusterLink = (*photonItr)->clusterElementLink();
169  if (clusterLink.isValid()) {
170  clusterKey = clusterLink.dataID(); // Storegate key of container
171  clusterIndex = clusterLink.index(); // index number inside the container
172  clusterKeyVec.push_back(DataType( clusterKey ));
173  clusterIndexVec.push_back(DataType( clusterIndex ));
174  } else { // no clusterLink
175  clusterKeyVec.push_back(DataType( "none" ));
176  clusterIndexVec.push_back(DataType( -1 ));
177  }
179  // emWeight|et37|etCone|etHad1|f1|fracs1|pionWeight
180  const EMShower* emShower = (*photonItr)->detail<EMShower>("egDetailAOD");
181  if (emShower) {
182  //if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "found photon shower, example wtots="
183  // << emShower->parameter(egammaParameters::wtots1) << endmsg;
184  f1Vec.push_back( DataType( emShower->parameter(egammaParameters::f1) ));
185  etConeVec.push_back(DataType( emShower->parameter(egammaParameters::etcone20)));
186  fracs1Vec.push_back(DataType( emShower->parameter(egammaParameters::fracs1)));
187  et37Vec.push_back( DataType( emShower->parameter(egammaParameters::e237)));
188  }else{ //placeholders if no shower available
189  f1Vec.push_back( DataType( -1.));
190  etConeVec.push_back(DataType( -1. ));
191  fracs1Vec.push_back(DataType( -1. ));
192  et37Vec.push_back( DataType( -1.));
193  }
194  } else { // fast simulation: just placeholders
195  isEM.push_back( DataType( 0 ) );
196  clusterKeyVec.push_back(DataType( "none" ));
197  clusterIndexVec.push_back(DataType( -1 ));
198  f1Vec.push_back( -1.);
199  etConeVec.push_back(DataType( -1. ));
200  fracs1Vec.push_back(DataType( -1. ));
201  et37Vec.push_back(DataType( -1. ));
202  photonLabel += "_fastSim";
203  photonIsEMString = "fastSim";
204  }
205  author.push_back( DataType(photonAuthor ) );
206  label.push_back( DataType( photonLabel ) );
207  isEMString.push_back( DataType( photonIsEMString ) );
208  }
209  // four-vectors
210  DataMap["phi"] = phi;
211  DataMap["eta"] = eta;
212  DataMap["pt"] = pt;
213  DataMap["energy"] = energy;
214  DataMap["mass"] = mass;
215  DataMap["px"] = px;
216  DataMap["py"] = py;
217  DataMap["pz"] = pz;
218 
219  // further details and associations
220  DataMap["isEM"] = isEM;
221  DataMap["clusterKey"] = clusterKeyVec;
222  DataMap["clusterIndex"] = clusterIndexVec;
223  // shower details
224  DataMap["f1"] = f1Vec;
225  DataMap["etCone"] = etConeVec;
226  DataMap["fracs1"] = fracs1Vec;
227  DataMap["et37"] = et37Vec;
228 
229  DataMap["author"] = author;
230  DataMap["isEMString"] = isEMString;
231  DataMap["label"] = label;
232 
233  if (msgLvl(MSG::DEBUG)) {
234  msg(MSG::DEBUG) << dataTypeName() << " retrieved with " << phi.size() << " entries"<< endmsg;
235  }
236 
237  //All collections retrieved okay
238  return DataMap;
239 
240  } // retrieve
241 
242  //--------------------------------------------------------------------------
243 
244 } // JiveXML namespace
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
egammaPIDObs::PhotonLooseAR
const unsigned int PhotonLooseAR
Loose photon selection with Ambiguity resolver.
Definition: egammaPIDdefsObs.h:577
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
test_pyathena.px
px
Definition: test_pyathena.py:18
JiveXML::PhotonRetriever::PhotonRetriever
PhotonRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: PhotonRetriever.cxx:20
JiveXML::PhotonRetriever::getData
const DataMap getData(const PhotonContainer *)
Retrieve basic parameters, mainly four-vectors, for each collection.
Definition: PhotonRetriever.cxx:82
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
egammaPIDObs::PhotonLoose
const unsigned int PhotonLoose
Loose photon selection.
Definition: egammaPIDdefsObs.h:591
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
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
egammaPIDObs::PhotonTightIso
const unsigned int PhotonTightIso
Tight photon selection with isolation.
Definition: egammaPIDdefsObs.h:602
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
JiveXML::PhotonRetriever::m_sgKey
std::string m_sgKey
Definition: PhotonRetriever.h:50
EMShower::parameter
virtual double parameter(egammaParameters::ParamDef) const
Definition: EMShower.cxx:71
dqt_zlumi_pandas.mass
mass
Definition: dqt_zlumi_pandas.py:170
PhotonContainer
Definition: Reconstruction/egamma/egammaEvent/egammaEvent/PhotonContainer.h:30
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
EMShower
Definition: EMShower.h:24
egammaParameters::fracs1
@ fracs1
shower shape in the shower core : [E(+/-3)-E(+/-1)]/E(+/-1), where E(+/-n) is the energy in +- n stri...
Definition: egammaParamDefs.h:161
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
egammaParameters::etcone20
@ etcone20
ET in a cone with half-opening angle 0.2, with exclusion of a window of size 7x5 in electromagnetic c...
Definition: egammaParamDefs.h:104
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
JiveXML::PhotonRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: PhotonRetriever.h:44
Amg::pz
@ pz
Definition: GeoPrimitives.h:40
test_pyathena.parent
parent
Definition: test_pyathena.py:15
egammaParameters::e237
@ e237
uncalibrated energy (sum of cells) of the middle sampling in a rectangle of size 3x7
Definition: egammaParamDefs.h:139
egammaPIDObs::PhotonTightAR
const unsigned int PhotonTightAR
Tight photon selection with Ambiguity resolver.
Definition: egammaPIDdefsObs.h:586
PhotonRetriever.h
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
Amg::py
@ py
Definition: GeoPrimitives.h:39
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
EMShower.h
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
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::PhotonTight
const unsigned int PhotonTight
Tight photon selection.
Definition: egammaPIDdefsObs.h:600
AthAlgTool
Definition: AthAlgTool.h:26
egammaPIDObs::PhotonTightARIso
const unsigned int PhotonTightARIso
Tight photon selection with isolation and Ambiguity resolver.
Definition: egammaPIDdefsObs.h:588
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
JiveXML::PhotonRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: PhotonRetriever.cxx:35
egammaParameters::f1
@ f1
E1/E = fraction of energy reconstructed in the first sampling, where E1 is energy in all strips belon...
Definition: egammaParamDefs.h:125
PhotonContainer.h
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.