ATLAS Offline Software
Loading...
Searching...
No Matches
FCALHVManager.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "LArHV/FCALHVLine.h"
7
8#include "FCALHVPayload.h"
9
11#include "GaudiKernel/ISvcLocator.h"
12#include "GaudiKernel/IToolSvc.h"
13#include "GaudiKernel/Bootstrap.h"
14#include "GaudiKernel/ServiceHandle.h"
22
23#if !(defined(SIMULATIONBASE) || defined(GENERATIONBASE))
25#endif
26
27#include <atomic>
28
29
30namespace {
31
32
33struct SimIdFunc
34{
35 SimIdFunc();
36 std::vector<HWIdentifier> operator()(HWIdentifier id) const
37 {
38 return m_cablingTool->getLArElectrodeIDvec (id);
39 }
40 LArHVCablingSimTool* m_cablingTool;
41};
42
43
44SimIdFunc::SimIdFunc()
45{
46 ToolHandle<LArHVCablingSimTool> tool ("LArHVCablingSimTool");
47 if (!tool.retrieve().isSuccess()) {
48 std::abort();
49 }
50 m_cablingTool = tool.get();
51}
52
53
54} // Anonymous namespace
55
56
58public:
59 explicit Clockwork(const FCALHVManager* manager)
60 {
61 for(int iSide=0; iSide<2; ++iSide) {
62 for(int iSector=0; iSector<16; ++iSector) {
63 for(int iSampling=0; iSampling<3; ++iSampling) {
64 moduleArray[iSide][iSector][iSampling] = std::make_unique<FCALHVModule>(manager,iSide,iSector,iSampling);
65 }
66 }
67 }
68
69 ServiceHandle<StoreGateSvc> detStore ("DetectorStore", "HECHVManager");
70 if (StatusCode::SUCCESS!=detStore->retrieve(elecId, "LArElectrodeID")) {
71 throw std::runtime_error("FCALHVManager failed to retrieve LArElectrodeID");
72 }
73
74 if (StatusCode::SUCCESS!=detStore->retrieve(hvId,"LArHVLineID")) {
75 throw std::runtime_error("FCALHVManager failed to retrieve LArHVLineID");
76 }
77 }
78 ~Clockwork() = default;
79 std::unique_ptr<const FCALHVModule> moduleArray[2][16][3];
80 const LArElectrodeID* elecId = nullptr;
81 const LArHVLineID* hvId = nullptr;
82};
83
84
86{
87public:
88 std::vector<FCALHVPayload> m_payloadArray;
89};
90
91
93
94
95FCALHVManager::FCALHVData::FCALHVData (std::unique_ptr<Payload> payload)
96 : m_payload (std::move (payload))
97{
98}
99
100
103 if (this != &other) {
104 m_payload = std::move (other.m_payload);
105 }
106 return *this;
107}
108
109
111
112
114{
115 return voltage (line) > INVALID;
116}
117
118
120{
121 return m_payload->m_payloadArray[index(line)].voltage;
122}
123
124
126{
127 return m_payload->m_payloadArray[index(line)].current;
128}
129
130
132{
133 return m_payload->m_payloadArray[index(line)].hvLineNo;
134}
135
136
138{
139 unsigned int lineIndex = line.getLineIndex();
140 const FCALHVModule& module = line.getModule();
141 unsigned int sectorIndex = module.getSectorIndex();
142 unsigned int sideIndex = module.getSideIndex();
143 unsigned int samplingIndex = module.getSamplingIndex();
144 unsigned int index = 192*sideIndex+12*sectorIndex+4*samplingIndex+lineIndex;
145 return index;
146}
147
148
150 : m_c (std::make_unique<Clockwork> (this))
151{
152}
153
155= default;
156
158{
159 return 0;
160}
161
163{
164 return 2;
165}
166
167unsigned int FCALHVManager::beginSectorIndex(unsigned int /*iSampling*/)
168{
169 return 0;
170}
171
172unsigned int FCALHVManager::endSectorIndex(unsigned int iSampling)
173{
174 if (iSampling==0) return 16;
175 if (iSampling==1) return 8;
176 if (iSampling==2) return 4;
177 return 0;
178}
179
181{
182 return 0;
183}
184
186{
187 return 3;
188}
189
190const FCALHVModule& FCALHVManager::getHVModule(unsigned int iSide, unsigned int iSector, unsigned int iSampling) const
191{
192 return *(m_c->moduleArray[iSide][iSector][iSampling]);
193}
194
197 const std::vector<const CondAttrListCollection*>& attrLists) const
198{
199 auto payload = std::make_unique<FCALHVData::Payload>();
200 payload->m_payloadArray.reserve(2*16*3*4);
201 for (unsigned int i=0;i<384;i++) {
202 payload->m_payloadArray[i].voltage = FCALHVData::INVALID;
203 }
204
205 for (const CondAttrListCollection* atrlistcol : attrLists) {
206
207 for (CondAttrListCollection::const_iterator citr=atrlistcol->begin(); citr!=atrlistcol->end();++citr) {
208
209 // 1. decode COOL Channel ID
210 unsigned int chanID = (*citr).first;
211 int cannode = chanID/1000;
212 int line = chanID%1000;
213
214 // 2. Construct the identifier
215 HWIdentifier id = m_c->hvId->HVLineId(1,1,cannode,line);
216
217 const std::vector<HWIdentifier>& electrodeIdVec = idfunc(id);
218
219 for(size_t i=0;i<electrodeIdVec.size();i++) {
220
221 HWIdentifier elecHWID = electrodeIdVec[i];
222 int detector = m_c->elecId->detector(elecHWID);
223 if (detector==5) {
224
225 float voltage = FCALHVData::INVALID;;
226 if (!((*citr).second)["R_VMEAS"].isNull()) voltage = ((*citr).second)["R_VMEAS"].data<float>();
227 float current = 0.;
228 if (!((*citr).second)["R_IMEAS"].isNull()) current = ((*citr).second)["R_IMEAS"].data<float>();
229
230 unsigned int sideIndex=1-m_c->elecId->zside(elecHWID); // 0 C side, 1 A side (unline HV numbering)
231 unsigned int samplingIndex=m_c->elecId->hv_eta(elecHWID)-1; // 0 to 2 for the FCAL modules 1-2-3
232 unsigned int sectorIndex=m_c->elecId->module(elecHWID); // 0-15 FCAL1, 0-7 FCAl2, 0-3 FCAL3
233 unsigned int lineIndex=m_c->elecId->gap(elecHWID); // 0-3
234
235 // do we have to worry about phi sector numbering running backwards in phi for z<0 like in EM/HEC ????
236
237 unsigned int index = 192*sideIndex+12*sectorIndex+4*samplingIndex+lineIndex;
238
239 if (index>384) {
240 MsgStream msg (Athena::getMessageSvc(), "EMECHVManager");
241 msg << MSG::ERROR << " invalid index for FCAL " << sideIndex << " " << samplingIndex << " " << sectorIndex << " " << lineIndex << endmsg;
242 continue;
243 }
244
245
246 payload->m_payloadArray[index].voltage=voltage;
247 payload->m_payloadArray[index].current=current;
248 payload->m_payloadArray[index].hvLineNo=chanID;
249 } // if FCAL
250 } // loop over electrodes
251 } // loop over collection
252 } // loop over folders
253
254 return {std::move (payload)};
255}
256
259{
260 std::vector<const CondAttrListCollection*> attrLists;
261 ServiceHandle<StoreGateSvc> detStore ("DetectorStore", "EMBHVManager");
262 const CondAttrListCollection* atrlistcol = nullptr;
263 // Not a typo --- this folder has a lower-case l in the database...
264 if (detStore->retrieve(atrlistcol, "/LAR/DCS/HV/BARREl/I16").isSuccess()) {
265 attrLists.push_back (atrlistcol);
266 }
267 if (detStore->retrieve(atrlistcol, "/LAR/DCS/HV/BARREL/I8").isSuccess()) {
268 attrLists.push_back (atrlistcol);
269 }
270 return getData (SimIdFunc(), attrLists);
271}
272
273
274#if !(defined(SIMULATIONBASE) || defined(GENERATIONBASE))
277 const std::vector<const CondAttrListCollection*>& attrLists) const
278{
279 auto idfunc = [&] (HWIdentifier id) -> const std::vector<HWIdentifier>
280 { return hvIdMapping.getLArElectrodeIDvec(id); };
281 return getData (idfunc, attrLists);
282}
283
284
286 , const LArHVIdMapping* hvIdMapping
287 , HWIdentifier *hvlId) const
288{
289 const FCALHVModule& module = line.getModule();
290 int sideIndex = module.getSideIndex();
291 int sectorIndex = module.getSectorIndex();
292 int samplingIndex = module.getSamplingIndex();
293 int lineIndex = line.getLineIndex();
294
295 // ________________________ Construct ElectrodeID ________________________________
296 int id_detector = 5;
297 int id_zside = 1-sideIndex;
298 int id_module = sectorIndex;
299 int id_hv_phi{0};
300 int id_hv_eta = samplingIndex + 1;
301 int id_gap = lineIndex;
302 int id_electrode{0};
303
304 HWIdentifier elecHWID = m_c->elecId->ElectrodeId(id_detector
305 , id_zside
306 , id_module
307 , id_hv_phi
308 , id_hv_eta
309 , id_gap
310 , id_electrode);
311 // ________________________ ________________________________
312
313 // Get LArHVLineID corresponding to a given LArElectrodeId
314 HWIdentifier id = hvIdMapping->getLArHVLineID(elecHWID);
315
316 if(hvlId) *hvlId=id;
317
318 // Extract HV Line No
319 return m_c->hvId->can_node(id)*1000 + m_c->hvId->hv_line(id);
320}
321#endif
#define endmsg
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
This class is a collection of AttributeLists where each one is associated with a channel number.
ChanAttrListMap::const_iterator const_iterator
const LArHVLineID * hvId
Clockwork(const FCALHVManager *manager)
const LArElectrodeID * elecId
std::unique_ptr< const FCALHVModule > moduleArray[2][16][3]
std::vector< FCALHVPayload > m_payloadArray
bool hvOn(const FCALHVLine &line) const
std::unique_ptr< Payload > m_payload
static int index(const FCALHVLine &line)
static constexpr double INVALID
FCALHVData & operator=(FCALHVData &&other) noexcept
double current(const FCALHVLine &line) const
double voltage(const FCALHVLine &line) const
int hvLineNo(const FCALHVLine &line) const
static unsigned int beginSideIndex()
static unsigned int endSamplingIndex()
static unsigned int endSideIndex()
FCALHVData getDataSim() const
int hvLineNo(const FCALHVLine &line, const LArHVIdMapping *hvIdMapping, HWIdentifier *hvlId=nullptr) const
std::unique_ptr< const Clockwork > m_c
static unsigned int beginSectorIndex(unsigned int iSampling)
static unsigned int beginSamplingIndex()
const FCALHVModule & getHVModule(unsigned int iSide, unsigned int iSector, unsigned int iSampling) const
static unsigned int endSectorIndex(unsigned int iSampling)
FCALHVData getData(const LArHVIdMapping &hvIdMapping, const std::vector< const CondAttrListCollection * > &attrLists) const
std::function< std::vector< HWIdentifier >(HWIdentifier)> idfunc_t
Describes one HV Module within the FCAL.
Helper for the Liquid Argon Calorimeter cell at the electrode level.
const std::vector< HWIdentifier > & getLArElectrodeIDvec(HWIdentifier &hvlineId) const
Return a vector of LArElectrodeID corresponding to a given LArHVLineID.
const HWIdentifier getLArHVLineID(HWIdentifier &electrodeId) const
Return the LArHVLineID corresponding to a given LArElectrodeId.
Helper for the Liquid Argon Calorimeter High-Voltage identifiers.
Definition LArHVLineID.h:43
singleton-like access to IMessageSvc via open function and helper
IMessageSvc * getMessageSvc(bool quiet=false)
Definition index.py:1
STL namespace.
MsgStream & msg
Definition testRead.cxx:32