ATLAS Offline Software
Loading...
Searching...
No Matches
LArRodDecoder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Implementation of LArRodDecoder class
7#include "GaudiKernel/TypeNameString.h"
8#include "GaudiKernel/MsgStream.h"
9#include "GaudiKernel/Bootstrap.h"
10#include "GaudiKernel/ISvcLocator.h"
11#include "GaudiKernel/IToolSvc.h"
12
14//#include "LArByteStream/LArRodBlockStructure_0.h"
17// IWS 14.07.2005
19// IWS 25.04.2006
30#include <algorithm>
31#include <fstream>
32
36
37static const InterfaceID IID_ILArRodDecoder
38 ("LArRodDecoder", 1, 0);
39
40LArRodDecoder::LArRodDecoder ( const std::string& type, const std::string& name,const IInterface* parent )
41 : AthAlgTool(type,name,parent),
43 m_readtdc(false),
45 {
46 declareInterface< LArRodDecoder >( this );
47 declareProperty("IgnoreCheckFEBs",m_IgnoreCheckFEBs);
48 declareProperty("CellCorrections",m_LArCellCorrNames );
49 declareProperty("LArCellEthreshold",m_LArCellEthreshold );
50 declareProperty("ReadTDC",m_readtdc);
51 declareProperty("DelayScale",m_delayScale=(25./240.)*CLHEP::ns);
52 declareProperty("FebExchange", m_febExchange=0); //FIXME: Very ugly hack! See explanation in .h file
53 declareProperty("FebId1", m_febId1=0);
54 declareProperty("FebId2", m_febId2=0);
55 declareProperty("FirstSample", m_firstSample=0); //FIXME: Very ugly hack! See explanation in .h file
56
57 declareProperty("BEPreselection",m_vBEPreselection,"For channel-selection: Barrel=0, Endcap=1");
58 declareProperty("PosNegPreselection",m_vPosNegPreselection,"For channel-selection: C-Side:0, A-Side: 1");
59 declareProperty("FTNumPreselection",m_vFTPreselection,"For channel-selection: Feedthrough numbers (e.g. 0 - 31 for barrel)");
60 declareProperty("MultiDSPMode", m_MultiDSPMode=false);
61 declareProperty("CheckSum", m_CheckSum=false);
62 declareProperty("StatusMask", m_StatusMask=0x00000212);
63 declareProperty("RequiredPhysicsNSamples", m_requiredPhysicsNSamples = 0);
64}
65
66// destructor
70
71const InterfaceID& LArRodDecoder::interfaceID( )
72{ return IID_ILArRodDecoder; }
73
74StatusCode
75LArRodDecoder::initialize ATLAS_NOT_THREAD_SAFE ()
76{
77 // Before anything, access message service
78 m_StatusNMask = !m_StatusMask;
79
80
81 StatusCode sc = detStore()->retrieve(m_onlineHelper, "LArOnlineID");
82 if (sc.isFailure()) {
83 msg(MSG::ERROR) << "Could not get LArOnlineID helper !" << endmsg;
84 return sc;
85 }
86
87 ATH_CHECK( m_evt.initialize() );
88
89 std::vector<std::string>::const_iterator it = m_LArCellCorrNames.begin();
90 std::vector<std::string>::const_iterator it_end = m_LArCellCorrNames.end();
91 for(; it!=it_end;++it)
92 {IAlgTool* tool;
93 CaloCellCorrection* corr;
94 Gaudi::Utils::TypeNameString li(*it);
95 if((toolSvc()->retrieveTool(li.type(), li.name(), tool)).isFailure() )
96 {msg(MSG::ERROR) << " Can't get AlgTool for CaloCellCorrection " << endmsg;
97 return StatusCode::FAILURE;
98 }
99
100 corr = dynamic_cast<CaloCellCorrection*> (tool);
101 if(!corr )
102 {msg(MSG::ERROR) << " Can't d-cast to CaloCellCorrection* " << endmsg;
103 return StatusCode::FAILURE;
104 }
105 m_LArCellCorrTools.push_back(corr);
106 }
107
108 //Build list of preselected Feedthroughs
109 if (m_vBEPreselection.size() && m_vPosNegPreselection.size() && m_vFTPreselection.size()) {
110 ATH_MSG_INFO("Building list of selected feedthroughs");
111 for (const unsigned BE : m_vBEPreselection) {
112 for (const unsigned PN : m_vPosNegPreselection) {
113 for (const unsigned FT : m_vFTPreselection) {
114 HWIdentifier finalFTId=m_onlineHelper->feedthrough_Id(BE,PN,FT);
115 unsigned int finalFTId32 = finalFTId.get_identifier32().get_compact();
116 ATH_MSG_INFO("Adding feedthrough Barrel/Endcap=" << BE << " pos/neg=" << PN << " FT=" << FT
117 << " (0x" << std::hex << finalFTId32 << std::dec << ")");
118 m_vFinalPreselection.push_back(finalFTId32);
119 }
120 }
121 }
122 std::sort(m_vFinalPreselection.begin(),m_vFinalPreselection.end());
123 }//end if something set
124 else {
125 if (m_vBEPreselection.size() || m_vPosNegPreselection.size() || m_vFTPreselection.size()) {
126 msg(MSG::ERROR) << "Feedthrough preselection: jobOption inconsistency! "<< endmsg;
127 msg(MSG::ERROR) << "Need to set all three jobOptions BEPreselection PNPreselecton and FTPreselection" << endmsg;
128 return StatusCode::FAILURE;
129 }
130 ATH_MSG_DEBUG("No feedthrough preselection by jobOptions.");
131 }
132 return sc;
133}
134
135
136
138 const uint32_t* p, uint32_t n, LArDigitContainer& coll, CaloGain::CaloGain RequestedGain) const
139{ // Digit pointer
140 LArDigit * dg=0 ;
141 CaloGain::CaloGain calogain;
142 uint32_t gain;
143 int fcNb;
144 std::vector<short> samples;
145 LArRodBlockStructure* BlStruct=prepareBlockStructure(robFrag, p, n, RequestedGain);
146 if (!BlStruct) return;
147
148 do {
149 HWIdentifier fId( Identifier32(BlStruct->getFEBID()) );
150 unsigned int fId32 = fId.get_identifier32().get_compact();
151 if (!m_onlineHelper->isValidId(fId)) {
152 msg(MSG::WARNING) << "Invalid FEB identifer 0x" << std::hex << fId32 << std::dec << ". Skipping" << endmsg;
153 continue;
154 }
155 // std::cout << "digit FEBID=" << std::hex<< " " <<fId32 << std::dec<<std::endl;
156 if(m_febExchange) {
157 if (fId32 == m_febId1) {
159 fId32 = fId.get_identifier32().get_compact();
160 }
161 else if(fId32 == m_febId2) {
163 fId32 = fId.get_identifier32().get_compact();
164 }
165 }
166
167 // IWS 24.01.2006 protection against NULL events (null pointer to rawdata block)
168 if (!BlStruct->hasRawDataBlock())
169 {
170 ATH_MSG_DEBUG("No Raw Data for this FEB - NULL event for FEBID 0x"<< std::hex << BlStruct->getFEBID() << std::dec);
171 continue;
172 }
173
174 // RL 04.17.2008 skip check for some FEBs
175 int do_check=1;
176 std::vector<unsigned int>::const_iterator it_feb = m_IgnoreCheckFEBs.begin();
177 std::vector<unsigned int>::const_iterator it_feb_end = m_IgnoreCheckFEBs.end();
178 for(; it_feb!=it_feb_end;++it_feb)
179 if(fId==*it_feb) {
180 do_check=0;
181 break;
182 }
183 if(do_check) {
184 //WL 31.10.2007 //check RodStatus-word to catch corrupt events
185 if (BlStruct->getStatus() & m_StatusNMask) {
186 msg(MSG::WARNING) << "RodStatus&0x" << std::hex << m_StatusNMask << " indicates corrupt data for FEB "<< std::hex << fId32 << std::dec <<". Ignored." << endmsg;
187 continue;
188 }
189 }
190 // RL 05.11.2007 checksum
191 if(m_CheckSum) {
192 const uint32_t onsum = BlStruct->onlineCheckSum();
193 const uint32_t offsum = BlStruct->offlineCheckSum();
194 if(onsum!=offsum) {
195 msg(MSG::WARNING) << "Checksum error for FEB: " << MSG::hex << fId32 << endmsg;
196 msg(MSG::WARNING) << " online checksum = " << MSG::hex << onsum << endmsg;
197 msg(MSG::WARNING) << " offline checksum = " << MSG::hex << offsum << MSG::dec << endmsg;
198 continue;
199 }
200 }
201
202 if (m_vFinalPreselection.size()) {
203 const unsigned int ftId=m_onlineHelper->feedthrough_Id(fId).get_identifier32().get_compact();
204 if (!std::binary_search(m_vFinalPreselection.begin(), m_vFinalPreselection.end(),ftId)) {
205 ATH_MSG_DEBUG("Feedthrough with id 0x" << MSG::hex << ftId << MSG::dec <<" not in preselection. Ignored.");
206 continue;
207 }
208 }
209 const int NthisFebChannel=m_onlineHelper->channelInSlotMax(fId);
210 while (BlStruct->getNextRawData(fcNb,samples,gain))
211 {if (fcNb>=NthisFebChannel)
212 continue;
213 if (samples.size()==0) continue; // Ignore missing cells
214 HWIdentifier cId = m_onlineHelper->channel_Id(fId,fcNb);
215 calogain=(CaloGain::CaloGain)gain;
216 dg = new LArDigit(cId, calogain, std::move(samples));
217 samples.clear();
218 coll.push_back(dg);
219 }
220 }
221 while (BlStruct->nextFEB()); //Get NextFeb
222 return;
223}
224
225//*******
226
227
229 const uint32_t* p, uint32_t n, LArRawChannelContainer& coll, CaloGain::CaloGain RequestedGain) const
230{
231 int32_t energy;
232 int32_t time;
233 int32_t quality;
234 uint32_t gain;
235 int fcNb;
236 HWIdentifier cId;
237 LArRodBlockStructure* BlStruct=prepareBlockStructure(robFrag, p, n, RequestedGain);
238 if (!BlStruct) return;
239
240 do {
241 HWIdentifier fId( Identifier32(BlStruct->getFEBID()) );
242 unsigned int fId32 = fId.get_identifier32().get_compact();
243 if (!m_onlineHelper->isValidId(fId)) {
244 msg(MSG::WARNING) << "Invalid FEB identifer " << std::hex << fId32 << std::dec << ". Skipping" << endmsg;
245 continue;
246 }
247 // std::cout << "rawChan FEBID=" << std::hex <<fId32 << std::dec<<std::endl;
248
249 if(m_febExchange) {
250 if (fId32 == m_febId1) {
252 fId32 = fId.get_identifier32().get_compact();
253 }
254 else if(fId32 == m_febId2) {
256 fId32 = fId.get_identifier32().get_compact();
257 }
258 }
259 if (!BlStruct->hasPhysicsBlock()) {
260 ATH_MSG_DEBUG("No Physics Data for this FEB - NULL event for FEBID 0x" << std::hex << BlStruct->getFEBID() << std::dec);
261 continue;
262 }
263
264 // RL 04.17.2008 skip check for some FEBs
265 int do_check=1;
266 std::vector<unsigned int>::const_iterator it_feb = m_IgnoreCheckFEBs.begin();
267 std::vector<unsigned int>::const_iterator it_feb_end = m_IgnoreCheckFEBs.end();
268 for(; it_feb!=it_feb_end;++it_feb)
269 if(fId==*it_feb) {
270 do_check=0;
271 break;
272 }
273 if(do_check) {
274 //WL 31.10.2007 //check RodStatus-word to catch corrupt events
275 if (BlStruct->getStatus() & m_StatusNMask) {
276 msg(MSG::WARNING) << "RodStatus&0x" << std::hex << m_StatusNMask << " indicates corrupt data for FEB "<< std::hex << fId32 << std::dec <<". Ignored." << endmsg;
277 continue;
278 }
279 }
280
281 // RL 05.11.2007 checksum
282 if(m_CheckSum) {
283 const uint32_t onsum = BlStruct->onlineCheckSum();
284 const uint32_t offsum = BlStruct->offlineCheckSum();
285 if(onsum!=offsum) {
286 msg(MSG::WARNING) << "Checksum error:" << endmsg;
287 msg(MSG::WARNING) << " online checksum = " << MSG::hex << onsum << endmsg;
288 msg(MSG::WARNING) << " offline checksum = " << MSG::hex << offsum << endmsg;
289 continue;
290 }
291 }
292
293 if (m_vFTPreselection.size()) {
294 int ftId=m_onlineHelper->feedthrough_Id(fId).get_identifier32().get_compact();
295 if (!std::binary_search(m_vFTPreselection.begin(), m_vFTPreselection.end(),ftId)) {
296 ATH_MSG_DEBUG("Feedthrough with id " << std::hex << ftId << std::dec <<" not in preselection. Ignored.");
297 continue;
298 }
299 }
300 const int NthisFebChannel=m_onlineHelper->channelInSlotMax(fId);
301 while (BlStruct->getNextEnergy(fcNb,energy,time,quality,gain)) {
302 if (fcNb>=NthisFebChannel)
303 continue;
304 cId = m_onlineHelper->channel_Id(fId,fcNb);
305 uint16_t iquality = 0;
306 uint16_t iprovenance = 0x1000;
307 if (quality>0) {
308 iprovenance |= 0x2000;
309 iquality = (quality & 0xFFFF);
310 }
311 LArRawChannel chan(cId, energy, time, iquality, iprovenance, (CaloGain::CaloGain)gain);
312 coll.push_back(chan);
313 }
314 }
315 while (BlStruct->nextFEB()); //Get NextFeb
316 return;
317}
318
319
321 const uint32_t* p,
322 uint32_t n,
324 CaloGain::CaloGain RequestedGain,
325 const LArCalibLineMapping& calibLineMapping,
326 const LArOnOffIdMapping& onOffIdMapping) const
327{ // CalibDigit pointer
328 LArCalibDigit * dg=0 ;
329 uint32_t gain;
330 CaloGain::CaloGain calogain;
331 int fcNb;
332 uint16_t dac, delay;
333 bool ispulsed;
334 std::vector<short> samples;
335
336 ATH_MSG_VERBOSE("FillCollection for LArCalibDigitContainer is called.");
337 LArRodBlockStructure* BlStruct=prepareBlockStructure(robFrag, p, n, RequestedGain);
338 if (!BlStruct) return;
339 if (BlStruct->canSetCalibration()) {
340 dac=BlStruct->getDAC();
341 delay=BlStruct->getDelay();
342 // int iFeb=0, iCan=0; //For debug purpose
343 do
344 {
345 // IWS 24.01.2006 protection against NULL events (null pointer to rawdata block)
346 if (!BlStruct->hasRawDataBlock()) {
347 ATH_MSG_DEBUG("No Raw Data for this FEB - NULL event for FEBID " << std::hex << BlStruct->getFEBID());
348 continue;
349 }
350 HWIdentifier fId(Identifier32(BlStruct->getFEBID()));
351 unsigned int fId32 = fId.get_identifier32().get_compact();
352 // RL 20.09.2006 protection against 0 FebId
353 if (!fId32){
354 ATH_MSG_DEBUG("Bad FebID=0x"<< std::hex << BlStruct->getFEBID() << " found for this FEB, skipping it!");
355 continue;
356 }
357 // RL 04.17.2008 skip check for some FEBs
358 int do_check=1;
359 std::vector<unsigned int>::const_iterator it_feb = m_IgnoreCheckFEBs.begin();
360 std::vector<unsigned int>::const_iterator it_feb_end = m_IgnoreCheckFEBs.end();
361 for(; it_feb!=it_feb_end;++it_feb)
362 if(fId==*it_feb) {
363 do_check=0;
364 break;
365 }
366 if(do_check) {
367 //WL 31.10.2007 //check RodStatus-word to catch corrupt events
368 if (BlStruct->getStatus() & m_StatusNMask) {
369 msg(MSG::WARNING) << "RodStatus&0x" << std::hex << m_StatusNMask << " indicates corrupt data for FEB "<< std::hex << fId32 << std::dec <<". Ignored." << endmsg;
370 continue;
371 }
372 }
373 // RL 05.11.2007 checksum
374 if(m_CheckSum) {
375 uint32_t onsum = BlStruct->onlineCheckSum();
376 uint32_t offsum = BlStruct->offlineCheckSum();
377 if(onsum!=offsum) {
378 msg(MSG::WARNING) << "Checksum error:" << endmsg;
379 msg(MSG::WARNING) << " online checksum = " << MSG::hex << onsum << endmsg;
380 msg(MSG::WARNING) << " offline checksum = " << MSG::hex << offsum << endmsg;
381 continue;
382 }
383 }
384 if(m_febExchange) {
385 if (fId32 == m_febId1) {
387 fId32 = fId.get_identifier32().get_compact();
388 }
389 else if(fId32 == m_febId2) {
391 fId32 = fId.get_identifier32().get_compact();
392 }
393 }
394
395 if (m_vFinalPreselection.size()) {
396 unsigned int ftId=m_onlineHelper->feedthrough_Id(fId).get_identifier32().get_compact();
397 if (!std::binary_search(m_vFinalPreselection.begin(), m_vFinalPreselection.end(),ftId)) {
398 ATH_MSG_DEBUG("Feedthrough with id 0x" << std::hex << ftId << std::dec <<" not in preselection. Ignored.");
399 continue;
400 }
401 }
402 const int NthisFebChannel=m_onlineHelper->channelInSlotMax(fId);
403 while (BlStruct->getNextRawData(fcNb,samples,gain))
404 {if (fcNb>=NthisFebChannel)
405 continue;
406 if (samples.size()==0) continue; // Ignore missing cells
407 HWIdentifier cId = m_onlineHelper->channel_Id(fId,fcNb);
408 ispulsed=BlStruct->getPulsed(fcNb);
409
410 calogain=(CaloGain::CaloGain)gain;
411 dg = new LArCalibDigit(cId, calogain, samples, dac, delay, ispulsed);
412 samples.clear();
413 coll.push_back(dg);
414 }
415 }
416 while (BlStruct->nextFEB()); //Get NextFeb
417 }
418 else {//Not a calibration data block, try to get from database
419 ATH_MSG_VERBOSE("Not LArCalibDigit data block found. Building it using DB values");
420 //1st step, get Calib board config object
421 const LArCalibParams* calibParams = nullptr;
422 StatusCode sc=detStore()->retrieve(calibParams);
423 if (sc.isFailure())
424 {msg(MSG::ERROR) << "Cannot load LArCalibParams from DetStore!" << endmsg;
425 return;
426 }
427 //2st step, get Event number
429 if (!evt.isValid()) {
430 ATH_MSG_ERROR("Cannot get EventInfo");
431 return; //Return empty container.
432 }
433 const unsigned eventNb=evt->eventNumber();
434 const std::vector<HWIdentifier>* calibChannelIDs;
435 do { //Loop over all FEBs in this ROD
436
437 // IWS 24.01.2006 protection against NULL events (null pointer to rawdata block)
438 if (!BlStruct->hasRawDataBlock()) {
439 ATH_MSG_DEBUG("No Raw Data for this FEB - NULL event for FEBID 0x" << std::hex << BlStruct->getFEBID() << std::dec);
440 continue;
441 }
442 HWIdentifier fId(Identifier32(BlStruct->getFEBID()));
443 unsigned int fId32 = fId.get_identifier32().get_compact();
444 // RL 20.09.2006 protection against 0 FebId
445 if (!fId32) {
446 ATH_MSG_DEBUG("Bad FebID=0x" << std::hex << BlStruct->getFEBID() << " found for this FEB, skipping it!" << std::dec);
447 continue;
448 }
449 if(m_febExchange) {
450 if (fId32 == m_febId1) {
452 fId32 = fId.get_identifier32().get_compact();
453 }
454 else if(fId32 == m_febId2) {
456 fId32 = fId.get_identifier32().get_compact();
457 }
458 }
459 fcNb=0;
460 HWIdentifier cId;
461 do { //Search for the first connected channel of this FEB (probably the first one...)
462 fcNb++;
463 cId = m_onlineHelper->channel_Id(fId,fcNb);
464 calibChannelIDs=&calibLineMapping.calibSlotLine(cId);
465 }
466 while ( (!onOffIdMapping.isOnlineConnected(cId) || calibChannelIDs->size()==0) && fcNb<128); // This is the right conditions to exit the loop!
467
468 if ( calibChannelIDs->size()==0 ) {
469 msg(MSG::ERROR) << "Cannot get calibration Channel ID for FEB " << std::hex << fId32 << std::dec << endmsg;
470 return;
471 }
472
473 uint16_t dac;
474 uint16_t delay;
475
476 std::vector<HWIdentifier>::const_iterator csl_it=calibChannelIDs->begin();
477 //Derive DAC and Delay value from this channel
478 dac=calibParams->DAC(eventNb,*csl_it);
479 delay=calibParams->Delay(eventNb,*csl_it);
480
481 //Now start looping over channels in FEB
482 const int NthisFebChannel=m_onlineHelper->channelInSlotMax(fId);
483 //std::cout << "Processing FEB #" << iFeb++ << std::endl;
484
485 //int iCan=0;
486
487 fcNb=0;
488 while (BlStruct->getNextRawData(fcNb,samples,gain))
489 {
490 if (fcNb>=NthisFebChannel) continue;
491 if (samples.size()==0) continue; // Ignore missing cells
492 cId = m_onlineHelper->channel_Id(fId,fcNb);
493 calibChannelIDs=&calibLineMapping.calibSlotLine(cId);
494 //if (calibChannelIDs->size()==0)
495 //continue; //Disconnected channel
496 //For the time being, I assume we are in H8 and have only one calib channel per FEB channel
497
498 if (calibChannelIDs->size()!=0) {
499 csl_it=calibChannelIDs->begin();
500 ispulsed=calibParams->isPulsed(eventNb,*csl_it);
501
502 } else ispulsed=0;
503 calogain=(CaloGain::CaloGain)gain;
504 dg = new LArCalibDigit(cId, calogain, samples, dac, delay, ispulsed);
505 samples.clear();
506
507 coll.push_back(dg);
508 //iCan++;
509 }
510 }
511 while (BlStruct->nextFEB()); //Get NextFeb
512 }
514 return;
515}
516
518 const uint32_t* p,
519 uint32_t n,
521 CaloGain::CaloGain RequestedGain,
522 const LArCalibLineMapping& calibLineMapping) const
523{ // Accumulated Digit pointer
525 CaloGain::CaloGain calogain;
526 uint32_t gain, ntrigger;
527 int dac, delay, NStep=-1, StepIndex=-1;
528 bool ispulsed;
529 uint16_t ispulsed_int;
530 int bitShift;
531 uint32_t FirstGoodFEB=1;
532 int fcNb;
533 std::vector< uint64_t > samplesSum;
534 std::vector< uint64_t > samples2Sum;
535
536 // for(int i=0;i<16;i++)
537 // std::cout << " - " << std::hex << p[i] << std::endl;
538
539 LArRodBlockStructure* BlStruct=prepareBlockStructure(robFrag, p, n, RequestedGain);
540 if (!BlStruct) return;
541 do
542 {
543 // IWS 24.01.2006 protection against NULL events (null pointer to rawdata block)
544 if (!BlStruct->hasCalibBlock())
545 {
546 ATH_MSG_DEBUG("No Calib Data for this FEB - NULL event");
547 continue;
548 }
549 if(FirstGoodFEB)
550 {
551 FirstGoodFEB=0;
552 }
553 HWIdentifier fId(Identifier32(BlStruct->getFEBID()));
554 unsigned int fId32 = fId.get_identifier32().get_compact();
555 // RL 20.09.2006 protection against 0 FebId
556 if (!fId32){
557 ATH_MSG_DEBUG("Bad FebID=0x" << std::hex << BlStruct->getFEBID() << " found for this FEB, skipping it!" << std::dec);
558 continue;
559 }
560 // RL 04.17.2008 skip check for some FEBs
561 int do_check=1;
562 std::vector<unsigned int>::const_iterator it_feb = m_IgnoreCheckFEBs.begin();
563 std::vector<unsigned int>::const_iterator it_feb_end = m_IgnoreCheckFEBs.end();
564 for(; it_feb!=it_feb_end;++it_feb)
565 if(fId==*it_feb) {
566 do_check=0;
567 break;
568 }
569 if(do_check) {
570 //WL 31.10.2007 //check RodStatus-word to catch corrupt events
571 if (BlStruct->getStatus() & m_StatusNMask) {
572 msg(MSG::WARNING) << "RodStatus&0x" << std::hex << m_StatusNMask << " indicates corrupt data for FEB "<< std::hex << fId32 << std::dec <<". Ignored." << endmsg;
573 continue;
574 }
575 }
576 // RL 05.11.2007 checksum
577 if(m_CheckSum) {
578 uint32_t onsum = BlStruct->onlineCheckSum();
579 uint32_t offsum = BlStruct->offlineCheckSum();
580 if(onsum!=offsum) {
581 msg(MSG::WARNING) << "Checksum error:" << endmsg;
582 msg(MSG::WARNING) << " online checksum = " << MSG::hex << onsum << endmsg;
583 msg(MSG::WARNING) << " offline checksum = " << MSG::hex << offsum << endmsg;
584 continue;
585 }
586 }
587 if(m_febExchange) {
588 if (fId32 == m_febId1) {
590 fId32 = fId.get_identifier32().get_compact();
591 }
592 else if(fId32 == m_febId2) {
594 fId32 = fId.get_identifier32().get_compact();
595 }
596 }
597
598 if (m_vFinalPreselection.size()) {
599 unsigned int ftId=m_onlineHelper->feedthrough_Id(fId).get_identifier32().get_compact();
600 if (!std::binary_search(m_vFinalPreselection.begin(), m_vFinalPreselection.end(),ftId)) {
601 ATH_MSG_DEBUG("Feedthrough with id " << std::hex << ftId << std::dec <<" not in preselection. Ignored.");
602 continue;
603 }
604 }
605 int NthisFebChannel=m_onlineHelper->channelInSlotMax(fId);
606 uint32_t idum=0;
607 while (BlStruct->getNextAccumulatedCalibDigit(fcNb,samplesSum,samples2Sum,idum,gain))
608 {
609 ispulsed_int=0;
610 bitShift=0;
611 if (fcNb>=NthisFebChannel)continue;
612 if (samplesSum.size()==0) continue; // Ignore missing cells
613 HWIdentifier cId = m_onlineHelper->channel_Id(fId,fcNb);
614 calogain=(CaloGain::CaloGain)gain;
615 ntrigger=BlStruct->getNTrigger();
616 dac=BlStruct->getDAC();
617 delay=BlStruct->getDelay();
618 NStep=BlStruct->getNStep();
619 if(!NStep) NStep=1; // To be able to decode v6 code
620 StepIndex=BlStruct->getStepIndex();
621 // 08.08.2005 IWS get calib line
622 const std::vector<HWIdentifier>& calibChannelIDs = calibLineMapping.calibSlotLine(cId);
623 if (calibChannelIDs.size()==0) {
624 samplesSum.clear();
625 samples2Sum.clear();
626 continue;// connected channel
627 }
628 //GR: Loop over all the calib chans instead of just looking at the first one and set four bit isPulsed int
629 for(std::vector<HWIdentifier>::const_iterator csl_it=calibChannelIDs.begin(); csl_it!=calibChannelIDs.end();++csl_it){
630 uint32_t calibLine = m_onlineHelper->channel(*csl_it);
631 ispulsed=BlStruct->getPulsed(calibLine);
632 ispulsed_int=( ispulsed_int | ((uint16_t)ispulsed<<bitShift) );
633 bitShift++;
634 }
635
636 dg=new LArAccumulatedCalibDigit(cId, calogain, samplesSum, samples2Sum, ntrigger, dac, delay,
637 (uint16_t)ispulsed_int, NStep, StepIndex);
638
639 coll.push_back(dg);
640 } // End while
641 }//End do loop of FEBs
642 while (BlStruct->nextFEB()); //Get NextFeb
643
644 return;
645}
646
648 const uint32_t* p, uint32_t n, LArAccumulatedDigitContainer& coll, CaloGain::CaloGain RequestedGain) const
649{ // Accumulated Digit pointer
650 LArAccumulatedDigit * dg=0 ;
651 CaloGain::CaloGain calogain;
652 uint32_t gain, ntrigger;
653 //int NStep=-1, StepIndex=-1;
654 int fcNb;
655 std::vector<uint64_t> sampleSum;
656 std::vector< uint64_t > sampleSquare;
657
658 // for(int i=0;i<16;i++)
659 // std::cout << " - " << std::hex << p[i] << std::endl;
660
661 LArRodBlockStructure* BlStruct=prepareBlockStructure(robFrag, p, n, RequestedGain);
662 if (!BlStruct) return;
663 do
664 {
665 // IWS 24.01.2006 protection against NULL events (null pointer to rawdata block)
666 if (!BlStruct->hasAccumBlock()) {
667 ATH_MSG_DEBUG("No Accum Data for this FEB - NULL event");
668 continue;
669 }
670 HWIdentifier fId(Identifier32(BlStruct->getFEBID()));
671 unsigned int fId32 = fId.get_identifier32().get_compact();
672 // RL 20.09.2006 protection against 0 FebId
673 if (!fId32) {
674 ATH_MSG_DEBUG("Bad FebID=0x" << std::hex << BlStruct->getFEBID() << " found for this FEB, skipping it!" << std::dec);
675 continue;
676 }
677 // RL 04.17.2008 skip check for some FEBs
678 int do_check=1;
679 std::vector<unsigned int>::const_iterator it_feb = m_IgnoreCheckFEBs.begin();
680 std::vector<unsigned int>::const_iterator it_feb_end = m_IgnoreCheckFEBs.end();
681 for(; it_feb!=it_feb_end;++it_feb)
682 if(fId==*it_feb) {
683 do_check=0;
684 break;
685 }
686 if(do_check) {
687 //WL 31.10.2007 //check RodStatus-word to catch corrupt events
688 if (BlStruct->getStatus() & m_StatusNMask) {
689 msg(MSG::WARNING) << "RodStatus&0x" << std::hex << m_StatusNMask << " indicates corrupt data for FEB "<< std::hex << fId32 << std::dec <<". Ignored." << endmsg;
690 continue;
691 }
692 }
693 // RL 05.11.2007 checksum
694 if(m_CheckSum) {
695 uint32_t onsum = BlStruct->onlineCheckSum();
696 uint32_t offsum = BlStruct->offlineCheckSum();
697 if(onsum!=offsum) {
698 msg(MSG::WARNING) << "Checksum error:" << endmsg;
699 msg(MSG::WARNING) << " online checksum = " << MSG::hex << onsum << endmsg;
700 msg(MSG::WARNING) << " offline checksum = " << MSG::hex << offsum << endmsg;
701 continue;
702 }
703 }
704 if(m_febExchange) {
705 if (fId32 == m_febId1) {
707 fId32 = fId.get_identifier32().get_compact();
708 }
709 else if(fId32 == m_febId2) {
711 fId32 = fId.get_identifier32().get_compact();
712 }
713 }
714
715 if (m_vFinalPreselection.size()) {
716 unsigned int ftId=m_onlineHelper->feedthrough_Id(fId).get_identifier32().get_compact();
717 if (!std::binary_search(m_vFinalPreselection.begin(), m_vFinalPreselection.end(),ftId)) {
718 ATH_MSG_DEBUG("Feedthrough with id " << std::hex << ftId << std::dec <<" not in preselection. Ignored.");
719 continue;
720 }
721 }
722 int NthisFebChannel=m_onlineHelper->channelInSlotMax(fId);
723 ntrigger=BlStruct->getNTrigger();
724 //NStep=BlStruct->getNStep();
725 //if(!NStep) NStep=1; // To be able to decode v6 code
726 //StepIndex=BlStruct->getStepIndex();
727 while (BlStruct->getNextAccumulatedDigit(fcNb,sampleSum,sampleSquare,gain)) {
728 if (fcNb>=NthisFebChannel)continue;
729 if (sampleSquare.size()==0) continue; // Ignore missing cells
730 HWIdentifier cId = m_onlineHelper->channel_Id(fId,fcNb);
731 calogain=(CaloGain::CaloGain)gain;
732 dg=new LArAccumulatedDigit(cId,calogain,sampleSum,sampleSquare,ntrigger);
733 coll.push_back(dg);
734 } // End while
735 }//End do loop of FEBs
736 while (BlStruct->nextFEB()); //Get NextFeb
737
738 return;
739}
740
742 const uint32_t* p, uint32_t n, LArFebHeaderContainer& coll,const CaloGain::CaloGain RequestedGain) const
743{
744 LArFebHeader* larFebHeader;
745 //uint32_t NWtot=0;
746 HWIdentifier FEBID;
747
748 // for(int i=0;i<16;i++)
749 // std::cout << " - " << std::hex << p[i] << std::endl;
750
751 LArRodBlockStructure* BlStruct=prepareBlockStructure(robFrag, p, n, RequestedGain);
752 if (!BlStruct) return;
753
754 do{
755 //Read first FEB. The header of this feb is combined with the ROD-Header
756 //NWtot=BlStruct->getNumberOfWords();
757 //if(NWtot<=4) continue;
758
759 FEBID=HWIdentifier(Identifier32(BlStruct->getFEBID()));
760 unsigned int FEBID32 = FEBID.get_identifier32().get_compact();
761 if (!m_onlineHelper->isValidId(FEBID)) {
762 msg(MSG::WARNING) << "Invalid FEB identifer " << std:: hex << FEBID32 << std::dec << ". Skipping" << endmsg;
763 continue;
764 }
765
766 if(m_febExchange) {
767 if (FEBID32 == m_febId1) {
769 FEBID32 = FEBID.get_identifier32().get_compact();
770 }
771 else if(FEBID32 == m_febId2) {
773 FEBID32 = FEBID.get_identifier32().get_compact();
774 }
775 }
776
777 if (m_vFinalPreselection.size()) {
778 const unsigned int ftId=m_onlineHelper->feedthrough_Id(FEBID).get_identifier32().get_compact();
779 if (!std::binary_search(m_vFinalPreselection.begin(), m_vFinalPreselection.end(),ftId)) {
780 ATH_MSG_DEBUG("Feedthrough with id 0x" << std::hex << ftId << std::dec <<" not in preselection. Ignored.");
781 continue;
782 }
783 }
784
785
786
787 larFebHeader=new LArFebHeader(FEBID);
788 //setROD header data
789
790 larFebHeader->SetFormatVersion(robFrag.rod_version());
791 larFebHeader->SetSourceId(robFrag.rod_source_id());
792 larFebHeader->SetRunNumber(robFrag.rod_run_no());
793 larFebHeader->SetELVL1Id(robFrag.rod_lvl1_id());
794 larFebHeader->SetBCId(robFrag.rod_bc_id());
795 larFebHeader->SetLVL1TigType(robFrag.rod_lvl1_trigger_type());
796 larFebHeader->SetDetEventType(robFrag.rod_detev_type());
797
798 //set DSP data
799 const unsigned nsample=BlStruct->getNumberOfSamples();
800 const uint32_t status= BlStruct->getStatus();
801 larFebHeader->SetDspCodeVersion(BlStruct->getDspCodeVersion());
802 larFebHeader->SetDspEventCounter(BlStruct->getDspEventCounter());
803 larFebHeader->SetRodResults1Size(BlStruct->getResults1Size());
804 larFebHeader->SetRodResults2Size(BlStruct->getResults2Size());
805 larFebHeader->SetRodRawDataSize(BlStruct->getRawDataSize());
806 larFebHeader->SetNbSweetCells1(BlStruct->getNbSweetCells1());
807 larFebHeader->SetNbSweetCells2(BlStruct->getNbSweetCells2());
808 larFebHeader->SetNbSamples(nsample);
809 larFebHeader->SetOnlineChecksum(BlStruct->onlineCheckSum());
810 larFebHeader->SetOfflineChecksum(BlStruct->offlineCheckSum());
811
812 if(!BlStruct->hasControlWords()) {
813 larFebHeader->SetFebELVL1Id(robFrag.rod_lvl1_id());
814 larFebHeader->SetFebBCId(robFrag.rod_bc_id());
815 } else {
816 const uint16_t evtid = BlStruct->getCtrl1(0) & 0x1f;
817 const uint16_t bcid = BlStruct->getCtrl2(0) & 0x1fff;
818
819 larFebHeader->SetFebELVL1Id(evtid);
820 larFebHeader->SetFebBCId(bcid);
821 for(int iadc=0;iadc<16;iadc++) {
822 larFebHeader->SetFebCtrl1(BlStruct->getCtrl1(iadc));
823 larFebHeader->SetFebCtrl2(BlStruct->getCtrl2(iadc));
824 larFebHeader->SetFebCtrl3(BlStruct->getCtrl3(iadc));
825 }
826 for(unsigned int i = 0; i<nsample; i++ ) {
827 larFebHeader->SetFebSCA(BlStruct->getRadd(0,i) & 0xff);
828 }
829 }
830 larFebHeader->SetRodStatus(status);
831 coll.push_back(larFebHeader);
832
833 } while (BlStruct->nextFEB()); //Get NextFeb
834}
835
836
838LArRodDecoder::prepareBlockStructure1 (const uint16_t rodMinorVersion, const uint32_t robBlockType) const
839{
840 const unsigned MAXMINOR = 12;
841 const unsigned MAXTYPE = 10;
842
843 if (rodMinorVersion > MAXMINOR || robBlockType > MAXTYPE) {
844 msg(MSG::ERROR) << "Bad Rod block type " << robBlockType
845 << " / " << rodMinorVersion << endmsg;
846 return nullptr;
847 }
848 std::vector<std::unique_ptr<LArRodBlockStructure> >& blstructs =
849 *m_blstructs.get();
850 unsigned int index = robBlockType * (MAXMINOR+1) + rodMinorVersion;
851 if (blstructs.empty()) {
852 blstructs.resize ((MAXMINOR+1)*(MAXTYPE+1));
853 }
854 if (!blstructs[index]) {
855 blstructs[index] = makeBlockStructure (robBlockType, rodMinorVersion);
856 }
857 if (!blstructs[index]) {
858 msg(MSG::ERROR) << "Bad Rod block type " << robBlockType
859 << " / " << rodMinorVersion << endmsg;
860 return nullptr;
861 }
862
863#ifndef NDEBUG
864 ATH_MSG_DEBUG("Found version " << rodMinorVersion << " of Rod block type " << robBlockType);
865#endif
866
867 return blstructs[index].get();
868}
869
870
873 const uint32_t* p, uint32_t n, const CaloGain::CaloGain RequestedGain) const
874{
875#ifndef NDEBUG
876 ATH_MSG_DEBUG("Prepare LArRodBlockStructure. Got a fragement of size " << n);
877#endif
878
879 //Get version and blocktype form header
880 eformat::helper::Version ver(robFrag.rod_version());
881 const uint16_t rodMinorVersion=ver.minor_version();
882 const uint32_t rodBlockType=robFrag.rod_detev_type()&0xff;
883 LArRodBlockStructure* BlStruct = prepareBlockStructure1 (rodMinorVersion, rodBlockType);
884 if (!BlStruct) {
885 return nullptr;
886 }
887
888 //BlStruct->dumpFragment(v); // For testing purpose
889 if (!BlStruct->setFragment(p,n)) {
890 constexpr int maxMess = 100;
891 static std::atomic<int> nMess = 1;
892 int thismess = nMess++;
893 if (thismess <= maxMess) {
894 msg(MSG::ERROR) << "Could not set fragment (wrong number of samples in data ?) - container will not be filled" << endmsg;
895 if (thismess == maxMess)
896 msg(MSG::ERROR) << "This message will not be repeated" << endmsg;
897 }
898 return NULL;
899 }
900#ifndef NDEBUG
901 ATH_MSG_VERBOSE("Set Fragment at address "<< &(p[0]) << " " << p[5]);
902#endif
903
904 BlStruct->setGain(RequestedGain); //Will be ignored if BlockStructure does not support fixed gains.
905 //FIXME: Very ugly hack! See explanation in LArRodDecoder.h
906 if (m_firstSample) {
907 BlStruct->setFirstSample(m_firstSample);
908 }
909 return BlStruct;
910}
911
912
913std::unique_ptr<LArRodBlockStructure>
914LArRodDecoder::makeBlockStructure (unsigned int rodBlockType,
915 unsigned int rodMinorVersion) const
916{
917 switch (rodBlockType) {
918 case 2:
919 // RodBlockType 2 = Transparent mode only
920 switch (rodMinorVersion) {
921 case 0: // Transparent mode v0 05.01.2004
922 case 1: // Transparent mode v0
923 case 2: // Transparent mode v0
924 case 3: // Transparent mode v0
925 case 4: // Transparent mode v0
926 return std::make_unique<LArRodBlockTransparentV0<LArRodBlockHeaderTransparentV0> >();
927 case 5: // Calibration (Transparent mode) v1 17.01.2006
928 return std::make_unique<LArRodBlockCalibrationV1>();
929 case 6: // Calibration (Transparent mode) v3 31.05.2006
930 case 7: // Calibration (Transparent mode) v3
931 case 8: // Calibration (Transparent mode) v3
932 case 9: // Calibration (Transparent mode) v3
933 case 10:// Calibration (Transparent mode) v3
934 case 11:// Calibration (Transparent mode) v3
935 case 12:// Calibration (Transparent mode) v3
936 return std::make_unique<LArRodBlockCalibrationV3>();
937 default:
938 break;
939 }
940 break;
941
942 case 3:
943 // RodBlockType 3 = Test mode
944 return std::make_unique<LArRodBlockTransparentV0<LArRodBlockHeaderTransparentV0> >();
945
946 case 4:
947 // RodBlockType 4 = Physics mode
948 switch (rodMinorVersion) {
949 case 0: // Physics mode v0 05.01.2004 first draft
950 return std::make_unique<LArRodBlockPhysicsV0>();
951 case 1: // Physics mode v1 19.08.2004 only small differences
952 return std::make_unique<LArRodBlockPhysicsV1>();
953 case 2: // Physics mode v2 05.10.2004 adapted to real DSP data
954 case 3: // Physics mode v2
955 case 4: // Physics mode v2
956 case 5: // Physics mode v2
957 case 6: // Physics mode v2
958 case 7: // Physics mode v2
959 case 8: // Physics mode v2
960 return std::make_unique<LArRodBlockPhysicsV2>();
961 case 9: // Physics mode v4 10.07.2007 for commissioning
962 return std::make_unique<LArRodBlockPhysicsV4>();
963 case 10: // Physics mode v5 16.06.2008 for LHC
964 case 11: // Physics mode v5 16.06.2008 for LHC
965 {
966 auto bl = std::make_unique<LArRodBlockPhysicsV5>();
968 bl->setRequiredNSamples(m_requiredPhysicsNSamples);
969 }
970 return bl;
971 }
972 case 12: // Physics mode v5 09.03.2011 for LHC
973 {
974 auto bl = std::make_unique<LArRodBlockPhysicsV6>();
976 bl->setRequiredNSamples(m_requiredPhysicsNSamples);
977 }
978 return bl;
979 }
980 default:
981 break;
982 }
983 break;
984
985 case 5:
986 // RodBlockType 5 = Physics simulation mode
987 // Physics mode v3 11.04.2005 for simulation
988 return std::make_unique<LArRodBlockPhysicsV3>();
989
990 case 6:
991 // RodBlockType 6 = Physics test mode
992 switch (rodMinorVersion) {
993 case 0: // Physics mode v0 05.01.2004 first draft
994 return std::make_unique<LArRodBlockPhysicsV0>();
995 case 1: // Physics mode v2 05.10.2004 adapted to real DSP data
996 case 2: // Physics mode v2
997 return std::make_unique<LArRodBlockPhysicsV2>();
998 default:
999 break;
1000 }
1001 break;
1002
1003 case 7:
1004 // RodBlockType 7 = Calibration mode
1005 switch (rodMinorVersion) {
1006 case 0: // Calibration mode v0 05.01.2004
1007 return std::make_unique<LArRodBlockCalibrationV0<LArRodBlockHeaderCalibrationV0> >();
1008 case 1: // Calibration mode v1 17.01.2006
1009 case 2: // Calibration mode v1
1010 case 3: // Calibration mode v1
1011 case 4: // Calibration mode v1
1012 return std::make_unique<LArRodBlockCalibrationV1>();
1013 case 5: // Calibration mode v2 26.04.2006
1014 return std::make_unique<LArRodBlockCalibrationV2>();
1015 case 6: // Calibration mode v3 31.05.2006
1016 case 7: // Calibration mode v3
1017 case 8: // Calibration mode v3
1018 case 9: // Calibration mode v3
1019 case 10:// Calibration mode v3
1020 case 11:// Calibration mode v3
1021 case 12:// Calibration mode v3
1022 return std::make_unique<LArRodBlockCalibrationV3>();
1023 default:
1024 break;
1025 }
1026 break;
1027
1028 case 10:
1029 // RodBlockType 10 = Accumulated mode (used for pre-processed pedestal runs)
1030 // Accumulated mode v3 10.06.2008
1031 return std::make_unique<LArRodBlockAccumulatedV3>();
1032
1033 default:
1034 break;
1035 }
1036
1037 return std::unique_ptr<LArRodBlockStructure>();
1038}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
double delay(std::size_t d)
static Double_t sc
StatusCode LArRodDecoder::initialize ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
static const InterfaceID IID_ILArRodDecoder("LArRodDecoder", 1, 0)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
value_type push_back(value_type pElem)
Add an element to the end of the collection.
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.
Container class for LArAccumulatedCalibDigit.
Data class for calibration ADC samples preprocessed by the DSP.
Container class for LArAccumulatedDigit.
Data class for ADC samples and autocorr preprocessed by the DSP.
Container class for LArCalibDigit.
void setDelayScale(const double scale)
set delay scale
Base class for LArDigits taken during calibration runs.
const std::vector< HWIdentifier > & calibSlotLine(const HWIdentifier id) const
unsigned Delay(const unsigned event, const HWIdentifier calibLineID) const
bool isPulsed(const unsigned event, const HWIdentifier calibLineID) const
unsigned DAC(const unsigned event, const HWIdentifier calibLineID) const
Container class for LArDigit.
Liquid Argon digit base class.
Definition LArDigit.h:25
Container class for LArFebHeader.
Holds information from the FEB Header.
void SetRodResults1Size(const uint16_t size)
set the ROD block sizes
void SetOnlineChecksum(const uint32_t checksum)
void SetNbSweetCells2(const uint16_t n)
void SetRodStatus(const uint32_t status)
set the ROD Status
void SetFebBCId(const uint16_t bcid)
set the FEB Bunch Crossing ID
void SetFebCtrl2(const uint16_t ctrl2)
set the FEB Control Word #2
void SetFormatVersion(const uint32_t formatVersion)
set the format version
void SetOfflineChecksum(const uint32_t checksum)
void SetFebSCA(const uint16_t sca)
set the SCA's
void SetDetEventType(const uint32_t detEvType)
set the Detector event type ID
void SetDspEventCounter(const uint32_t eventCounter)
set the Event number counted by the DSP code
void SetLVL1TigType(const uint32_t lvl1ttype)
set the Level1 trigger type ID
void SetRodRawDataSize(const uint16_t size)
void SetFebCtrl3(const uint16_t ctrl3)
set the FEB Control Word #3
void SetFebCtrl1(const uint16_t ctrl1)
set the FEB Control Word #1
void SetBCId(const uint16_t bcid)
set the Bunch Crossing ID
void SetFebELVL1Id(const uint16_t elvl1Id)
set the FEB Event ID
void SetRunNumber(const uint32_t runNumber)
set the run number
void SetSourceId(const uint32_t sourceID)
set the source Id
void SetRodResults2Size(const uint16_t size)
void SetDspCodeVersion(const uint32_t codeVersion)
set the version of the DSP code
void SetNbSweetCells1(const uint16_t n)
set the number of samples and cells above thresholds
void SetNbSamples(const uint16_t n)
void SetELVL1Id(const uint16_t elvl1Id)
set the EventID
bool isOnlineConnected(const HWIdentifier &sid) const
Test whether a HWIdentifier is connected of not (inline)
Container for LArRawChannel (IDC using LArRawChannelCollection)
Liquid Argon ROD output object base class.
virtual uint16_t getCtrl1(uint32_t adc) const
bool setFragment(const uint32_t *p, uint32_t n)
virtual uint32_t hasPhysicsBlock() const
virtual uint16_t getNStep() const
virtual uint32_t hasCalibBlock() const
virtual uint16_t getDelay() const
virtual uint16_t getCtrl3(uint32_t adc) const
virtual uint16_t getResults1Size() const
virtual bool getPulsed(unsigned channelNumber) const
virtual uint16_t getDAC() const
virtual int getNextEnergy(int &channelNumber, int32_t &energy, int32_t &time, int32_t &quality, uint32_t &gain)
virtual uint16_t getRawDataSize() const
virtual uint32_t hasAccumBlock() const
virtual int getNextAccumulatedCalibDigit(int &channelNumber, std::vector< uint64_t > &SamplesSum, std::vector< uint64_t > &Samples2Sum, uint32_t &nStepTriggers, uint32_t &gain)
virtual uint32_t hasRawDataBlock() const
virtual bool canSetCalibration()
virtual uint32_t getDspCodeVersion() const
virtual uint16_t getCtrl2(uint32_t adc) const
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
virtual uint16_t getStepIndex() const
virtual uint16_t getNTrigger() const
virtual int setGain(const int GainValue)
virtual uint32_t offlineCheckSum() const
void setFirstSample(const int rearrangeFirstSample)
virtual uint16_t getNbSweetCells2() const
virtual uint32_t getNumberOfSamples() const
virtual uint32_t hasControlWords() const
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
virtual uint32_t getStatus() const
virtual uint16_t getResults2Size() const
virtual uint16_t getNbSweetCells1() const
virtual int32_t getDspEventCounter() const
virtual uint32_t onlineCheckSum() const
virtual int getNextAccumulatedDigit(int &channelNumber, std::vector< uint64_t > &SamplesSum, std::vector< uint64_t > &corr2Sum, uint32_t &gain)
std::vector< unsigned int > m_vFinalPreselection
uint32_t m_StatusNMask
virtual ~LArRodDecoder()
Destructor.
std::vector< std::string > m_LArCellCorrNames
LArRodBlockStructure * prepareBlockStructure1(const uint16_t rodMinorVersion, const uint32_t robBlockType) const
std::vector< int > m_vFTPreselection
const LArOnlineID * m_onlineHelper
std::vector< unsigned int > m_IgnoreCheckFEBs
unsigned int m_febId1
std::unique_ptr< LArRodBlockStructure > makeBlockStructure(unsigned int rodBlockType, unsigned int rodMinorVersion) const
SG::ReadHandleKey< xAOD::EventInfo > m_evt
static const InterfaceID & interfaceID()
float m_LArCellEthreshold
unsigned short m_requiredPhysicsNSamples
std::vector< int > m_vBEPreselection
void fillCollection(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment &robFrag, const uint32_t *p, uint32_t n, LArRawChannelContainer &coll, const CaloGain::CaloGain gain) const
unsigned int m_febId2
LArRodBlockStructure * prepareBlockStructure(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment &robFrag, const uint32_t *p, uint32_t n, const CaloGain::CaloGain RequestedGain) const
uint32_t m_StatusMask
std::vector< int > m_vPosNegPreselection
LArRodDecoder(const std::string &type, const std::string &name, const IInterface *parent)
Constructor Standard AlgTool constructor.
eformat::ROBFragment< PointerType > ROBFragment
Definition RawEvent.h:27
Definition index.py:1
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
MsgStream & msg
Definition testRead.cxx:32