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");
36
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 ATH_CHECK( m_BCKey.initialize() );
129 ATH_CHECK( m_cablingSCKey.initialize(m_isSC) );
130 ATH_CHECK( m_calibMapSCKey.initialize(m_addCalib && m_isSC) );
131 ATH_CHECK( m_cablingKey.initialize(!m_isSC) );
132 ATH_CHECK( m_calibMapKey.initialize(m_addCalib && !m_isSC) );
133
134 //Online-identifier variables
135 sc=nt->addItem("channelId",m_onlChanId,0x38000000,0x3A000000);
136 if (sc!=StatusCode::SUCCESS) {
137 ATH_MSG_ERROR( "addItem 'channelId' failed" );
138 return StatusCode::FAILURE;
139 }
140
141 if(m_expandId) {
142
143 sc=nt->addItem("barrel_ec",m_barrel_ec,0,1);
144 if (sc!=StatusCode::SUCCESS) {
145 ATH_MSG_ERROR( "addItem 'barrel_ec' failed" );
146 return StatusCode::FAILURE;
147 }
148
149 sc=nt->addItem("pos_neg",m_pos_neg,0,1);
150 if (sc!=StatusCode::SUCCESS) {
151 ATH_MSG_ERROR( "addItem 'pos_neg' failed" );
152 return StatusCode::FAILURE;
153 }
154
155 sc=nt->addItem("FT",m_FT,0,32);
156 if (sc!=StatusCode::SUCCESS) {
157 ATH_MSG_ERROR( "addItem 'FT' failed" );
158 return StatusCode::FAILURE;
159 }
160
161 sc=nt->addItem("slot",m_slot,1,15);
162 if (sc!=StatusCode::SUCCESS) {
163 ATH_MSG_ERROR( "addItem 'slot' failed" );
164 return StatusCode::FAILURE;
165 }
166
167 sc=nt->addItem("channel",m_channel,0,127);
168 if (sc!=StatusCode::SUCCESS){
169 ATH_MSG_ERROR( "addItem 'channel' failed" );
170 return StatusCode::FAILURE;
171 }
172 }//m_expandId
173
174 if(m_addCalib) {
175 sc=nt->addItem("calibLine",m_calibLine,0,127);
176 if (sc!=StatusCode::SUCCESS) {
177 ATH_MSG_ERROR( "addItem 'calibLine' failed" );
178 return StatusCode::FAILURE;
179 }
180
181
182 sc=nt->addItem("isConnected",m_isConnected,0,1);
183 if (sc!=StatusCode::SUCCESS) {
184 ATH_MSG_ERROR( "addItem 'isConnected' failed" );
185 return StatusCode::FAILURE;
186 }
187 }//m_addCalib
188
189
190 if (m_addHash) {
191 sc=nt->addItem("channelHash",m_chanHash,0,200000);
192 if (sc!=StatusCode::SUCCESS) {
193 ATH_MSG_ERROR( "addItem 'channelHash' failed" );
194 return StatusCode::FAILURE;
195 }
196
197 sc=nt->addItem("febHash",m_febHash,0,2000);
198 if (sc!=StatusCode::SUCCESS) {
199 ATH_MSG_ERROR( "addItem 'febHash' failed" );
200 return StatusCode::FAILURE;
201 }
202
203 if (m_OffId) {
204 sc=m_nt->addItem("oflHash",m_oflHash,0,200000);
205 if (sc!=StatusCode::SUCCESS) {
206 ATH_MSG_ERROR( "addItem 'oflHash' failed" );
207 return StatusCode::FAILURE;
208 }
209 }
210 }//m_addHash
211
212
213 //Offline-identifier variables
214 if ( m_OffId ) {
215 sc=nt->addItem("offlineId",m_oflChanId,0x20000000,0x40000000);
216 if (sc!=StatusCode::SUCCESS) {
217 ATH_MSG_ERROR( "addItem 'channelId' failed" );
218 return StatusCode::FAILURE;
219 }
220
221 sc=nt->addItem("layer",m_layer,0,4);
222 if (sc!=StatusCode::SUCCESS) {
223 ATH_MSG_ERROR( "addItem 'layer' failed" );
224 return StatusCode::FAILURE;
225 }
226
227 if(m_realgeom) {
228 sc=nt->addItem("eta",m_reta);
229 if (sc!=StatusCode::SUCCESS) {
230 ATH_MSG_ERROR( "addItem 'eta' failed" );
231 return StatusCode::FAILURE;
232 }
233 sc=nt->addItem("phi",m_rphi);
234 if (sc!=StatusCode::SUCCESS) {
235 ATH_MSG_ERROR( "addItem 'phi' failed" );
236 return StatusCode::FAILURE;
237 }
238 }
239 sc=nt->addItem("ieta",m_eta,0,510);
240 if (sc!=StatusCode::SUCCESS) {
241 ATH_MSG_ERROR( "addItem 'ieta' failed" );
242 return StatusCode::FAILURE;
243 }
244 sc=nt->addItem("iphi",m_phi,0,1023);
245 if (sc!=StatusCode::SUCCESS) {
246 ATH_MSG_ERROR( "addItem 'iphi' failed" );
247 return StatusCode::FAILURE;
248 }
249
250 sc=nt->addItem("region",m_region,0,5);
251 if (sc!=StatusCode::SUCCESS) {
252 ATH_MSG_ERROR( "addItem 'region' failed" );
253 return StatusCode::FAILURE;
254 }
255 sc=nt->addItem("detector",m_detector,0,2);
256 if (sc!=StatusCode::SUCCESS) {
257 ATH_MSG_ERROR( "addItem 'detector' failed" );
258 return StatusCode::FAILURE;
259
260 }
261 }// m_OffId
262
263 if (m_addBC) {
264 sc=nt->addItem("badChan",m_badChanWord);
265 if (sc!=StatusCode::SUCCESS) {
266 ATH_MSG_ERROR( "addItem 'badChan' failed" );
267 return StatusCode::FAILURE;
268 }
269 }
270
271 if (m_addFEBTemp) {
272 sc=nt->addItem("FEBTemp1",m_FEBTemp1);
273 if (sc!=StatusCode::SUCCESS) {
274 ATH_MSG_ERROR( "addItem 'FEBTemp1' failed" );
275 return StatusCode::FAILURE;
276 }
277 sc=nt->addItem("FEBTemp2",m_FEBTemp2);
278 if (sc!=StatusCode::SUCCESS) {
279 ATH_MSG_ERROR( "addItem 'FEBTemp2' failed" );
280 return StatusCode::FAILURE;
281 }
282 }
283
284 m_initialized=true;
285 return StatusCode::SUCCESS;
286}
287
289
290 ATH_MSG_VERBOSE("Starting fillFromIdentifier");
291 const LArBadChannelCont *bcCont = nullptr;
292 if ( m_addBC ) {
294 bcCont =*readHandle;
295 if( !bcCont) {
296 ATH_MSG_WARNING( "Do not have Bad chan container " << m_BCKey.key() );
297 return false;
298 }
299 }
300
301 const LArCalibLineMapping *clCont=nullptr;
302 if(m_addCalib) {
303 if(m_isSC){
305 clCont={*clHdl};
306 }
307 else{
309 clCont={*clHdl};
310 }
311 if(!clCont) {
312 ATH_MSG_WARNING( "Do not have calib line mapping !!!" );
313 return false;
314 }
315 }
316
317 const LArOnOffIdMapping* cabling=nullptr;
318 if(m_isSC){
320 cabling=*cablingHdl;
321 }
322 else{
324 cabling=*cablingHdl;
325 }
326
327 if(!cabling) {
328 ATH_MSG_WARNING( "Do not have cabling !" );
329 return false;
330 }
331
333
334 if(m_expandId) {
335 m_barrel_ec = m_onlineId->barrel_ec(hwid);
336 m_pos_neg = m_onlineId->pos_neg(hwid);
337 m_FT = m_onlineId->feedthrough(hwid);
338 m_slot = m_onlineId->slot(hwid);
339 m_channel = m_onlineId->channel(hwid);
340 }
341
342 if (m_addHash) {
343 m_chanHash=m_onlineId->channel_Hash(hwid);
344 m_febHash=m_onlineId->feb_Hash(m_onlineId->feb_Id(hwid));
345 }
346
347 if(m_addCalib) {
349 const std::vector<HWIdentifier>& calibLineV=clCont->calibSlotLine(hwid);
350 if(!calibLineV.empty()) {
351 if(m_isSC) {
352 //FIXME - that is hacky, but do not have legacy helper in case of SC
353 m_calibLine = ((hwid.get_identifier32().get_compact())>>8)&0x7F;
354 } else {
355 m_calibLine = m_onlineId->channel(calibLineV[0]);
356 }
357 }
358 }
359
360
361 if ( m_OffId ) {
366
367 if(m_realgeom){
370 }
374 }
375
376 if (m_addBC) m_badChanWord=0;
377 bool connected=false;
378
379 const CaloDetDescrManager_Base* dd_man = nullptr;
380 if (m_realgeom) {
381 if(m_isSC) {
383 dd_man = *caloSuperCellMgrHandle;
384 }
385 else {
387 dd_man = *caloMgrHandle;
388 }
389 }
390
391 try {
392 if (cabling->isOnlineConnected(hwid)) {
393 Identifier id=cabling->cnvToIdentifier(hwid);
394 if ( m_OffId ) {
395 m_oflChanId = id.get_identifier32().get_compact();
396 if (m_addHash) m_oflHash=m_caloId->calo_cell_hash(id);
397
398 if (dd_man) {
399 const CaloDetDescrElement *elem = dd_man->get_element(id);
400 if(!elem) {
401 ATH_MSG_WARNING("Do not have CDDE for "<<id.getString());
402 } else {
403 m_reta = elem->eta_raw();
404 m_rphi = elem->phi_raw();
405 }
406 }
407
408 if (m_emId->is_lar_em(id)) {
409 m_eta = m_emId->eta(id);
410 m_phi = m_emId->phi(id);
411 m_layer = m_emId->sampling(id);
412 m_region = m_emId->region(id);
413 m_detector = std::abs(m_emId->barrel_ec(id)) - 1; //0-barrel, 1-EMEC-OW, 2-EMEC-IW
414 }
415 else if (m_hecId->is_lar_hec(id)) {
416 m_eta = m_hecId->eta(id);
417 m_phi = m_hecId->phi(id);
418 m_layer = m_hecId->sampling(id);
419 m_region = m_hecId->region(id);
420 m_detector = 3;
421 }
422 else if (m_fcalId->is_lar_fcal(id)) {
423 m_eta = m_fcalId->eta(id);
424 m_phi = m_fcalId->phi(id);
425 m_layer = m_fcalId->module(id);
426 m_region = 0;
427 m_detector = 4;
428 }
429 } // m_OffId
430 connected=true;
431 }//end if is connected
432 }catch (LArID_Exception & except) {}
433
434 //bad-channel word
435 if (m_addBC) m_badChanWord=bcCont->status(hwid).packedData();
436 // FEB temperatures
437 if (m_addFEBTemp) {
438 FEBTemp tv = m_FEBTempTool->getFebTemp(hwid);
439 if( !tv.empty() ) {
440 FEBTemp::const_iterator itb = tv.begin();
441 FEBTemp::const_iterator ite = tv.end();
442 for(;itb!=ite;++itb) {
443 m_FEBTemp1 = (*itb).first;
444 m_FEBTemp2 = (*itb).second;
445 }
446 }
447 }
448
449 if(m_addCalib) m_isConnected = (long)connected;
450
451 return connected;
452}
453
454
457{
458 if(m_isSC) return m_cablingSCKey;
459 return m_cablingKey;
460}
#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
retrieve(aClass, aKey=None)
Definition PyKernel.py:110