Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
xAODElectronRetriever.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 #include "AthenaKernel/Units.h"
8 
10 
11 namespace JiveXML {
12 
19  xAODElectronRetriever::xAODElectronRetriever(const std::string& type,const std::string& name,const IInterface* parent):
21  {}
22 
27  StatusCode xAODElectronRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
28 
29  ATH_MSG_DEBUG("in retrieve()");
30 
31  std::vector<std::string> keys = getKeys();
32 
33  if(keys.empty()){
34  ATH_MSG_WARNING("No StoreGate keys found");
35  return StatusCode::SUCCESS;
36  }
37 
38  // Loop through the keys and retrieve the corresponding data
39  for (const std::string& key : keys) {
41  if (cont.isValid()) {
42  DataMap data = getData(&(*cont));
43  if (FormatTool->AddToEvent(dataTypeName(), key + "_xAOD", &data).isFailure()) {
44  ATH_MSG_WARNING("Failed to retrieve Collection " << key);
45  } else {
46  ATH_MSG_DEBUG(" (" << key << ") retrieved");
47  }
48  } else {
49  ATH_MSG_WARNING("Collection " << key << " not found in SG");
50  }
51  }
52  return StatusCode::SUCCESS;
53  }
54 
55 
61 
62  ATH_MSG_DEBUG("in getData()");
63 
65 
66  DataVect pt; pt.reserve(elCont->size());
67  DataVect phi; phi.reserve(elCont->size());
68  DataVect eta; eta.reserve(elCont->size());
69  DataVect mass; mass.reserve(elCont->size());
70  DataVect energy; energy.reserve(elCont->size());
71  DataVect pdgId; energy.reserve(elCont->size());
72 
73  DataVect isEMString; isEMString.reserve(elCont->size());
74  DataVect author; author.reserve(elCont->size());
75  DataVect label; label.reserve(elCont->size());
76 
79 
80  int counter = 0;
81 
82  for (; elItr != elItrE; ++elItr) {
83 
84  std::string electronAuthor = "";
85  std::string electronIsEMString = "none";
86  std::string electronLabel = "";
87  phi.emplace_back(DataType((*elItr)->phi()));
88  eta.emplace_back(DataType((*elItr)->eta()));
89  pt.emplace_back(DataType((*elItr)->pt()/GeV));
90  mass.emplace_back(DataType((*elItr)->m()/GeV));
91  energy.emplace_back( DataType((*elItr)->e()/GeV ));
92 
93  if ((*elItr)->trackParticle()){ // ForwardElectrons have no track !
94  pdgId.emplace_back(DataType( -11.*(*elItr)->trackParticle()->charge() )); // pdgId not available anymore in xAOD
95  }else{
96  pdgId.emplace_back(DataType( 0. ) );
97  }
98 
99  ATH_MSG_DEBUG(" Electron #" << counter++ << " : eta = " << (*elItr)->eta() << ", phi = "
100  << (*elItr)->phi()
101  // << ", ntrk = " << (*elItr)->getNumberOfTrackParticles()
102  << ", author = " << (*elItr)->author()
103  // these don't work for ForwardElectrons !
104  // << ", isEM/Tight: " << (*elItr)->passSelection(passesTight, "Tight")
105  // << ", charge = " << (*elItr)->trackParticle()->charge()
106  // << ", pdgId = " << -11.*(*elItr)->trackParticle()->charge()
107  );
108 
109 
110  bool passesTight(false);
111  bool passesMedium(false);
112  bool passesLoose(false);
113  const bool tightSelectionExists = (*elItr)->passSelection(passesTight, "Tight");
114  ATH_MSG_VERBOSE("tight exists " << tightSelectionExists
115  << " and passes? " << passesTight);
116  const bool mediumSelectionExists = (*elItr)->passSelection(passesMedium, "Medium");
117  ATH_MSG_VERBOSE("medium exists " << mediumSelectionExists
118  << " and passes? " << passesMedium);
119  const bool looseSelectionExists = (*elItr)->passSelection(passesLoose, "Loose");
120  ATH_MSG_VERBOSE("loose exists " << looseSelectionExists
121  << " and passes? " << passesLoose);
122 
123  electronAuthor = "author"+DataType( (*elItr)->author() ).toString(); // for odd ones eg FWD
124  electronLabel = electronAuthor;
125  if (( (*elItr)->author()) == 0){ electronAuthor = "unknown"; electronLabel += "_unknown"; }
126  if (( (*elItr)->author()) == 8){ electronAuthor = "forward"; electronLabel += "_forward"; }
127  if (( (*elItr)->author()) == 2){ electronAuthor = "softe"; electronLabel += "_softe"; }
128  if (( (*elItr)->author()) == 1){ electronAuthor = "egamma"; electronLabel += "_egamma"; }
129 
130  if ( passesLoose ){
131  electronLabel += "_Loose";
132  electronIsEMString = "Loose"; // assume that hierarchy is obeyed !
133  }
134  if ( passesMedium ){
135  electronLabel += "_Medium";
136  electronIsEMString = "Medium"; // assume that hierarchy is obeyed !
137  }
138  if ( passesTight ){
139  electronLabel += "_Tight";
140  electronIsEMString = "Tight"; // assume that hierarchy is obeyed !
141  }
142  author.emplace_back( DataType( electronAuthor ) );
143  label.emplace_back( DataType( electronLabel ) );
144  isEMString.emplace_back( DataType( electronIsEMString ) );
145 
146  } // end ElectronIterator
147 
148  // four-vectors
149  DataMap["phi"] = phi;
150  DataMap["eta"] = eta;
151  DataMap["pt"] = pt;
152  DataMap["energy"] = energy;
153  DataMap["mass"] = mass;
154  DataMap["pdgId"] = pdgId;
155  DataMap["isEMString"] = isEMString;
156  DataMap["label"] = label;
157  DataMap["author"] = author;
158 
159  ATH_MSG_DEBUG(dataTypeName() << " retrieved with " << phi.size() << " entries");
160 
161  return DataMap;
162  }
163 
164 
165  const std::vector<std::string> xAODElectronRetriever::getKeys() {
166 
167  ATH_MSG_DEBUG("in getKeys()");
168 
169  std::vector<std::string> keys = {};
170 
171  // Remove m_priorityKey from m_otherKeys if it exists, we don't want to write it twice
172  auto it = std::find(m_otherKeys.begin(), m_otherKeys.end(), m_priorityKey);
173  if(it != m_otherKeys.end()){
174  m_otherKeys.erase(it);
175  }
176 
177  // Add m_priorityKey as the first element if it is not ""
178  if(m_priorityKey!=""){
179  keys.push_back(m_priorityKey);
180  }
181 
182  if(!m_otherKeys.empty()){
183  keys.insert(keys.end(), m_otherKeys.begin(), m_otherKeys.end());
184  }
185 
186  // If all collections are requested, obtain all available keys from StoreGate
187  std::vector<std::string> allKeys;
189  evtStore()->keys<xAOD::ElectronContainer>(allKeys);
190 
191  // Add keys that are not the priority key and do not add containers with "HLT" in their name if requested
192  for(const std::string& key : allKeys){
193  // Don't include key if it's already in keys
194  auto it2 = std::find(keys.begin(), keys.end(), key);
195  if(it2 != keys.end())continue;
196  if(key.find("HLT") == std::string::npos || m_doWriteHLT){
197  keys.emplace_back(key);
198  }
199  }
200  }
201  return keys;
202  }
203 
204 
205 } // JiveXML namespace
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
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
Base_Fragment.mass
mass
Definition: Sherpa_i/share/common/Base_Fragment.py:59
xAODElectronRetriever.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
JiveXML::xAODElectronRetriever::getData
const DataMap getData(const xAOD::ElectronContainer *)
Puts the variables into a DataMap.
Definition: xAODElectronRetriever.cxx:60
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
skel.it
it
Definition: skel.GENtoEVGEN.py:407
test_pyathena.pt
pt
Definition: test_pyathena.py:11
JiveXML::xAODElectronRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type that is generated by this retriever.
Definition: xAODElectronRetriever.h:48
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
JiveXML::xAODElectronRetriever::m_priorityKey
Gaudi::Property< std::string > m_priorityKey
Definition: xAODElectronRetriever.h:57
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
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::m_otherKeys
Gaudi::Property< std::vector< std::string > > m_otherKeys
Definition: xAODElectronRetriever.h:56
JiveXML::xAODElectronRetriever::xAODElectronRetriever
xAODElectronRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: xAODElectronRetriever.cxx:19
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
add-xsec-uncert-quadrature-N.label
label
Definition: add-xsec-uncert-quadrature-N.py:104
test_pyathena.parent
parent
Definition: test_pyathena.py:15
JiveXML::xAODElectronRetriever::m_doWriteHLT
Gaudi::Property< bool > m_doWriteHLT
Definition: xAODElectronRetriever.h:54
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:22
JiveXML::xAODElectronRetriever::m_doWriteAllCollections
Gaudi::Property< bool > m_doWriteAllCollections
Definition: xAODElectronRetriever.h:55
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
JiveXML::xAODElectronRetriever::getKeys
const std::vector< std::string > getKeys()
Gets the StoreGate keys for the desired containers.
Definition: xAODElectronRetriever.cxx:165
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.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CaloCondBlobAlgs_fillNoiseFromASCII.author
string author
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:26
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
JiveXML::xAODElectronRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
For each electron collection retrieve basic parameters.
Definition: xAODElectronRetriever.cxx:27
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.
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37