ATLAS Offline Software
Loading...
Searching...
No Matches
CaloFCalRetriever.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 "CaloFCalRetriever.h"
6
8
10#include "CaloDetDescr/CaloDetDescrElement.h"
18#include "GaudiKernel/ThreadLocalContext.h"
20
21using Athena::Units::GeV;
22
23namespace JiveXML {
24
31 CaloFCalRetriever::CaloFCalRetriever(const std::string& type,const std::string& name,const IInterface* parent):
32 AthAlgTool(type,name,parent),
33 m_calocell_id(nullptr)
34 {
35 //Only declare the interface
36 declareInterface<IDataRetriever>(this);
37
38 declareInterface<IDataRetriever>(this);
39 declareProperty("FCallCellThreshold", m_cellThreshold = 50.);
40 declareProperty("RetrieveFCal" , m_fcal = true);
41 declareProperty("DoBadFCal", m_doBadFCal = false);
42 declareProperty("DoFCalCellDetails", m_doFCalCellDetails = false);
43 declareProperty("CellConditionCut", m_cellConditionCut = false);
44 declareProperty("LArChannelsToIgnoreM5", m_LArChannelsToIgnoreM5);
45 declareProperty("DoMaskLArChannelsM5", m_doMaskLArChannelsM5 = false);
46
47 declareProperty("CellEnergyPrec", m_cellEnergyPrec = 3);
48 declareProperty("CellTimePrec", m_cellTimePrec = 3);
49 }
50
54
56
57 ATH_MSG_DEBUG( "Initialising Tool" );
58 ATH_CHECK( detStore()->retrieve (m_calocell_id, "CaloCell_ID") );
59
60 ATH_CHECK( m_sgKey.initialize() );
61 ATH_CHECK( m_cablingKey.initialize() );
63
64 return StatusCode::SUCCESS;
65 }
66
70 StatusCode CaloFCalRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
71
72 ATH_MSG_DEBUG( "in retrieve()" );
73
75 if (!cellContainer.isValid()){
76 ATH_MSG_WARNING( "Could not retrieve Calorimeter Cells " );
77 }
78 else{
79 if(m_fcal){
80 DataMap data = getFCalData(&(*cellContainer));
81 ATH_CHECK( FormatTool->AddToEvent(dataTypeName(), m_sgKey.key(), &data) );
82 ATH_MSG_DEBUG( "FCal retrieved" );
83 }
84 }
85
86 //FCal cells retrieved okay
87 return StatusCode::SUCCESS;
88 }
89
90
96
97 ATH_MSG_DEBUG( "getFCalData()" );
98 const EventContext& ctx = Gaudi::Hive::currentContext();
99
101
102 DataVect x; x.reserve(cellContainer->size());
103 DataVect y; y.reserve(cellContainer->size());
104 DataVect z; z.reserve(cellContainer->size());
105 DataVect dx; dx.reserve(cellContainer->size());
106 DataVect dy; dy.reserve(cellContainer->size());
107 DataVect dz; dz.reserve(cellContainer->size());
108
109 DataVect energy; energy.reserve(cellContainer->size());
110 DataVect idVec; idVec.reserve(cellContainer->size());
111 DataVect channel; channel.reserve(cellContainer->size());
112 DataVect feedThrough; feedThrough.reserve(cellContainer->size());
113 DataVect slot; slot.reserve(cellContainer->size());
114 DataVect sub; sub.reserve(cellContainer->size());
115
116 DataVect cellTimeVec; cellTimeVec.reserve(cellContainer->size());
117 DataVect cellGain; cellGain.reserve(cellContainer->size());
118 DataVect cellPedestal; cellPedestal.reserve(cellContainer->size());
119 DataVect adc2Mev; adc2Mev.reserve(cellContainer->size());
120 DataVect BadCell; BadCell.reserve(cellContainer->size());
121
122 char rndStr[30]; // for rounding (3 digit precision)
123
126
128 const LArOnOffIdMapping* cabling{*cablingHdl};
129
130 if(!cabling) {
131 ATH_MSG_WARNING( "Do not have cabling mapping from key " << m_cablingKey.key() );
132 return DataMap;
133 }
134
135 const ILArPedestal* larPedestal = nullptr;
137 if( detStore()->retrieve(larPedestal).isFailure() ){
138 ATH_MSG_ERROR( "in getFCalData(), Could not retrieve LAr Pedestal" );
139 }
140 }
141
142 const LArOnlineID* onlineId;
143 if ( detStore()->retrieve(onlineId, "LArOnlineID").isFailure()) {
144 ATH_MSG_ERROR( "in getFCalData(),Could not get LArOnlineID!" );
145 }
146
147 const LArADC2MeV* adc2mev = nullptr;
150 adc2mev = *adc2mevH;
151 }
152
153 double energyGeV, xmm, ymm, zmm, dxmm, dymm, dzmm, cellTime;
154 double energyAllLArFcal = 0.;
155
156 for(;it1!=it2;++it1){
157
158 if((*it1)->badcell()) BadCell.push_back(1);
159 else if((*it1)->energy()>= m_cellThreshold) BadCell.push_back(0);
160 else BadCell.push_back(-1);
161
162 if ((((*it1)->provenance()&0xFF)!=0xA5)&&m_cellConditionCut) continue; // check full conditions for FCal
163 Identifier cellid = (*it1)->ID();
164
165 HWIdentifier LArhwid = cabling->createSignalChannelIDFromHash((*it1)->caloDDE()->calo_hash());
166
167 //ignore FCal cells that are to be masked
169 bool maskChannel = false;
170 for (size_t i = 0; i < m_LArChannelsToIgnoreM5.size(); i++){
171 if (cellid == m_LArChannelsToIgnoreM5[i]){
172 maskChannel = true;
173 break; // exit loop over bad channels
174 }
175 }
176 if (maskChannel) continue; // continue loop over all channels
177 }
178
179 energyGeV = (*it1)->energy()*(1./GeV);
180 energy.emplace_back( gcvt( energyGeV, m_cellEnergyPrec, rndStr) );
181 energyAllLArFcal += energyGeV;
182 idVec.emplace_back((Identifier::value_type)(*it1)->ID().get_compact() );
183
184 xmm = (*it1)->x()*0.1;
185 ymm = (*it1)->y()*0.1;
186 zmm = (*it1)->z()*0.1;
187 x.emplace_back( gcvt( xmm, 4, rndStr) );
188 y.emplace_back( gcvt( ymm, 4, rndStr) );
189 z.emplace_back( gcvt( zmm, 4, rndStr) );
190
191 channel.emplace_back(onlineId->channel(LArhwid));
192 feedThrough.emplace_back(onlineId->feedthrough(LArhwid));
193 slot.emplace_back(onlineId->slot(LArhwid));
194
196 cellTime = (*it1)->time();
197 cellTimeVec.emplace_back( gcvt( cellTime, m_cellTimePrec, rndStr) );
198 cellGain.emplace_back( (*it1)->gain() );
199
200 int fcalgain = (*it1)->gain();
201 float pedestal=larPedestal->pedestal(LArhwid,fcalgain);
202 float pedvalue=0;
203 if (pedestal >= (1.0+LArElecCalib::ERRORCODE)) pedvalue = pedestal;
204 else pedvalue = 0;
205 cellPedestal.emplace_back(pedvalue);
206
207 LArVectorProxy polynom_adc2mev = adc2mev->ADC2MEV(cellid,fcalgain);
208 if (polynom_adc2mev.size()==0){ adc2Mev.emplace_back(-1); }
209 else{ adc2Mev.emplace_back(polynom_adc2mev[1]); }
210 }
211
212 const CaloDetDescrElement* elt = (*it1)->caloDDE();
213
214 dxmm = elt->dx()*0.1;
215 dymm = elt->dy()*0.1;
216 dzmm = elt->dz()*0.1;
217 dx.emplace_back( gcvt( dxmm, 4, rndStr) );
218 dy.emplace_back( gcvt( dymm, 4, rndStr) );
219 dz.emplace_back( gcvt( dzmm, 4, rndStr) );
220
221 if(m_calocell_id->pos_neg(cellid)==2)
222 sub.emplace_back(1);
223 else
224 sub.emplace_back(0);
225 }
226
227 ATH_MSG_DEBUG( " Total energy in FCAL (LAr) in GeV : " << energyAllLArFcal );
228
229 // write values into DataMap
230 const auto nEntries = x.size();
231 DataMap["x"] = std::move(x);
232 DataMap["y"] = std::move(y);
233 DataMap["z"] = std::move(z);
234 DataMap["dx"] = std::move(dx);
235 DataMap["dy"] = std::move(dy);
236 DataMap["dz"] = std::move(dz);
237 DataMap["energy"] = std::move(energy);
238 DataMap["id"] = std::move(idVec);
239 DataMap["channel"] = std::move(channel);
240 DataMap["feedThrough"] = std::move(feedThrough);
241 DataMap["slot"] = std::move(slot);
242 //Bad Cells
243 if (m_doBadFCal) {
244 DataMap["BadCell"] = std::move(BadCell);
245 } DataMap["sub"] = std::move(sub);
246
247 // adc counts
249 DataMap["cellTime"] = std::move(cellTimeVec);
250 DataMap["cellGain"] = std::move(cellGain);
251 DataMap["cellPedestal"] = std::move(cellPedestal);
252 DataMap["adc2Mev"] = std::move(adc2Mev);
253 }
254 //Be verbose
255 ATH_MSG_DEBUG( dataTypeName() << " retrieved with " << nEntries << " entries" );
256
257 //All collections retrieved okay
258 return DataMap;
259
260 } // getFCalData
261
262 //--------------------------------------------------------------------------
263
264} // JiveXML namespace
#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.
#define y
#define x
#define z
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
This class groups all DetDescr information related to a CaloCell.
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
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
CaloFCalRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
std::vector< Identifier::value_type > m_LArChannelsToIgnoreM5
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
virtual std::string dataTypeName() const
Return the name of the data type.
SG::ReadHandleKey< CaloCellContainer > m_sgKey
for properties
const CaloCell_ID * m_calocell_id
StatusCode initialize()
Default AthAlgTool methods.
const DataMap getFCalData(const CaloCellContainer *cellContainer)
Retrieve FCal cell location and details.
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