ATLAS Offline Software
AODCaloClusterRetriever.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 
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  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "in retrieveAll()" << endmsg;
44 
46  const CaloClusterContainer* ccc;
47 
48  //obtain the default collection first
49  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve " << dataTypeName() << " (" << m_sgKeyFavourite << ")" << endmsg;
50  StatusCode sc = evtStore()->retrieve(ccc, m_sgKeyFavourite);
51  if (sc.isFailure() ) {
52  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKeyFavourite << " not found in SG " << endmsg;
53  }else{
54  DataMap data = getData(ccc, false);
55  if ( FormatTool->AddToEvent(dataTypeName(), m_sgKeyFavourite, &data).isFailure()){
56  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << m_sgKeyFavourite << " not found in SG " << endmsg;
57  }else{
58  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << m_sgKeyFavourite << ") AODCaloCluster retrieved" << endmsg;
59  }
60  }
61 
62  // uncalibrated topo clusters: calibFlag=true
63  //obtain the default collection first
64  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve CaloCalTopoCluster (for non-calib)" << endmsg;
65  StatusCode sc3 = evtStore()->retrieve(ccc, "CaloCalTopoCluster");
66  if (sc3.isFailure() ) {
67  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection CaloCalTopoCluster (for non-calib) not found in SG " << endmsg;
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  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection CaloCalTopoCluster (for non-calib) not found in SG " << endmsg;
72  }else{
73  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " CaloCalTopoCluster (for non-calib) AODCaloCluster retrieved" << endmsg;
74  }
75  }
76 
77  if ( m_otherKeys.empty() ) {
78  //obtain all other collections from StoreGate
79  if (( evtStore()->retrieve(iterator, end)).isFailure()){
80  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) <<
81  "Unable to retrieve iterator for AODCaloCluster collection" << endmsg;
82 // return false;
83  }
84 
85  for (; iterator!=end; ++iterator) {
86 
87  std::string::size_type position = iterator.key().find("HLTAutoKey",0);
88  if ( m_doWriteHLT ){ position = 99; } // override SG key find
89 
90 // if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " AODCaloCluster: HLTAutoKey in " << iterator.key() << " at position "
91 // << position << endmsg;
92  if ( position != 0 ){ // SG key doesn't contain HLTAutoKey
93  if (iterator.key()!=m_sgKeyFavourite) {
94  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve all " << dataTypeName() << " (" << iterator.key() << ")" << endmsg;
95  DataMap data = getData(&(*iterator), false);
96  if ( FormatTool->AddToEvent(dataTypeName(), iterator.key(), &data).isFailure()){
97  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << iterator.key() << " not found in SG " << endmsg;
98  }else{
99  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << iterator.key() << ") AODCaloCluster retrieved" << endmsg;
100  }
101  }
102  }
103  }
104  }else {
105  //obtain all collections with the given keys
106  std::vector<std::string>::const_iterator keyIter;
107  for ( keyIter=m_otherKeys.begin(); keyIter!=m_otherKeys.end(); ++keyIter ){
108  StatusCode sc = evtStore()->retrieve( ccc, (*keyIter) );
109  if (!sc.isFailure()) {
110  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Trying to retrieve selected " << dataTypeName() << " (" << (*keyIter) << ")" << endmsg;
111  DataMap data = getData(ccc, false);
112  if ( FormatTool->AddToEvent(dataTypeName(), (*keyIter), &data).isFailure()){
113  if (msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Collection " << (*keyIter) << " not found in SG " << endmsg;
114  }else{
115  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << dataTypeName() << " (" << (*keyIter) << ") retrieved" << endmsg;
116  }
117  }
118  }
119  }
120  //All collections retrieved okay
121  return StatusCode::SUCCESS;
122  }
123 
124 
132 
133  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "retrieve()" << endmsg;
134 
136 
137  DataVect phi; phi.reserve(ccc->size());
138  DataVect eta; eta.reserve(ccc->size());
139  DataVect et; et.reserve(ccc->size());
140  DataVect cells; cells.reserve(ccc->size());
141  DataVect numCells; numCells.reserve(ccc->size());
142  DataVect idVec; idVec.reserve(ccc->size());
143  DataVect emfracVec; emfracVec.reserve(ccc->size());
144  DataVect labelVec; labelVec.reserve(ccc->size());
145 
146  std::string label="";
147  int id = 0;
148  int s = 0;
149  float eInSample = 0.;
150  float eInSampleFull = 0.;
151  float emfrac = 0.;
152  float rawemfrac = 0.;
153 
154 // cells n/a in AOD, but keep this for compatibility
155 // with 'full' clusters in AtlantisJava
156  std::string tagCells;
157  tagCells = "cells multiple=\"1.0\"";
158 
160  for (; itr != ccc->end(); ++itr) {
161 
162 // sum over samplings to get EMfraction:
164 // full sum:
165  for (s=0;s<CaloSampling::Unknown; s++){
166  eInSampleFull += (*itr)->eSample(CaloSampling::CaloSample(s));
167  }
168 // Now only EMB1-3, EME1-3 and FCAL1:
169  eInSample += (*itr)->eSample(CaloSampling::EMB1);
170  eInSample += (*itr)->eSample(CaloSampling::EMB2);
171  eInSample += (*itr)->eSample(CaloSampling::EMB3);
172  eInSample += (*itr)->eSample(CaloSampling::EME1);
173  eInSample += (*itr)->eSample(CaloSampling::EME2);
174  eInSample += (*itr)->eSample(CaloSampling::EME3);
175  eInSample += (*itr)->eSample(CaloSampling::FCAL1);
176 
177  emfrac = eInSample/eInSampleFull;
178  rawemfrac = emfrac;
179 // sanity cut: emfrac should be within [0,1]
180  if ( emfrac > 1.0 ) emfrac = 1.;
181  if ( emfrac < 0.0 ) emfrac = 0.;
182  emfracVec.push_back( emfrac );
183 
184  label = "AllMeV_SumEMSampl=" + DataType( eInSample ).toString() +
185  "_SumAllSampl=" + DataType( eInSampleFull ).toString() +
186  "_basicEnergy=" + DataType( (*itr)->getBasicEnergy()).toString() +
187  "_calcEMFrac=" + DataType( rawemfrac ).toString()+
188  "_outEMFrac=" + DataType( emfrac ).toString();
189  eInSample = 0.;
190  eInSampleFull = 0.;
191 
192  labelVec.push_back( label );
193  if (msgLvl(MSG::DEBUG)) {
194  msg(MSG::DEBUG) << "label is " << label << endmsg;
195  }
196 
197 // now the standard variables
198 
199  phi.push_back(DataType((*itr)->phi()));
200  eta.push_back(DataType((*itr)->eta()));
201  if (!calibFlag){ // default: just take et
202  et.push_back(DataType((*itr)->et()/CLHEP::GeV));
203  }else{ // non-calib energies: need to convert to et by hand
204  et.push_back(DataType( (((*itr)->getBasicEnergy()/CLHEP::GeV)*((*itr)->sinTh())) ));
207  }
208  // emfrac.push_back(DataType( (*itr)->getMomentValue(CaloClusterMoment::ENG_FRAC_EM) )); // doesn't work for AOD
209  numCells.push_back(DataType( "0" ));
210  cells.push_back(DataType( "0" ));
211  idVec.push_back(DataType( ++id ));
212 
213 // if (msgLvl(MSG::DEBUG)) {
214 // msg(MSG::DEBUG) << dataTypeName() << " cluster basic=" << (*itr)->getBasicEnergy()/CLHEP::GeV << " ,e=" << (*itr)->e()/CLHEP::GeV << ", et=";
215 // msg(MSG::DEBUG) << (*itr)->et()/CLHEP::GeV << ", eta=" << (*itr)->eta() << ", phi=" << (*itr)->phi() << ", sinTheta=" <<
216 // (*itr)->sinTh() << ",calc=" << ((*itr)->getBasicEnergy()/CLHEP::GeV)*((*itr)->sinTh()) << endmsg;
217 // }
218 
219  }
220  // Start with mandatory entries
221  DataMap["phi"] = phi;
222  DataMap["eta"] = eta;
223  DataMap["et"] = et;
224  DataMap[tagCells] = cells;
225  DataMap["numCells"] = numCells;
226  DataMap["id"] = idVec;
227  DataMap["emfrac"] = emfracVec; // not in Atlantis yet ! Could be used in legoplot
228  DataMap["label"] = labelVec; // not in Atlantis yet !
229 
230  //Be verbose
231  if (msgLvl(MSG::DEBUG)) {
232  msg(MSG::DEBUG) << dataTypeName() << " (AOD, no cells), collection: " << dataTypeName();
233  msg(MSG::DEBUG) << " retrieved with " << phi.size() << " entries"<< endmsg;
234  }
235 
236  //All collections retrieved okay
237  return DataMap;
238 
239  } // retrieve
240 
241  //--------------------------------------------------------------------------
242 
243 } // JiveXML namespace
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:271
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.
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
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
xAOD::et
et
Definition: TrigEMCluster_v1.cxx:25
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
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
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
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
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
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
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
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:131
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
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
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
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
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
CaloVariableType.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
SG::ConstIterator
Definition: SGIterator.h:163
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.