ATLAS Offline Software
Loading...
Searching...
No Matches
LArCond2NtupleBase.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
6
13#include "CaloDetDescr/CaloDetDescrElement.h"
14
15LArCond2NtupleBase::LArCond2NtupleBase(const std::string& name, ISvcLocator* pSvcLocator)
16 : AthAlgorithm(name, pSvcLocator)
17 , m_initialized(false)
18 , m_nt(nullptr)
19 , m_detStore(nullptr)
20 , m_emId(nullptr)
21 , m_hecId(nullptr)
22 , m_fcalId(nullptr)
23 , m_onlineId(nullptr)
24 , m_caloId(nullptr)
25 , m_FEBTempTool("LArFEBTempTool")
26{
27}
28
32
34
35 ATH_MSG_DEBUG("Initializing LArCond2Ntuple base class");
37 if (m_ntpath.empty() || m_ntTitle.empty()) {
38 ATH_MSG_ERROR( "Need to set variable 'm_ntpath' and 'm_ntTitle' in constructor of deriving class!" );
39 return StatusCode::FAILURE;
40 }
41
42 size_t i=m_ntpath.rfind('/');
43 if (i==std::string::npos) {
44 ATH_MSG_ERROR( "Expected at least on '/' in path " << m_ntpath );
45 return StatusCode::FAILURE;
46 }
47 std::string basepath(m_ntpath.begin(),m_ntpath.begin()+i);
48 //std::cout << "Basepath" << basepath << std::endl;
49
50
51 NTupleFilePtr file1(ntupleSvc(),basepath);
52 if (!file1){
53 ATH_MSG_ERROR( "Could not get NTupleFilePtr with path " << basepath << " failed" );
54 return StatusCode::FAILURE;
55 }
56 NTuplePtr nt(ntupleSvc(),m_ntpath);
57 if (!nt) {
58 nt=ntupleSvc()->book(m_ntpath,CLID_ColumnWiseTuple,m_ntTitle);
59 }
60 if (!nt){
61 ATH_MSG_ERROR( "Booking of NTuple at "<< m_ntpath << " and name " << m_ntTitle << " failed" );
62 return StatusCode::FAILURE;
63 }
64
65 m_nt=nt;
66 //std::cout << "Ntuple ptr:" << m_nt << std::endl;
67
68 m_detStore= &(*detStore()); //for backward compatiblity
69
70 const CaloIdManager* calo_id_manager;
71 ATH_CHECK(detStore()->retrieve(calo_id_manager,"CaloIdManager"));
72
75 ATH_CHECK(m_caloMgrKey.initialize(m_realgeom && !m_isSC));
76 if ( m_isSC ){
77 const LArOnline_SuperCellID* ll;
78 sc = detStore()->retrieve(ll, "LArOnline_SuperCellID");
79 if (sc.isFailure()) {
80 ATH_MSG_ERROR( "Could not get LArOnlineID helper !" );
81 return StatusCode::FAILURE;
82 } else {
83 m_onlineId = ll;
84 ATH_MSG_DEBUG("Found the LArOnline_SuperCellID helper");
85 }
86 m_caloId = calo_id_manager->getCaloCell_SuperCell_ID();
87 } else { // m_isSC
88 const LArOnlineID* ll;
89 sc = detStore()->retrieve(ll, "LArOnlineID");
90 if (sc.isFailure()) {
91 msg(MSG::ERROR) << "Could not get LArOnlineID helper !" << endmsg;
92 return StatusCode::FAILURE;
93 } else {
94 m_onlineId = ll;
95 ATH_MSG_DEBUG(" Found the LArOnlineID helper. ");
96 }
97 m_caloId = calo_id_manager->getCaloCell_ID();
98 } // end of m_isSC if
99
100 m_emId=m_caloId->em_idHelper();
101 m_fcalId=m_caloId->fcal_idHelper();
102 m_hecId=m_caloId->hec_idHelper();
103
104 if (!m_emId) {
105 ATH_MSG_ERROR( "Could not access lar EM ID helper" );
106 return StatusCode::FAILURE;
107 }
108 if (!m_fcalId) {
109 ATH_MSG_ERROR( "Could not access lar FCAL ID helper" );
110 return StatusCode::FAILURE;
111 }
112 if (!m_hecId) {
113 ATH_MSG_ERROR( "Could not access lar HEC ID helper" );
114 return StatusCode::FAILURE;
115 }
116
117
118
119 if (m_addFEBTemp) {
120 sc = m_FEBTempTool.retrieve();
121 if (sc!=StatusCode::SUCCESS) {
122 ATH_MSG_ERROR( " Can't get FEBTempTool." );
123 return sc;
124 }
125 }
126
127 if (m_BCKey.key().empty()) m_addBC=false;
128
129 ATH_CHECK( m_BCKey.initialize(m_addBC) );
131 ATH_CHECK( m_cablingSCKey.initialize(m_isSC) );
132 ATH_CHECK( m_calibMapSCKey.initialize(m_addCalib && m_isSC) );
133 ATH_CHECK( m_cablingKey.initialize(!m_isSC) );
134 ATH_CHECK( m_calibMapKey.initialize(m_addCalib && !m_isSC) );
135
136 //Online-identifier variables
137 sc=nt->addItem("channelId",m_onlChanId,0x38000000,0x3A000000);
138 if (sc!=StatusCode::SUCCESS) {
139 ATH_MSG_ERROR( "addItem 'channelId' failed" );
140 return StatusCode::FAILURE;
141 }
142
143 if(m_expandId) {
144
145 sc=nt->addItem("barrel_ec",m_barrel_ec,0,1);
146 if (sc!=StatusCode::SUCCESS) {
147 ATH_MSG_ERROR( "addItem 'barrel_ec' failed" );
148 return StatusCode::FAILURE;
149 }
150
151 sc=nt->addItem("pos_neg",m_pos_neg,0,1);
152 if (sc!=StatusCode::SUCCESS) {
153 ATH_MSG_ERROR( "addItem 'pos_neg' failed" );
154 return StatusCode::FAILURE;
155 }
156
157 sc=nt->addItem("FT",m_FT,0,32);
158 if (sc!=StatusCode::SUCCESS) {
159 ATH_MSG_ERROR( "addItem 'FT' failed" );
160 return StatusCode::FAILURE;
161 }
162
163 sc=nt->addItem("slot",m_slot,1,15);
164 if (sc!=StatusCode::SUCCESS) {
165 ATH_MSG_ERROR( "addItem 'slot' failed" );
166 return StatusCode::FAILURE;
167 }
168
169 sc=nt->addItem("channel",m_channel,0,127);
170 if (sc!=StatusCode::SUCCESS){
171 ATH_MSG_ERROR( "addItem 'channel' failed" );
172 return StatusCode::FAILURE;
173 }
174 }//m_expandId
175
176 if(m_addCalib) {
177 sc=nt->addItem("calibLine",m_calibLine,0,127);
178 if (sc!=StatusCode::SUCCESS) {
179 ATH_MSG_ERROR( "addItem 'calibLine' failed" );
180 return StatusCode::FAILURE;
181 }
182
183
184 sc=nt->addItem("isConnected",m_isConnected,0,1);
185 if (sc!=StatusCode::SUCCESS) {
186 ATH_MSG_ERROR( "addItem 'isConnected' failed" );
187 return StatusCode::FAILURE;
188 }
189 }//m_addCalib
190
191
192 if (m_addHash) {
193 sc=nt->addItem("channelHash",m_chanHash,0,200000);
194 if (sc!=StatusCode::SUCCESS) {
195 ATH_MSG_ERROR( "addItem 'channelHash' failed" );
196 return StatusCode::FAILURE;
197 }
198
199 sc=nt->addItem("febHash",m_febHash,0,2000);
200 if (sc!=StatusCode::SUCCESS) {
201 ATH_MSG_ERROR( "addItem 'febHash' failed" );
202 return StatusCode::FAILURE;
203 }
204
205 if (m_OffId) {
206 sc=m_nt->addItem("oflHash",m_oflHash,0,200000);
207 if (sc!=StatusCode::SUCCESS) {
208 ATH_MSG_ERROR( "addItem 'oflHash' failed" );
209 return StatusCode::FAILURE;
210 }
211 }
212 }//m_addHash
213
214
215 //Offline-identifier variables
216 if ( m_OffId ) {
217 sc=nt->addItem("offlineId",m_oflChanId,0x20000000,0x40000000);
218 if (sc!=StatusCode::SUCCESS) {
219 ATH_MSG_ERROR( "addItem 'channelId' failed" );
220 return StatusCode::FAILURE;
221 }
222
223 sc=nt->addItem("layer",m_layer,0,4);
224 if (sc!=StatusCode::SUCCESS) {
225 ATH_MSG_ERROR( "addItem 'layer' failed" );
226 return StatusCode::FAILURE;
227 }
228
229 if(m_realgeom) {
230 sc=nt->addItem("eta",m_reta);
231 if (sc!=StatusCode::SUCCESS) {
232 ATH_MSG_ERROR( "addItem 'eta' failed" );
233 return StatusCode::FAILURE;
234 }
235 sc=nt->addItem("phi",m_rphi);
236 if (sc!=StatusCode::SUCCESS) {
237 ATH_MSG_ERROR( "addItem 'phi' failed" );
238 return StatusCode::FAILURE;
239 }
240 }
241 sc=nt->addItem("ieta",m_eta,0,510);
242 if (sc!=StatusCode::SUCCESS) {
243 ATH_MSG_ERROR( "addItem 'ieta' failed" );
244 return StatusCode::FAILURE;
245 }
246 sc=nt->addItem("iphi",m_phi,0,1023);
247 if (sc!=StatusCode::SUCCESS) {
248 ATH_MSG_ERROR( "addItem 'iphi' failed" );
249 return StatusCode::FAILURE;
250 }
251
252 sc=nt->addItem("region",m_region,0,5);
253 if (sc!=StatusCode::SUCCESS) {
254 ATH_MSG_ERROR( "addItem 'region' failed" );
255 return StatusCode::FAILURE;
256 }
257 sc=nt->addItem("detector",m_detector,0,2);
258 if (sc!=StatusCode::SUCCESS) {
259 ATH_MSG_ERROR( "addItem 'detector' failed" );
260 return StatusCode::FAILURE;
261
262 }
263 }// m_OffId
264
265 if (m_addBC) {
266 sc=nt->addItem("badChan",m_badChanWord);
267 if (sc!=StatusCode::SUCCESS) {
268 ATH_MSG_ERROR( "addItem 'badChan' failed" );
269 return StatusCode::FAILURE;
270 }
271 }
272
273 if (m_addFEBTemp) {
274 sc=nt->addItem("FEBTemp1",m_FEBTemp1);
275 if (sc!=StatusCode::SUCCESS) {
276 ATH_MSG_ERROR( "addItem 'FEBTemp1' failed" );
277 return StatusCode::FAILURE;
278 }
279 sc=nt->addItem("FEBTemp2",m_FEBTemp2);
280 if (sc!=StatusCode::SUCCESS) {
281 ATH_MSG_ERROR( "addItem 'FEBTemp2' failed" );
282 return StatusCode::FAILURE;
283 }
284 }
285
286 m_initialized=true;
287 return StatusCode::SUCCESS;
288}
289
291
292 ATH_MSG_VERBOSE("Starting fillFromIdentifier");
293 const LArBadChannelCont *bcCont = nullptr;
294 if ( m_addBC) {
296 bcCont =*readHandle;
297 if( !bcCont) {
298 ATH_MSG_WARNING( "Do not have Bad chan container " << m_BCKey.key() );
299 return false;
300 }
301 }
302
303 const LArCalibLineMapping *clCont=nullptr;
304 if(m_addCalib) {
305 if(m_isSC){
307 clCont={*clHdl};
308 }
309 else{
311 clCont={*clHdl};
312 }
313 if(!clCont) {
314 ATH_MSG_WARNING( "Do not have calib line mapping !!!" );
315 return false;
316 }
317 }
318
319 const LArOnOffIdMapping* cabling=nullptr;
320 if(m_isSC){
322 cabling=*cablingHdl;
323 }
324 else{
326 cabling=*cablingHdl;
327 }
328
329 if(!cabling) {
330 ATH_MSG_WARNING( "Do not have cabling !" );
331 return false;
332 }
333
335
336 if(m_expandId) {
337 m_barrel_ec = m_onlineId->barrel_ec(hwid);
338 m_pos_neg = m_onlineId->pos_neg(hwid);
339 m_FT = m_onlineId->feedthrough(hwid);
340 m_slot = m_onlineId->slot(hwid);
341 m_channel = m_onlineId->channel(hwid);
342 }
343
344 if (m_addHash) {
345 m_chanHash=m_onlineId->channel_Hash(hwid);
346 m_febHash=m_onlineId->feb_Hash(m_onlineId->feb_Id(hwid));
347 }
348
349 if(m_addCalib) {
351 const std::vector<HWIdentifier>& calibLineV=clCont->calibSlotLine(hwid);
352 if(!calibLineV.empty()) {
353 if(m_isSC) {
354 //FIXME - that is hacky, but do not have legacy helper in case of SC
355 m_calibLine = ((hwid.get_identifier32().get_compact())>>8)&0x7F;
356 } else {
357 m_calibLine = m_onlineId->channel(calibLineV[0]);
358 }
359 }
360 }
361
362
363 if ( m_OffId ) {
368
369 if(m_realgeom){
372 }
376 }
377
378 if (m_addBC) m_badChanWord=0;
379 bool connected=false;
380
381 const CaloDetDescrManager_Base* dd_man = nullptr;
382 if (m_realgeom) {
383 if(m_isSC) {
385 dd_man = *caloSuperCellMgrHandle;
386 }
387 else {
389 dd_man = *caloMgrHandle;
390 }
391 }
392
393 try {
394 if (cabling->isOnlineConnected(hwid)) {
395 Identifier id=cabling->cnvToIdentifier(hwid);
396 if ( m_OffId ) {
397 m_oflChanId = id.get_identifier32().get_compact();
398 if (m_addHash) m_oflHash=m_caloId->calo_cell_hash(id);
399
400 if (dd_man) {
401 const CaloDetDescrElement *elem = dd_man->get_element(id);
402 if(!elem) {
403 ATH_MSG_WARNING("Do not have CDDE for "<<id.getString());
404 } else {
405 m_reta = elem->eta_raw();
406 m_rphi = elem->phi_raw();
407 }
408 }
409
410 if (m_emId->is_lar_em(id)) {
411 m_eta = m_emId->eta(id);
412 m_phi = m_emId->phi(id);
413 m_layer = m_emId->sampling(id);
414 m_region = m_emId->region(id);
415 m_detector = std::abs(m_emId->barrel_ec(id)) - 1; //0-barrel, 1-EMEC-OW, 2-EMEC-IW
416 }
417 else if (m_hecId->is_lar_hec(id)) {
418 m_eta = m_hecId->eta(id);
419 m_phi = m_hecId->phi(id);
420 m_layer = m_hecId->sampling(id);
421 m_region = m_hecId->region(id);
422 m_detector = 3;
423 }
424 else if (m_fcalId->is_lar_fcal(id)) {
425 m_eta = m_fcalId->eta(id);
426 m_phi = m_fcalId->phi(id);
427 m_layer = m_fcalId->module(id);
428 m_region = 0;
429 m_detector = 4;
430 }
431 } // m_OffId
432 connected=true;
433 }//end if is connected
434 }catch (LArID_Exception & except) {}
435
436 //bad-channel word
437 if (m_addBC) m_badChanWord=bcCont->status(hwid).packedData();
438 // FEB temperatures
439 if (m_addFEBTemp) {
440 FEBTemp tv = m_FEBTempTool->getFebTemp(hwid);
441 if( !tv.empty() ) {
442 FEBTemp::const_iterator itb = tv.begin();
443 FEBTemp::const_iterator ite = tv.end();
444 for(;itb!=ite;++itb) {
445 m_FEBTemp1 = (*itb).first;
446 m_FEBTemp2 = (*itb).second;
447 }
448 }
449 }
450
451 if(m_addCalib) m_isConnected = (long)connected;
452
453 return connected;
454}
455
456
459{
460 if(m_isSC) return m_cablingSCKey;
461 return m_cablingKey;
462}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helper class for offline supercell identifiers.
Definition of CaloDetDescrManager.
std::vector< std::pair< float, float > > FEBTemp
LArBadXCont< LArBadChannel > LArBadChannelCont
static Double_t sc
INTupleSvc * ntupleSvc()
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
This class groups all DetDescr information related to a CaloCell.
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
const CaloCell_SuperCell_ID * getCaloCell_SuperCell_ID(void) const
const CaloCell_ID * getCaloCell_ID(void) const
Access to IdHelper.
value_type get_compact() const
Get the compact id.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
BitWord packedData() const
LArBC_t status(const HWIdentifier channel) const
Query the status of a particular channel or FEB This is the main client access method.
const std::vector< HWIdentifier > & calibSlotLine(const HWIdentifier id) const
NTuple::Item< long > m_isConnected
SG::ReadCondHandleKey< LArBadChannelCont > m_BCKey
Gaudi::Property< bool > m_isSC
StoreGateSvc * m_detStore
const CaloCell_Base_ID * m_caloId
NTuple::Item< long > m_calibLine
NTuple::Item< long > m_region
NTuple::Item< long > m_layer
NTuple::Item< long > m_chanHash
Gaudi::Property< bool > m_addCalib
NTuple::Item< float > m_reta
const LArEM_Base_ID * m_emId
NTuple::Item< long > m_onlChanId
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingSCKey
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapKey
Gaudi::Property< bool > m_addHash
const SG::ReadCondHandleKey< LArOnOffIdMapping > & cablingKey() const
NTuple::Item< long > m_eta
ToolHandle< ILArFEBTempTool > m_FEBTempTool
NTuple::Item< long > m_barrel_ec
NTuple::Item< long > m_FT
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
const LArHEC_Base_ID * m_hecId
NTuple::Item< long > m_oflHash
NTuple::Item< float > m_rphi
Gaudi::Property< bool > m_realgeom
NTuple::Item< long > m_slot
NTuple::Item< long > m_febHash
NTuple::Item< long > m_detector
NTuple::Item< float > m_FEBTemp1
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
NTuple::Item< long > m_oflChanId
NTuple::Item< float > m_FEBTemp2
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSuperCellMgrKey
NTuple::Item< long > m_phi
NTuple::Item< long > m_badChanWord
const LArOnlineID_Base * m_onlineId
Gaudi::Property< bool > m_addBC
NTuple::Item< long > m_channel
const LArFCAL_Base_ID * m_fcalId
NTuple::Item< long > m_pos_neg
bool fillFromIdentifier(const HWIdentifier &id)
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapSCKey
Gaudi::Property< bool > m_expandId
Gaudi::Property< bool > m_addFEBTemp
Gaudi::Property< bool > m_OffId
LArCond2NtupleBase(const std::string &name, ISvcLocator *pSvcLocator)
Exception class for LAr Identifiers.
::StatusCode StatusCode
StatusCode definition for legacy code.
long long ll