ATLAS Offline Software
Loading...
Searching...
No Matches
CaloHECRetriever.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "CaloHECRetriever.h"
6
8
10
11#include "CaloDetDescr/CaloDetDescrElement.h"
19#include "GaudiKernel/ThreadLocalContext.h"
20
21using Athena::Units::GeV;
22
23namespace JiveXML {
24
28
30
31 ATH_MSG_DEBUG( "Initialising Tool" );
32 ATH_CHECK( detStore()->retrieve (m_calocell_id, "CaloCell_ID") );
33
34 ATH_CHECK( m_sgKey.initialize() );
35 ATH_CHECK( m_cablingKey.initialize() );
37
38 return StatusCode::SUCCESS;
39 }
40
44 StatusCode CaloHECRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
45
46 ATH_MSG_DEBUG( "in retrieve()" );
47
49 if (!cellContainer.isValid()){
50 ATH_MSG_WARNING( "Could not retrieve Calorimeter Cells " );
51 }
52 else{
53 if(m_hec){
54 DataMap data = getHECData(&(*cellContainer));
55 ATH_CHECK( FormatTool->AddToEvent(dataTypeName(), m_sgKey.key(), &data) );
56 ATH_MSG_DEBUG( "HEC retrieved" );
57 }
58 }
59
60 //HEC cells retrieved okay
61 return StatusCode::SUCCESS;
62 }
63
64
70
71 ATH_MSG_DEBUG( "getHECData()" );
72 const EventContext& ctx = Gaudi::Hive::currentContext();
73
74 DataMap dataMap;
75
76 DataVect phi; phi.reserve(cellContainer->size());
77 DataVect eta; eta.reserve(cellContainer->size());
78 DataVect energy; energy.reserve(cellContainer->size());
79 DataVect idVec; idVec.reserve(cellContainer->size());
80 DataVect channel; channel.reserve(cellContainer->size());
81 DataVect feedThrough; feedThrough.reserve(cellContainer->size());
82 DataVect slot; slot.reserve(cellContainer->size());
83
84 DataVect cellTimeVec; cellTimeVec.reserve(cellContainer->size());
85 DataVect cellGain; cellGain.reserve(cellContainer->size());
86 DataVect cellPedestal; cellPedestal.reserve(cellContainer->size());
87 DataVect adc2Mev; adc2Mev.reserve(cellContainer->size());
88 DataVect BadCell; BadCell.reserve(cellContainer->size());
89
90 char rndStr[30]; // for rounding (3 digit precision)
91
94
95
97 const LArOnOffIdMapping* cabling{*cablingHdl};
98 if(!cabling) {
99 ATH_MSG_ERROR ("Could not get cabling mapping from key " << m_cablingKey.key() );
100 return dataMap;
101 }
102
103 const ILArPedestal* larPedestal = nullptr;
105 if( detStore()->retrieve(larPedestal).isFailure() ){
106 ATH_MSG_ERROR( "in getHECData(), Could not retrieve LAr Pedestal" );
107 }
108 }
109
110 const LArOnlineID* onlineId = nullptr;
111 if ( detStore()->retrieve(onlineId, "LArOnlineID").isFailure()) {
112 ATH_MSG_ERROR( "in getHECData(),Could not get LArOnlineID!" );
113 }
114
115 const LArADC2MeV* adc2mev = nullptr;
116 if (m_doHECCellDetails) {
118 adc2mev = *adc2mevH;
119 }
120
121 double energyGeV{},cellTime{};
122 double energyAllLArHEC = 0.;
123
124 for(;it1!=it2;++it1){
125 if ((*it1)->energy() < m_cellThreshold) continue; // skip to next cell if threshold not passed
126
127 if((*it1)->badcell()){ BadCell.push_back(1); }
128 else{ BadCell.push_back(-1); }
129
130 if ((((*it1)->provenance()&0xFF)!=0xA5)&&m_cellConditionCut) continue; // check full conditions for HEC
131 Identifier cellid = (*it1)->ID();
132
133 HWIdentifier LArhwid = cabling->createSignalChannelIDFromHash((*it1)->caloDDE()->calo_hash());
134
135 //ignore HEC cells that are to be masked
137 bool maskChannel = false;
138 for (size_t i = 0; i < m_LArChannelsToIgnoreM5.size(); i++){
139 if (cellid == m_LArChannelsToIgnoreM5[i]){
140 maskChannel = true;
141 break; // exit loop over bad channels
142 }
143 }
144 if (maskChannel) continue; // continue loop over all channels
145 }
146
147 energyGeV = (*it1)->energy()*(1./GeV);
148 energy.emplace_back( gcvt( energyGeV, m_cellEnergyPrec, rndStr) );
149 energyAllLArHEC += energyGeV;
150
151 idVec.emplace_back((Identifier::value_type)(*it1)->ID().get_compact() );
152 phi.emplace_back((*it1)->phi());
153 eta.emplace_back((*it1)->eta());
154 channel.emplace_back(onlineId->channel(LArhwid));
155 feedThrough.emplace_back(onlineId->feedthrough(LArhwid));
156 slot.emplace_back(onlineId->slot(LArhwid));
157
158 if ( m_doHECCellDetails){
159 cellTime = (*it1)->time();
160 cellTimeVec.emplace_back( gcvt( cellTime, m_cellTimePrec, rndStr) );
161 cellGain.emplace_back( (*it1)->gain() );
162
163 int hecgain = (*it1)->gain();
164 float pedestal=larPedestal->pedestal(LArhwid,hecgain);
165 float pedvalue=0;
166 if (pedestal >= (1.0+LArElecCalib::ERRORCODE)) pedvalue = pedestal;
167 else pedvalue = 0;
168 cellPedestal.emplace_back(pedvalue);
169
170 LArVectorProxy polynom_adc2mev = adc2mev->ADC2MEV(cellid,hecgain);
171 if (polynom_adc2mev.size()==0){ adc2Mev.emplace_back(-1); }
172 else{ adc2Mev.emplace_back(polynom_adc2mev[1]); }
173 }
174 }
175
176 ATH_MSG_DEBUG( " Total energy in HEC (LAr) in GeV : " << energyAllLArHEC );
177
178 // write values into DataMap
179 const auto nEntries = phi.size();
180 dataMap["phi"] = std::move(phi);
181 dataMap["eta"] = std::move(eta);
182 dataMap["energy"] = std::move(energy);
183 dataMap["id"] = std::move(idVec);
184 dataMap["channel"] = std::move(channel);
185 dataMap["feedThrough"] = std::move(feedThrough);
186 dataMap["slot"] = std::move(slot);
187 //Bad Cells
188 if (m_doBadHEC==true) {
189 dataMap["BadCell"] = std::move(BadCell);
190 }
191 // adc counts
192 if ( m_doHECCellDetails){
193 dataMap["cellTime"] = std::move(cellTimeVec);
194 dataMap["cellGain"] = std::move(cellGain);
195 dataMap["cellPedestal"] = std::move(cellPedestal);
196 dataMap["adc2Mev"] = std::move(adc2Mev);
197 }
198 //Be verbose
199 ATH_MSG_DEBUG( dataTypeName() << " , collection: " << dataTypeName()
200 << " retrieved with " << nEntries << " entries" );
201
202
203 //All collections retrieved okay
204 return dataMap;
205
206 } // getHECData
207
208 //--------------------------------------------------------------------------
209
210} // 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.
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 StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool) override
Retrieve all the data.
virtual std::string dataTypeName() const override
Return the name of the data type.
const DataMap getHECData(const CaloCellContainer *cellContainer)
Retrieve HEC cell location and details.
Gaudi::Property< std::vector< Identifier::value_type > > m_LArChannelsToIgnoreM5
Gaudi::Property< bool > m_hec
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
virtual StatusCode initialize() override
Default AthAlgTool methods.
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Gaudi::Property< int > m_cellEnergyPrec
Gaudi::Property< bool > m_cellConditionCut
Gaudi::Property< bool > m_doHECCellDetails
const CaloCell_ID * m_calocell_id
Gaudi::Property< bool > m_doMaskLArChannelsM5
Gaudi::Property< double > m_cellThreshold
Gaudi::Property< int > m_cellTimePrec
SG::ReadHandleKey< CaloCellContainer > m_sgKey
for properties
Gaudi::Property< bool > m_doBadHEC
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