ATLAS Offline Software
Loading...
Searching...
No Matches
CaloTriggerTowerService.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include <cstdio>
8#include <fstream>
9#include <iostream>
10
16#include "TClass.h"
17
18//===========================================================
20 const std::string& name,
21 const IInterface* parent )
22 : AthAlgTool(type,name,parent)
23{
24 // Declare additional interface
25 declareInterface<CaloTriggerTowerService>(this);
26}
27
28
29//===========================================================
31{
32 ATH_MSG_INFO(" => CaloTriggerTowerService::initialize()");
33
34 const CaloIdManager* caloMgr;
35 ATH_CHECK( detStore()->retrieve(caloMgr) );
36
37 ATH_CHECK( (m_emHelper = caloMgr->getEM_ID()) != nullptr );
38 ATH_CHECK( (m_lvl1Helper = caloMgr->getLVL1_ID()) != nullptr );
39 ATH_CHECK( (m_ttonlineHelper = caloMgr->getTTOnlineID()) != nullptr );
40
41 ATH_CHECK( detStore()->retrieve(m_onlineHelper, "LArOnlineID") );
42
43 // Make sure the dictionaries for the LArTTCellMap persistent classes
44 // are available. We used to read this object via a conditions callback,
45 // but callbacks are not thread-friendly, so this was changed to retrieving
46 // it from detStore during event processing. However, this meant that
47 // the TClass's for the persistent objects were also being loaded
48 // at that time. As of root 6.22.00, at least, TClass can sometimes
49 // fail to properly load a dictionary when it's being run in a multithreaded
50 // context. So force the needed dictionaries to load now.
51 TClass::GetClass ("LArTTCell_P");
52 TClass::GetClass ("LArTTCell_P::LArTTCell_P_t");
53 TClass::GetClass ("std::vector<LArTTCell_P::LArTTCell_P_t>");
54
55 return StatusCode::SUCCESS;
56}
57
58
59//===========================================================
61{
62
64
65 const CaloTTOnOffIdMap* caloTTOnOffIdMap = getCaloTTOnOffIdMap();
66 if(!caloTTOnOffIdMap ) {// no mapping object
67 ATH_MSG_ERROR(" No CaloTTOnOffIdMap !");
68 ATH_MSG_ERROR(" Has the DB folder holding the CaloTTOnOffIdMap been added to IOVDbSvc ? ");
69 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
70 return invalidId;
71
72 } else {
73
74 // have mapping object, forward the call
75 HWIdentifier sid = caloTTOnOffIdMap->createSignalChannelID( id ) ;
76 if(bQuiet) {
77 return sid;
78
79 } else {
80 if(sid == invalidId) {
81 CaloID_Exception except;
82 except.code(5) ;
83 except.message("HWIdentifier not found in map ") ;
84 throw except ;
85 }
86 return sid;
87 }
88 }
89}
90
91
92//===========================================================================
94{
96
97 const CaloTTOnOffIdMap* caloTTOnOffIdMap = getCaloTTOnOffIdMap();
98 if(!caloTTOnOffIdMap ) {
99 ATH_MSG_ERROR(" No CaloTTOnOffIdMap !");
100 ATH_MSG_ERROR(" Has the DB folder holding the CaloTTOnOffIdMap been added to IOVDbSvc ? ");
101 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
102 return invalidId;
103
104 } else {
105 // mapping object exist, forward the call
106 Identifier offid = caloTTOnOffIdMap->cnvToIdentifier(id, bQuiet);
107 if(bQuiet) {
108 return offid;
109
110 } else {
111 if(!offid.is_valid()) {
112 CaloID_Exception except;
113 except.code(6) ;
114 except.message(" Online ID not found in map ") ;
115 throw except ;
116 }
117 return offid;
118 }
119 }
120}
121
123
125
126 const CaloTTPpmRxIdMap* caloTTPpmRxIdMap = getCaloTTPpmRxIdMap();
127 if(!caloTTPpmRxIdMap ) {
128 ATH_MSG_ERROR(" No CaloTTPpmRxIdMap !");
129 ATH_MSG_ERROR(" Has the DB folder holding the CaloTTPpmRxIdMap been added to IOVDbSvc ? ");
130 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
131 return invalidId;
132
133 } else {
134 // mapping object exist, forward the call
135 L1CaloCoolChannelId ppmId = caloTTPpmRxIdMap->rxToPpmId(rxCoolChannelId);
136 if(ppmId==L1CaloCoolChannelId()) {
137 CaloID_Exception except;
138 except.code(6) ;
139 except.message(" Rx channel ID not found in map ") ;
140 throw except ;
141 }
142 return ppmId;
143 }
144}
145
146std::vector<L1CaloRxCoolChannelId> CaloTriggerTowerService::cnvCoolChannelIdToRxId(const L1CaloCoolChannelId& ppmCoolChannelId) const {
147
148 const CaloTTPpmRxIdMap* caloTTPpmRxIdMap = getCaloTTPpmRxIdMap();
149 if(!caloTTPpmRxIdMap ) {
150 ATH_MSG_ERROR(" No CaloTTPpmRxIdMap !");
151 ATH_MSG_ERROR(" Has the DB folder holding the CaloTTPpmRxIdMap been added to IOVDbSvc ? ");
152 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
153 return {};
154
155 } else {
156 // mapping object exist, forward the call
157 std::vector<L1CaloRxCoolChannelId> rxChannels = caloTTPpmRxIdMap->ppmToRxId(ppmCoolChannelId);
158 if(rxChannels.empty()) {
159 CaloID_Exception except;
160 except.code(6) ;
161 except.message(" Ppm channel ID not found in map ") ;
162 throw except ;
163 }
164 return rxChannels;
165 }
166}
167
168//==========================================================================
170
171 const CaloTTOnAttrIdMap* caloTTOnAttrIdMap = getCaloTTOnAttrIdMap();
172 if(!caloTTOnAttrIdMap) {
173 ATH_MSG_ERROR(" No TTOnAttrIdMap !");
174 ATH_MSG_ERROR(" Has the DB folder holding the TTOnAttrIdMap been added to IOVDbSvc ? ");
175 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
176 return (0);
177 } else {
178 unsigned int barrel_endcap_fcal = caloTTOnAttrIdMap->barrel_endcap_fcal(id);
179 return barrel_endcap_fcal;
180 }
181}
182
183//==========================================================================
184unsigned int CaloTriggerTowerService::em_had(const HWIdentifier & id) const {
185
186 const CaloTTOnAttrIdMap* caloTTOnAttrIdMap = getCaloTTOnAttrIdMap();
187 if(!caloTTOnAttrIdMap) {
188 ATH_MSG_ERROR(" No TTOnAttrIdMap !");
189 ATH_MSG_ERROR(" Has the DB folder holding the TTOnAttrIdMap been added to IOVDbSvc ? ");
190 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
191 return (0);
192 } else {
193 unsigned int em_had = caloTTOnAttrIdMap->em_had(id);
194 return em_had;
195 }
196}
197
198//==========================================================================
199unsigned int CaloTriggerTowerService::pos_neg(const HWIdentifier & id) const {
200
201 const CaloTTOnAttrIdMap* caloTTOnAttrIdMap = getCaloTTOnAttrIdMap();
202 if(!caloTTOnAttrIdMap) {
203 ATH_MSG_ERROR(" No TTOnAttrIdMap !");
204 ATH_MSG_ERROR(" Has the DB folder holding the TTOnAttrIdMap been added to IOVDbSvc ? ");
205 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
206 return (0);
207 } else {
208 unsigned int pos_neg = caloTTOnAttrIdMap->pos_neg(id);
209 return pos_neg;
210 }
211}
212
214
215
216 const CaloTTOnAttrIdMap* caloTTOnAttrIdMap = getCaloTTOnAttrIdMap();
217 if(!caloTTOnAttrIdMap) {
218 ATH_MSG_ERROR(" No TTOnAttrIdMap !");
219 ATH_MSG_ERROR(" Has the DB folder holding the TTOnAttrIdMap been added to IOVDbSvc ? ");
220 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
221 return (0);
222 } else {
223 unsigned int module_type = caloTTOnAttrIdMap->module_type(id);
224 return module_type;
225 }
226}
227
228
229//===========================================================
231
232 const CaloTTOnAttrIdMap* caloTTOnAttrIdMap = getCaloTTOnAttrIdMap();
233 if(caloTTOnAttrIdMap) {
234
235 unsigned int crate = m_ttonlineHelper->crate(id);
236 unsigned int module = m_ttonlineHelper->module(id); // this returns the physical slot position !
237 unsigned int submodule = m_ttonlineHelper->submodule(id);
238 unsigned int channel = m_ttonlineHelper->channel(id);
239
240 unsigned int module_type = caloTTOnAttrIdMap->module_type(id);
241
242 // since the module argument is the physical position and not the logical one, the logical flag is set to false
243 return L1CaloCoolChannelId(crate, L1CaloModuleType( (L1CaloModuleType::L1CaloModuleEnum) module_type), module, submodule, channel, false);
244
245 } else {
246
247 ATH_MSG_ERROR(" No CaloTTOnAttrIdMap !");
248 ATH_MSG_ERROR(" Has the DB folder holding the CaloTTOnAttrIdMap been added to IOVDbSvc ? ");
249 ATH_MSG_ERROR(" IOVDbSvc.Folders+=[ FolderName + DBConnection + \"<tag>\"+TagSpec+\"</tag>\" ] ");
250 return 0;
251 }
252}
253
254
255//===========================================================
257
258 unsigned int crate = coolChannelId.crate();
259 unsigned int module = coolChannelId.module(false); // get the physical module position
260 unsigned int submodule = coolChannelId.subModule();
261 unsigned int channel = coolChannelId.channel();
262
263 // create Athena Online Id - the physical module position is expected here (not the logical)
264 HWIdentifier channelId = m_ttonlineHelper->channelId(crate,module,submodule,channel);
265
266 return channelId;
267}
268
269
270//==========================================================================
271std::vector<Identifier>
273//==========================================================================
274{
275 std::vector<Identifier> vec ;
276
277 if(m_emHelper->dictionaryVersion() == "fullAtlas" ||
278 m_emHelper->dictionaryVersion() == "H8TestBeam") {
279
280 const LArTTCellMap* TTCellMap = getTTCellMap();
281 if(!TTCellMap) {
282 ATH_MSG_ERROR(" No TTCellMap !");
283 return vec;
284 }
285
286 Identifier ttId=m_lvl1Helper->tower_id(id);
287 Identifier regId=m_lvl1Helper->region_id(id);
288 int maxLay=m_lvl1Helper->layer_max(regId);
289
290 for(int iLay=0;iLay<=maxLay;++iLay) {
291 // Rem: not all iLay correspond to physically existing layers
292 Identifier layId = m_lvl1Helper->layer_id(ttId,iLay);
293 std::vector<Identifier> vecp = TTCellMap->createCellIDvec(layId);
294 std::vector<Identifier>::const_iterator it = vecp.begin();
295 std::vector<Identifier>::const_iterator it_e = vecp.end();
296 for (; it!=it_e; ++it) {
297 vec.push_back(*it);
298 }
299 }
300
301 }
302
303 return vec;
304}
305
306//==========================================================================
307std::vector<Identifier>
309//==========================================================================
310{
311 std::vector<Identifier> vec ;
312 const LArTTCellMap* TTCellMap = getTTCellMap();
313
314 if(m_emHelper->dictionaryVersion() == "fullAtlas" ||
315 m_emHelper->dictionaryVersion() == "H8TestBeam") {
316 if(!TTCellMap) {
317 ATH_MSG_ERROR(" No TTCellMap !");
318 return vec;
319 }
320 vec = TTCellMap->createCellIDvec(id);
321 }
322
323 return vec;
324}
325
326//==========================================================================
328//==========================================================================
329{
330 Identifier sid(0);
331
332 if(m_emHelper->dictionaryVersion() == "fullAtlas" ||
333 m_emHelper->dictionaryVersion() == "H8TestBeam") {
334
335 const LArTTCellMap* TTCellMap = getTTCellMap();
336 if(!TTCellMap) {
337 ATH_MSG_ERROR(" No TTCellMap !");
338 return sid;
339 }
340 sid = TTCellMap->whichTTID( id ) ;
342 if(sid == invalidId ){
343 LArID_Exception except;
344 except.message("Identifier not found in map ") ;
345 throw except ;
346 }
347 }
348
349 return sid;
350}
351
352
353//=============================================================
355//=============================================================
356//
357// input = cell offline id
358// some channels are mapped to a TT although not in lvl1
359// 2 cases: barrel end and last compartment of hec.
360//
361//=============================================================
362{
363
364 bool lvl1 = true ;
365
366 if(m_emHelper->dictionaryVersion() == "fullAtlas" ||
367 m_emHelper->dictionaryVersion() == "H8TestBeam") {
368
369 if(m_emHelper->is_em_barrel(id)) {
370 int samp=m_emHelper->sampling(id);
371 if(samp==0) {
372 int eta=m_emHelper->eta(id);
373 if(eta==60) {
374 lvl1 = false ;
375 }
376 }
377 } else {
378 Identifier ttId=whichTTID(id);
379 if(m_lvl1Helper->is_hec(ttId)) {
380 int layer = m_lvl1Helper->layer(ttId);
381 if(layer == 3){
382 lvl1 = false ;
383 }
384 }
385 }
386 } else {
387 lvl1 = false ;
388 }
389
390 return lvl1;
391
392}
393
394
396{
397 if (!m_TTCellMap.get()) {
398 const LArTTCellMap* TTCellMap = nullptr;
399 if (detStore()->retrieve (TTCellMap, m_TTCellMapKey).isSuccess()) {
400 m_TTCellMap.set (TTCellMap);
401 }
402 }
403 return m_TTCellMap.get();
404}
405
406
408{
409 if (!m_caloTTOnOffIdMap.get()) {
410 const CaloTTOnOffIdMap* caloTTOnOffIdMap = nullptr;
411 if (detStore()->retrieve (caloTTOnOffIdMap, m_caloTTOnOffIdMapKey).isSuccess()) {
412 m_caloTTOnOffIdMap.set (caloTTOnOffIdMap);
413 }
414 }
415 return m_caloTTOnOffIdMap.get();
416}
417
418
420{
421 if (!m_caloTTOnAttrIdMap.get()) {
422 const CaloTTOnAttrIdMap* caloTTOnAttrIdMap = nullptr;
423 if (detStore()->retrieve (caloTTOnAttrIdMap, m_caloTTOnAttrIdMapKey).isSuccess()) {
424 m_caloTTOnAttrIdMap.set (caloTTOnAttrIdMap);
425 }
426 }
427 return m_caloTTOnAttrIdMap.get();
428}
429
430
432{
433 if (!m_caloTTPpmRxIdMap.get()) {
434 const CaloTTPpmRxIdMap* caloTTPpmRxIdMap = nullptr;
435 if (detStore()->retrieve (caloTTPpmRxIdMap, m_caloTTPpmRxIdMapKey).isSuccess()) {
436 m_caloTTPpmRxIdMap.set (caloTTPpmRxIdMap);
437 }
438 }
439 return m_caloTTPpmRxIdMap.get();
440}
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
std::vector< size_t > vec
static const ITkStripOnlineId invalidId
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
Exception class for Calo Identifiers.
void code(int lCode)
set error code number
void message(const std::string &lMessage)
set error message
This class initializes the Calo (LAr and Tile) offline identifiers.
const TTOnlineID * getTTOnlineID(void) const
const CaloLVL1_ID * getLVL1_ID(void) const
const LArEM_ID * getEM_ID(void) const
unsigned int pos_neg(HWIdentifier channelId) const
return 0 for z<0 channels and 1 for z>0 channels
unsigned int barrel_endcap_fcal(HWIdentifier channelId) const
To know if a channel belongs to the barrel, end cap or fcal parts.
unsigned int module_type(HWIdentifier channelId) const
To get the type of the module connected to the channel:
unsigned int em_had(HWIdentifier channelId) const
return the corresponding sampling of channelId:
This is a StoreGate object holding the TT offline-online map.
Identifier cnvToIdentifier(const HWIdentifier &sid, bool bQuiet=false) const
return the corresponfing offline Id of an online one
HWIdentifier createSignalChannelID(const Identifier &id, bool bQuiet=false) const
return the corresponfing online Id of an offline one
This is a StoreGate object holding the TT PPM to RX channels map.
L1CaloCoolChannelId rxToPpmId(const L1CaloRxCoolChannelId &rxChannelId) const
return the corresponfing ppm channel to the Rx input one
std::vector< L1CaloRxCoolChannelId > ppmToRxId(const L1CaloCoolChannelId &ppmChannelId) const
return the corresponding Rx channels to the Ppm input one
Gaudi::Property< std::string > m_caloTTOnAttrIdMapKey
HWIdentifier createTTChannelID(const Identifier &id, bool bQuiet=false) const
create a TT HWIdentifier from a TT Identifier
const CaloTTOnAttrIdMap * getCaloTTOnAttrIdMap() const
const LArEM_ID * m_emHelper
pointer to the LArEM offline Id helper
const CaloTTOnOffIdMap * getCaloTTOnOffIdMap() const
Identifier cnvToIdentifier(const HWIdentifier &id, bool bQuiet=false) const
create a TT Identifier from a TT HWIdentifier
CxxUtils::CachedPointer< const CaloTTPpmRxIdMap > m_caloTTPpmRxIdMap
CaloTriggerTowerService(const std::string &type, const std::string &name, const IInterface *parent)
constructor
Gaudi::Property< std::string > m_caloTTOnOffIdMapKey
unsigned int pos_neg(const HWIdentifier &id) const
return 0 for z<0 channels and 1 for z>0 channels
CxxUtils::CachedPointer< const CaloTTOnAttrIdMap > m_caloTTOnAttrIdMap
bool is_in_lvl1(const Identifier &id) const
return true if the cell is in the lvl1 sums; some channels mapped to TT are only in HLT (last HEC c...
const LArTTCellMap * getTTCellMap() const
unsigned int module_type(const HWIdentifier &id) const
To get the type of the module connected to the channel:
std::vector< Identifier > createCellIDvecLayer(const Identifier &id) const
Return a vector of offline Identifiers (corresponding helpers = LArEM_ID, LArHEC_ID,...
unsigned int em_had(const HWIdentifier &id) const
return the corresponding sampling of channelId:
const CaloTTPpmRxIdMap * getCaloTTPpmRxIdMap() const
unsigned int barrel_endcap_fcal(const HWIdentifier &id) const
To know if a channel belongs to the barrel, end cap or fcal parts.
std::vector< L1CaloRxCoolChannelId > cnvCoolChannelIdToRxId(const L1CaloCoolChannelId &ppmCoolChannelId) const
returns a vector of L1CaloRxCoolChannelId corresponding to a L1CaloCoolChannelId
L1CaloCoolChannelId cnvRxIdToCoolChannelId(const L1CaloRxCoolChannelId &rxCoolChannelId) const
returns a TDAQ CoolChannelId corresponding to a L1CaloRxCoolChannelId
Gaudi::Property< std::string > m_TTCellMapKey
CxxUtils::CachedPointer< const CaloTTOnOffIdMap > m_caloTTOnOffIdMap
virtual StatusCode initialize() override
Identifier whichTTID(const Identifier &id) const
return the offline id (CaloLVL1_ID) of the TT to which a cell id (CaloCell_ID) belongs The call is ...
const CaloLVL1_ID * m_lvl1Helper
pointer to the Calo TT offline Id helper
const TTOnlineID * m_ttonlineHelper
pointer to the Calo TT online Id helper
HWIdentifier cnvCoolChannelIdToHWID(const L1CaloCoolChannelId &coolChannelId) const
create an HWIdentifier from an TDAQ CoolChannelId
std::vector< Identifier > createCellIDvecTT(const Identifier &id) const
Return a vector of offline Identifiers (corresponding helpers = LArEM_ID, LArHEC_ID,...
const LArOnlineID * m_onlineHelper
pointer to the LAr Online Id helper
Gaudi::Property< std::string > m_caloTTPpmRxIdMapKey
L1CaloCoolChannelId createL1CoolChannelId(const HWIdentifier &id) const
create a CoolChannelId (used by TDAQ framework) from a HWIdentifier
CxxUtils::CachedPointer< const LArTTCellMap > m_TTCellMap
bool is_valid() const
Check if id is in a valid state.
Encapsulates the ID of one channel of conditions data in COOL, ie the ID of a row in a table.
unsigned int subModule() const
unsigned int module(bool logical=true) const
Convert a typeId to a L1CaloModuleType.
unsigned int crate() const
unsigned int channel() const
Infrastructure class encapsulating our known module types.
Encapsulates the ID of one Rx channel of conditions data in COOL, ie the ID of a row in a table.
Exception class for LAr Identifiers.
void message(const std::string &l_message)
set error message
This is a StoreGate object holding the offline TT-cell map.
Identifier whichTTID(const Identifier &id) const
return the offline id (CaloLVL1_ID) of the TT to which a cell (CaloCell_ID) belongs
const std::vector< Identifier > & createCellIDvec(const Identifier &id) const
Return a vector of offline Identifiers (corresponding helpers = LArEM_ID, LArHEC_ID,...