ATLAS Offline Software
Loading...
Searching...
No Matches
AODCaloClusterRetriever.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 "CaloEvent/CaloClusterContainer.h"
10#include "CaloGeoHelpers/CaloSampling.h"
11
12#include "CLHEP/Units/SystemOfUnits.h"
13
14namespace JiveXML {
15
22 AODCaloClusterRetriever::AODCaloClusterRetriever(const std::string& type,const std::string& name,const IInterface* parent):
23 AthAlgTool(type,name,parent),
24 m_typeName("Cluster"){
25
26 //Only declare the interface
27 declareInterface<IDataRetriever>(this);
28
29 declareProperty("FavouriteClusterCollection" ,m_sgKeyFavourite= "egClusterCollection",
30 "Collection to be first in output, shown in Atlantis without switching");
31 declareProperty("OtherClusterCollections" ,m_otherKeys,
32 "Other collections to be retrieved. If list left empty, all available retrieved");
33 declareProperty("DoWriteHLT", m_doWriteHLT = false,"Ignore HLTAutokey object by default."); // ignore HLTAutoKey objects
34 }
35
41 StatusCode AODCaloClusterRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
42
43 ATH_MSG_DEBUG( "in retrieveAll()" );
44
46 const CaloClusterContainer* ccc;
47
48 //obtain the default collection first
49 ATH_MSG_DEBUG( "Trying to retrieve " << dataTypeName() << " (" << m_sgKeyFavourite << ")" );
50 StatusCode sc = evtStore()->retrieve(ccc, m_sgKeyFavourite);
51 if (sc.isFailure() ) {
52 ATH_MSG_WARNING( "Collection " << m_sgKeyFavourite << " not found in SG " );
53 }else{
54 DataMap data = getData(ccc, false);
55 if ( FormatTool->AddToEvent(dataTypeName(), m_sgKeyFavourite, &data).isFailure()){
56 ATH_MSG_WARNING( "Collection " << m_sgKeyFavourite << " not found in SG " );
57 }else{
58 ATH_MSG_DEBUG( dataTypeName() << " (" << m_sgKeyFavourite << ") AODCaloCluster retrieved" );
59 }
60 }
61
62 // uncalibrated topo clusters: calibFlag=true
63 //obtain the default collection first
64 ATH_MSG_DEBUG( "Trying to retrieve CaloCalTopoCluster (for non-calib)" );
65 StatusCode sc3 = evtStore()->retrieve(ccc, "CaloCalTopoCluster");
66 if (sc3.isFailure() ) {
67 ATH_MSG_WARNING( "Collection CaloCalTopoCluster (for non-calib) not found in SG " );
68 }else{
69 DataMap data = getData(ccc, true); // calibFlag: If true, use getBasicEnergy() instead of et()
70 if ( FormatTool->AddToEvent(dataTypeName(), "BasicEnergyCaloCalTopoCluster", &data).isFailure()){
71 ATH_MSG_WARNING( "Collection CaloCalTopoCluster (for non-calib) not found in SG " );
72 }else{
73 ATH_MSG_DEBUG( dataTypeName() << " CaloCalTopoCluster (for non-calib) AODCaloCluster retrieved" );
74 }
75 }
76
77 if ( m_otherKeys.empty() ) {
78 //obtain all other collections from StoreGate
79 if (( evtStore()->retrieve(iterator, end)).isFailure()){
80 ATH_MSG_WARNING( "Unable to retrieve iterator for AODCaloCluster collection" );
81 }
82
83 for (; iterator!=end; ++iterator) {
84
85 std::string::size_type position = iterator.key().find("HLTAutoKey",0);
86 if ( m_doWriteHLT ){ position = 99; } // override SG key find
87
88
89 if ( position != 0 ){ // SG key doesn't contain HLTAutoKey
90 if (iterator.key()!=m_sgKeyFavourite) {
91 ATH_MSG_DEBUG( "Trying to retrieve all " << dataTypeName() << " (" << iterator.key() << ")" );
92 DataMap data = getData(&(*iterator), false);
93 if ( FormatTool->AddToEvent(dataTypeName(), iterator.key(), &data).isFailure()){
94 ATH_MSG_WARNING( "Collection " << iterator.key() << " not found in SG " );
95 }else{
96 ATH_MSG_DEBUG( dataTypeName() << " (" << iterator.key() << ") AODCaloCluster retrieved" );
97 }
98 }
99 }
100 }
101 }else {
102 //obtain all collections with the given keys
103 std::vector<std::string>::const_iterator keyIter;
104 for ( keyIter=m_otherKeys.begin(); keyIter!=m_otherKeys.end(); ++keyIter ){
105 StatusCode sc = evtStore()->retrieve( ccc, (*keyIter) );
106 if (!sc.isFailure()) {
107 ATH_MSG_DEBUG( "Trying to retrieve selected " << dataTypeName() << " (" << (*keyIter) << ")" );
108 DataMap data = getData(ccc, false);
109 if ( FormatTool->AddToEvent(dataTypeName(), (*keyIter), &data).isFailure()){
110 ATH_MSG_WARNING( "Collection " << (*keyIter) << " not found in SG " );
111 }else{
112 ATH_MSG_DEBUG( dataTypeName() << " (" << (*keyIter) << ") retrieved" );
113 }
114 }
115 }
116 }
117 //All collections retrieved okay
118 return StatusCode::SUCCESS;
119 }
120
121
129
130 ATH_MSG_DEBUG( "retrieve()" );
131
133
134 DataVect phi; phi.reserve(ccc->size());
135 DataVect eta; eta.reserve(ccc->size());
136 DataVect et; et.reserve(ccc->size());
137 DataVect cells; cells.reserve(ccc->size());
138 DataVect numCells; numCells.reserve(ccc->size());
139 DataVect idVec; idVec.reserve(ccc->size());
140 DataVect emfracVec; emfracVec.reserve(ccc->size());
141 DataVect labelVec; labelVec.reserve(ccc->size());
142
143 std::string label="";
144 int id = 0;
145 int s = 0;
146 float eInSample = 0.;
147 float eInSampleFull = 0.;
148 float emfrac = 0.;
149 float rawemfrac = 0.;
150
151// cells n/a in AOD, but keep this for compatibility
152// with 'full' clusters in AtlantisJava
153 std::string tagCells;
154 tagCells = "cells multiple=\"1.0\"";
155
157 for (; itr != ccc->end(); ++itr) {
158
159// sum over samplings to get EMfraction:
161// full sum:
162 for (s=0;s<CaloSampling::Unknown; s++){
163 eInSampleFull += (*itr)->eSample(CaloSampling::CaloSample(s));
164 }
165// Now only EMB1-3, EME1-3 and FCAL1:
166 eInSample += (*itr)->eSample(CaloSampling::EMB1);
167 eInSample += (*itr)->eSample(CaloSampling::EMB2);
168 eInSample += (*itr)->eSample(CaloSampling::EMB3);
169 eInSample += (*itr)->eSample(CaloSampling::EME1);
170 eInSample += (*itr)->eSample(CaloSampling::EME2);
171 eInSample += (*itr)->eSample(CaloSampling::EME3);
172 eInSample += (*itr)->eSample(CaloSampling::FCAL1);
173
174 emfrac = eInSample/eInSampleFull;
175 rawemfrac = emfrac;
176// sanity cut: emfrac should be within [0,1]
177 if ( emfrac > 1.0 ) emfrac = 1.;
178 if ( emfrac < 0.0 ) emfrac = 0.;
179 emfracVec.push_back( emfrac );
180
181 label = "AllMeV_SumEMSampl=" + DataType( eInSample ).toString() +
182 "_SumAllSampl=" + DataType( eInSampleFull ).toString() +
183 "_basicEnergy=" + DataType( (*itr)->getBasicEnergy()).toString() +
184 "_calcEMFrac=" + DataType( rawemfrac ).toString()+
185 "_outEMFrac=" + DataType( emfrac ).toString();
186 eInSample = 0.;
187 eInSampleFull = 0.;
188
189 labelVec.push_back( label );
190 ATH_MSG_DEBUG( "label is " << label );
191
192
193// now the standard variables
194
195 phi.emplace_back((*itr)->phi());
196 eta.emplace_back((*itr)->eta());
197 if (!calibFlag){ // default: just take et
198 et.emplace_back((*itr)->et()/CLHEP::GeV);
199 }else{ // non-calib energies: need to convert to et by hand
200 et.emplace_back( (((*itr)->getBasicEnergy()/CLHEP::GeV)*((*itr)->sinTh())) );
201
202 }
203 numCells.emplace_back( "0" );
204 cells.emplace_back( "0" );
205 idVec.emplace_back( ++id );
206
207
208 }
209 // Start with mandatory entries
210 const auto nEntries = phi.size();
211 DataMap["phi"] = std::move(phi);
212 DataMap["eta"] = std::move(eta);
213 DataMap["et"] = std::move(et);
214 DataMap[tagCells] = std::move(cells);
215 DataMap["numCells"] = std::move(numCells);
216 DataMap["id"] = std::move(idVec);
217 DataMap["emfrac"] = std::move(emfracVec); // not in Atlantis yet ! Could be used in legoplot
218 DataMap["label"] = std::move(labelVec); // not in Atlantis yet !
219
220 //Be verbose
221 ATH_MSG_DEBUG( dataTypeName() << " (AOD, no cells), collection: " << dataTypeName()
222 << " retrieved with " << nEntries << " entries");
223
224
225 //All collections retrieved okay
226 return DataMap;
227
228 } // retrieve
229
230 //--------------------------------------------------------------------------
231
232} // JiveXML namespace
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#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()
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 StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
virtual std::string dataTypeName() const
Return the name of the data type.
const DataMap getData(const CaloClusterContainer *, bool calibFlag)
Retrieve basic parameters, mainly four-vectors.
AODCaloClusterRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
std::vector< std::string > m_otherKeys
a const_iterator facade to DataHandle.
Definition SGIterator.h:164
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
Extra patterns decribing particle interation process.