ATLAS Offline Software
Loading...
Searching...
No Matches
CaloLArRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "CaloLArRetriever.h"
6
8
10
11#include "CaloDetDescr/CaloDetDescrElement.h"
19#include "GaudiKernel/ThreadLocalContext.h"
20
21using Athena::Units::GeV;
22
23namespace JiveXML {
24
31 CaloLArRetriever::CaloLArRetriever(const std::string& type,const std::string& name,const IInterface* parent):
32 AthAlgTool(type,name,parent),
33 m_calocell_id(nullptr)
34 {
35
36 //Only declare the interface
37 declareInterface<IDataRetriever>(this);
38
39 declareInterface<IDataRetriever>(this);
40 declareProperty("LArlCellThreshold", m_cellThreshold = 50.);
41 declareProperty("RetrieveLAr" , m_lar = true);
42 declareProperty("DoBadLAr", m_doBadLAr = false);
43 declareProperty("DoLArCellDetails", m_doLArCellDetails = false);
44 declareProperty("CellConditionCut", m_cellConditionCut = false);
45 declareProperty("LArChannelsToIgnoreM5", m_LArChannelsToIgnoreM5);
46 declareProperty("DoMaskLArChannelsM5", m_doMaskLArChannelsM5 = false);
47
48 declareProperty("CellEnergyPrec", m_cellEnergyPrec = 3);
49 declareProperty("CellTimePrec", m_cellTimePrec = 3);
50 }
51
55
57
58 ATH_MSG_DEBUG( "Initialising Tool" );
59 ATH_CHECK( detStore()->retrieve (m_calocell_id, "CaloCell_ID") );
60
61 ATH_CHECK( m_sgKey.initialize() );
62 ATH_CHECK( m_cablingKey.initialize() );
64
65 return StatusCode::SUCCESS;
66 }
67
71 StatusCode CaloLArRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
72
73 ATH_MSG_DEBUG( "in retrieve()" );
74
76 if (!cellContainer.isValid()){
77 ATH_MSG_WARNING( "Could not retrieve Calorimeter Cells " );
78 }
79 else{
80 if(m_lar){
81 DataMap data = getLArData(&(*cellContainer));
82 ATH_CHECK( FormatTool->AddToEvent(dataTypeName(), m_sgKey.key(), &data) );
83 ATH_MSG_DEBUG( "LAr retrieved" );
84 }
85 }
86
87 //LAr cells retrieved okay
88 return StatusCode::SUCCESS;
89 }
90
91
97
98 ATH_MSG_DEBUG( "getLArData()" );
99 const EventContext& ctx = Gaudi::Hive::currentContext();
100
101 DataMap dataMap;
102
103 DataVect phi; phi.reserve(cellContainer->size());
104 DataVect eta; eta.reserve(cellContainer->size());
105 DataVect energy; energy.reserve(cellContainer->size());
106 DataVect idVec; idVec.reserve(cellContainer->size());
107 DataVect channel; channel.reserve(cellContainer->size());
108 DataVect feedThrough; feedThrough.reserve(cellContainer->size());
109 DataVect slot; slot.reserve(cellContainer->size());
110
111 DataVect cellTimeVec; cellTimeVec.reserve(cellContainer->size());
112 DataVect cellGain; cellGain.reserve(cellContainer->size());
113 DataVect cellPedestal; cellPedestal.reserve(cellContainer->size());
114 DataVect adc2Mev; adc2Mev.reserve(cellContainer->size());
115 DataVect BadCell; BadCell.reserve(cellContainer->size());
116
117 char rndStr[30]; // for rounding (3 digit precision)
118
121
122
123 const ILArPedestal* larPedestal = nullptr;
125 if( detStore()->retrieve(larPedestal).isFailure() ){
126 ATH_MSG_ERROR( "in getLArData(), Could not retrieve LAr Pedestal" );
127 }
128 }
129
130 const LArOnlineID* onlineId = nullptr;
131 if ( detStore()->retrieve(onlineId, "LArOnlineID").isFailure()) {
132 ATH_MSG_ERROR( "in getLArData(),Could not get LArOnlineID!" );
133 }
134
135 const LArADC2MeV* adc2mev = nullptr;
136 if (m_doLArCellDetails) {
138 adc2mev = *adc2mevH;
139 }
140
141 double energyGeV,cellTime;
142 double energyAllLArBarrel = 0.;
143
144 ATH_MSG_DEBUG( "Start iterator loop over cells" );
145
147 const LArOnOffIdMapping* cabling{*cablingHdl};
148 if(!cabling) {
149 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKey.key() );
150 return dataMap;
151 }
152
153
154 for(;it1!=it2;++it1){
155 if ((*it1)->energy() < m_cellThreshold) continue; // skip to next cell if threshold not passed
156
157 if((*it1)->badcell()){ BadCell.push_back(1); }
158 else{ BadCell.push_back(-1); }
159
160 if ((((*it1)->provenance()&0xFF)!=0xA5)&&m_cellConditionCut) continue; // check full conditions for LAr
161 Identifier cellid = (*it1)->ID();
162
163 HWIdentifier LArhwid = cabling->createSignalChannelIDFromHash((*it1)->caloDDE()->calo_hash());
164
165 //ignore LAr cells that are to be masked
167 bool maskChannel = false;
168 for (size_t i = 0; i < m_LArChannelsToIgnoreM5.size(); i++){
169 if (cellid == m_LArChannelsToIgnoreM5[i]){
170 maskChannel = true;
171 break; // exit loop over bad channels
172 }
173 }
174 if (maskChannel) continue; // continue loop over all channels
175 }
176 energyGeV = (*it1)->energy()*(1./GeV);
177 if (energyGeV == 0) energyGeV = 0.001; // 1 MeV due to LegoCut > 0.0 (couldn't be >= 0.0)
178 energy.emplace_back( gcvt( energyGeV, m_cellEnergyPrec, rndStr) );
179 energyAllLArBarrel += energyGeV;
180
181 idVec.emplace_back((Identifier::value_type)(*it1)->ID().get_compact() );
182 phi.emplace_back((*it1)->phi());
183 eta.emplace_back((*it1)->eta());
184 channel.emplace_back(onlineId->channel(LArhwid));
185 feedThrough.emplace_back(onlineId->feedthrough(LArhwid));
186 slot.emplace_back(onlineId->slot(LArhwid));
187
188 if ( m_doLArCellDetails){
189 cellTime = (*it1)->time();
190 cellTimeVec.emplace_back( gcvt( cellTime, m_cellTimePrec, rndStr) );
191 cellGain.emplace_back( (*it1)->gain() );
192
193 int largain = (*it1)->gain();
194 float pedestal=larPedestal->pedestal(LArhwid,largain);
195 float pedvalue=0;
196 if (pedestal >= (1.0+LArElecCalib::ERRORCODE)) pedvalue = pedestal;
197 else pedvalue = 0;
198 cellPedestal.emplace_back(pedvalue);
199 LArVectorProxy polynom_adc2mev = adc2mev->ADC2MEV(cellid,largain);
200 if (polynom_adc2mev.size()==0){ adc2Mev.emplace_back(-1); }
201 else{ adc2Mev.emplace_back(polynom_adc2mev[1]); }
202 }
203 }
204
205 ATH_MSG_DEBUG( " Total energy in LAr barrel in GeV : " << energyAllLArBarrel );
206
207 // write values into dataMap
208 const auto nEntries = phi.size() ;
209 dataMap["phi"] = std::move(phi);
210 dataMap["eta"] = std::move(eta);
211 dataMap["energy"] = std::move(energy);
212 dataMap["id"] = std::move(idVec);
213 dataMap["channel"] = std::move(channel);
214 dataMap["feedThrough"] = std::move(feedThrough);
215 dataMap["slot"] = std::move(slot);
216
217 //Bad Cells
218 if (m_doBadLAr==true) {
219 dataMap["BadCell"] = std::move(BadCell);
220 }
221
222 // adc counts
223 if ( m_doLArCellDetails){
224 dataMap["cellTime"] = std::move(cellTimeVec);
225 dataMap["cellGain"] = std::move(cellGain);
226 dataMap["cellPedestal"] = std::move(cellPedestal);
227 dataMap["adc2Mev"] = std::move(adc2Mev);
228 }
229 //Be verbose
230 ATH_MSG_DEBUG( dataTypeName() << " , collection: " << dataTypeName()
231 << " retrieved with " << nEntries << " entries" );
232
233 //All collections retrieved okay
234 return dataMap;
235
236 } // getLArData
237
238 //--------------------------------------------------------------------------
239
240} // JiveXML namespace
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Wrapper to avoid constant divisions when using units.
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)
const ServiceHandle< StoreGateSvc > & detStore() const
Container class for CaloCell.
CaloCellContainer::const_iterator beginConstCalo(CaloCell_ID::SUBCALO caloNum) const
get const iterators on cell of just one calo
CaloCellContainer::const_iterator endConstCalo(CaloCell_ID::SUBCALO caloNum) const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
size_type size() const noexcept
Returns the number of elements in the collection.
virtual float pedestal(const HWIdentifier &id, int gain) const =0
virtual std::string dataTypeName() const
Return the name of the data type.
SG::ReadHandleKey< CaloCellContainer > m_sgKey
for properties
CaloLArRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
const CaloCell_ID * m_calocell_id
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
std::vector< Identifier::value_type > m_LArChannelsToIgnoreM5
const DataMap getLArData(const CaloCellContainer *cellContainer)
Retrieve LAr cell location and details.
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
StatusCode initialize()
Default AthAlgTool methods.
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
Definition LArADC2MeV.h:32
int feedthrough(const HWIdentifier id) const
Return the feedthrough of a hardware cell identifier : feedthrough = [0,31] Barrel - A/C side or H/...
int slot(const HWIdentifier id) const
Return the slot number of a hardware cell identifier: slot = [1,15] Slot-ID in top part of the crat...
int channel(const HWIdentifier id) const
Return the channel number of a hardware cell identifier channel = [0,127] in all FEB.
Proxy for accessing a range of float values like a vector.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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