ATLAS Offline Software
xAODElectronRetriever.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 
9 #include "AthenaKernel/Units.h"
10 using Athena::Units::GeV;
11 
12 namespace JiveXML {
13 
28  xAODElectronRetriever::xAODElectronRetriever(const std::string& type,const std::string& name,const IInterface* parent):
29  AthAlgTool(type,name,parent), m_typeName("Electron"),
30  m_sgKey("Electrons") // is xAOD name
31  {
32 
33  //Only declare the interface
34  declareInterface<IDataRetriever>(this);
35 
36  declareProperty("StoreGateKey", m_sgKey,
37  "Collection to be first in output, shown in Atlantis without switching");
38  declareProperty("OtherCollections" ,m_otherKeys,
39  "Other collections to be retrieved. If list left empty, all available retrieved");
40  }
41 
46  StatusCode xAODElectronRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
47 
48  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieveAll()" << endmsg;
49 
52 
53  //obtain the default collection first
54  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << dataTypeName() << " (" << m_sgKey << ")" << endmsg;
55  StatusCode sc = evtStore()->retrieve(electrons, m_sgKey);
56  if (sc.isFailure() ) {
57  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
58  }else{
60  if ( FormatTool->AddToEvent(dataTypeName(), m_sgKey+"_xAOD", &data).isFailure()){ //suffix can be removed later
61  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKey << " not found in SG " << endmsg;
62  }else{
63  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << m_sgKey << ") Electron retrieved" << endmsg;
64  }
65  }
66 
67  if ( m_otherKeys.empty() ) {
68  //obtain all other collections from StoreGate
69  if (( evtStore()->retrieve(iterator, end)).isFailure()){
70  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) <<
71  "Unable to retrieve iterator for xAOD Electron collection" << endmsg;
72 // return false;
73  }
74 
75  for (; iterator!=end; ++iterator) {
76  if (iterator.key()!=m_sgKey) {
77  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all. Current collection: " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
79  if ( FormatTool->AddToEvent(dataTypeName(), iterator.key()+"_xAOD", &data).isFailure()){
80  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << iterator.key() << " not found in SG " << endmsg;
81  }else{
82  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << iterator.key() << ") xAOD Electron retrieved" << endmsg;
83  }
84  }
85  }
86  }else {
87  //obtain all collections with the given keys
88  std::vector<std::string>::const_iterator keyIter;
89  for ( keyIter=m_otherKeys.begin(); keyIter!=m_otherKeys.end(); ++keyIter ){
90  StatusCode sc = evtStore()->retrieve( electrons, (*keyIter) );
91  if (!sc.isFailure()) {
92  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve selected " << dataTypeName() << " (" << (*keyIter) << ")" << endmsg;
94  if ( FormatTool->AddToEvent(dataTypeName(), (*keyIter), &data).isFailure()){
95  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << (*keyIter) << " not found in SG " << endmsg;
96  }else{
97  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << (*keyIter) << ") retrieved" << endmsg;
98  }
99  }
100  }
101  }
102 
103  //All collections retrieved okay
104  return StatusCode::SUCCESS;
105  }
106 
107 
113 
114  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in getData()" << endmsg;
115 
117 
118  DataVect pt; pt.reserve(elCont->size());
119  DataVect phi; phi.reserve(elCont->size());
120  DataVect eta; eta.reserve(elCont->size());
121  DataVect mass; mass.reserve(elCont->size());
122  DataVect energy; energy.reserve(elCont->size());
123  DataVect pdgId; energy.reserve(elCont->size());
124 
125  DataVect isEMString; isEMString.reserve(elCont->size());
126  DataVect author; author.reserve(elCont->size());
127  DataVect label; label.reserve(elCont->size());
128 
130  xAOD::ElectronContainer::const_iterator elItrE = elCont->end();
131 
132  int counter = 0;
133 
134  for (; elItr != elItrE; ++elItr) {
135 
136  std::string electronAuthor = "";
137  std::string electronIsEMString = "none";
138  std::string electronLabel = "";
139  phi.push_back(DataType((*elItr)->phi()));
140  eta.push_back(DataType((*elItr)->eta()));
141  pt.push_back(DataType((*elItr)->pt()/GeV));
142  mass.push_back(DataType((*elItr)->m()/GeV));
143  energy.push_back( DataType((*elItr)->e()/GeV ));
144 
145  if ((*elItr)->trackParticle()){ // ForwardElectrons have no track !
146  pdgId.push_back(DataType( -11.*(*elItr)->trackParticle()->charge() )); // pdgId not available anymore in xAOD
147  }else{
148  pdgId.push_back(DataType( 0. ) );
149  }
150 
151  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "CHECKPOINT 1" << endmsg;
152 
153 
154  if (msgLvl(MSG::DEBUG)) {
155  msg(MSG::DEBUG) << " Electron #" << counter++ << " : eta = " << (*elItr)->eta() << ", phi = "
156  << (*elItr)->phi()
157  // << ", ntrk = " << (*elItr)->getNumberOfTrackParticles()
158  << ", author = " << (*elItr)->author()
160 // << ", isEM/Tight: " << (*elItr)->passSelection(passesTight, "Tight")
161 // << ", charge = " << (*elItr)->trackParticle()->charge()
162 // << ", pdgId = " << -11.*(*elItr)->trackParticle()->charge()
163  << endmsg;
164  }
165 
166 
167  bool passesTight(false);
168  bool passesMedium(false);
169  bool passesLoose(false);
170  const bool tightSelectionExists = (*elItr)->passSelection(passesTight, "Tight");
171  msg(MSG::VERBOSE) << "tight exists " << tightSelectionExists
172  << " and passes? " << passesTight << endmsg;
173  const bool mediumSelectionExists = (*elItr)->passSelection(passesMedium, "Medium");
174  msg(MSG::VERBOSE) << "medium exists " << mediumSelectionExists
175  << " and passes? " << passesMedium << endmsg;
176  const bool looseSelectionExists = (*elItr)->passSelection(passesLoose, "Loose");
177  msg(MSG::VERBOSE) << "loose exists " << looseSelectionExists
178  << " and passes? " << passesLoose << endmsg;
179 
180  electronAuthor = "author"+DataType( (*elItr)->author() ).toString(); // for odd ones eg FWD
181  electronLabel = electronAuthor;
182  if (( (*elItr)->author()) == 0){ electronAuthor = "unknown"; electronLabel += "_unknown"; }
183  if (( (*elItr)->author()) == 8){ electronAuthor = "forward"; electronLabel += "_forward"; }
184  if (( (*elItr)->author()) == 2){ electronAuthor = "softe"; electronLabel += "_softe"; }
185  if (( (*elItr)->author()) == 1){ electronAuthor = "egamma"; electronLabel += "_egamma"; }
186 
187  if ( passesLoose ){
188  electronLabel += "_Loose";
189  electronIsEMString = "Loose"; // assume that hierarchy is obeyed !
190  }
191  if ( passesMedium ){
192  electronLabel += "_Medium";
193  electronIsEMString = "Medium"; // assume that hierarchy is obeyed !
194  }
195  if ( passesTight ){
196  electronLabel += "_Tight";
197  electronIsEMString = "Tight"; // assume that hierarchy is obeyed !
198  }
199  author.push_back( DataType( electronAuthor ) );
200  label.push_back( DataType( electronLabel ) );
201  isEMString.push_back( DataType( electronIsEMString ) );
202 
203  } // end ElectronIterator
204 
205  // four-vectors
206  DataMap["phi"] = phi;
207  DataMap["eta"] = eta;
208  DataMap["pt"] = pt;
209  DataMap["energy"] = energy;
210  DataMap["mass"] = mass;
211  DataMap["pdgId"] = pdgId;
212  DataMap["isEMString"] = isEMString;
213  DataMap["label"] = label;
214  DataMap["author"] = author;
215 
216  if (msgLvl(MSG::DEBUG)) {
217  msg(MSG::DEBUG) << dataTypeName() << " retrieved with " << phi.size() << " entries"<< endmsg;
218  }
219 
220  //All collections retrieved okay
221  return DataMap;
222 
223  } // retrieve
224 
225  //--------------------------------------------------------------------------
226 
227 } // JiveXML namespace
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:17
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
Base_Fragment.mass
mass
Definition: Sherpa_i/share/common/Base_Fragment.py:59
xAODElectronRetriever.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
PlotCalibFromCool.label
label
Definition: PlotCalibFromCool.py:78
JiveXML::xAODElectronRetriever::m_sgKey
std::string m_sgKey
Definition: xAODElectronRetriever.h:51
JiveXML::xAODElectronRetriever::getData
const DataMap getData(const xAOD::ElectronContainer *)
Retrieve basic parameters, mainly four-vectors, for each collection.
Definition: xAODElectronRetriever.cxx:112
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
JiveXML::xAODElectronRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: xAODElectronRetriever.h:45
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
JiveXML::xAODElectronRetriever::m_otherKeys
std::vector< std::string > m_otherKeys
Definition: xAODElectronRetriever.h:52
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
ElectronContainer.h
JiveXML::xAODElectronRetriever::xAODElectronRetriever
xAODElectronRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: xAODElectronRetriever.cxx:28
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
test_pyathena.parent
parent
Definition: test_pyathena.py:15
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:22
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
Units.h
Wrapper to avoid constant divisions when using units.
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
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
JiveXML::xAODElectronRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: xAODElectronRetriever.cxx:46
AthAlgTool
Definition: AthAlgTool.h:26
test_pyathena.counter
counter
Definition: test_pyathena.py:15
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
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.