ATLAS Offline Software
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 
14 namespace JiveXML {
15 
22  AODCaloClusterRetriever::AODCaloClusterRetriever(const std::string& type,const std::string& name,const IInterface* 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
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:281
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
et
Extra patterns decribing particle interation process.
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:18
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
JiveXML::AODCaloClusterRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: AODCaloClusterRetriever.cxx:41
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
xAOD::et
et
Definition: TrigEMCluster_v1.cxx:25
CaloClusterContainer
Storable container for CaloCluster.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloClusterContainer.h:37
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
CaloCell_ID_FCS::FCAL1
@ FCAL1
Definition: FastCaloSim_CaloCell_ID.h:41
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
JiveXML::AODCaloClusterRetriever::AODCaloClusterRetriever
AODCaloClusterRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: AODCaloClusterRetriever.cxx:22
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:92
AODCaloClusterRetriever.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
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
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Definition: AthCommonDataStore.h:145
add-xsec-uncert-quadrature-N.label
label
Definition: add-xsec-uncert-quadrature-N.py:104
test_pyathena.parent
parent
Definition: test_pyathena.py:15
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
JiveXML::AODCaloClusterRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: AODCaloClusterRetriever.h:46
JiveXML::AODCaloClusterRetriever::getData
const DataMap getData(const CaloClusterContainer *, bool calibFlag)
Retrieve basic parameters, mainly four-vectors.
Definition: AODCaloClusterRetriever.cxx:128
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:240
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
CaloClusterMoment.h
JiveXML::AODCaloClusterRetriever::m_otherKeys
std::vector< std::string > m_otherKeys
Definition: AODCaloClusterRetriever.h:52
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
xAOD::TauJetParameters::numCells
@ numCells
Definition: TauDefs.h:171
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
JiveXML::AODCaloClusterRetriever::m_sgKeyFavourite
std::string m_sgKeyFavourite
Definition: AODCaloClusterRetriever.h:51
JiveXML::AODCaloClusterRetriever::m_doWriteHLT
bool m_doWriteHLT
Definition: AODCaloClusterRetriever.h:53
AthAlgTool
Definition: AthAlgTool.h:26
dqBeamSpot.nEntries
int nEntries
Definition: dqBeamSpot.py:72
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
CaloVariableType.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
SG::ConstIterator
Definition: SGIterator.h:164
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.