11#include "GaudiKernel/MsgStream.h"
16#include "GaudiKernel/Bootstrap.h"
17#include "GaudiKernel/ISvcLocator.h"
22 pack_words(
const std::uint16_t low,
const std::uint16_t high){
23 return static_cast<std::uint32_t
>(low) |
24 (
static_cast<std::uint32_t
>(high) << 16);
41 SmartIF<StoreGateSvc> detStore{Gaudi::svcLocator()->service(
"DetectorStore")};
43 m_logstr << MSG::ERROR <<
"Unable to locate DetectorStore" <<
endmsg;
48 m_logstr << MSG::ERROR <<
"Could not get LArOnlineID helper !" <<
endmsg;
88 if ( !(ns&0x1) ) radd++;
116 uint32_t problem = 0;
119 int off1_tmp, dim1_tmp;
120 int off2_tmp, dim2_tmp;
121 int off3_tmp, dim3_tmp;
125 off1_tmp = dim1_tmp = 0;
126 off2_tmp = dim2_tmp = 0;
127 off3_tmp = dim3_tmp = 0;
138 dim1_tmp = 84+(ns+1)/2+n1;
139 if ( !(ns&0x1) ) dim1_tmp++;
144 off2_tmp = off1_tmp+dim1_tmp;
145 dim2_tmp = (n2*ns+1)/2;
146 off3_tmp = off2_tmp+dim2_tmp;
148 if(dim2_tmp==0) off2_tmp = 0;
149 if(dim3_tmp==0) off3_tmp = 0;
152 if(off1 != off1_tmp) problem=1;
153 if(dim1 != dim1_tmp) problem=2;
154 if(off2 != off2_tmp) problem=3;
155 if(dim2 != dim2_tmp) problem=4;
156 if(off3 != off3_tmp) problem=5;
157 if(dim3 != dim3_tmp) problem=6;
158 if(n1 != n1_tmp) problem=7;
159 if(n2 != n2_tmp) problem=8;
163 m_logstr << MSG::ERROR <<
"LArByteStreamProblem " << problem <<
endmsg;
164 m_logstr << MSG::ERROR <<
"NSamples = " << std::dec << ns <<
endmsg;
166 m_logstr << MSG::ERROR <<
"NWTot: " << std::hex <<
getNumberOfWords() <<
" n1=" << n1 <<
" (" << n1_tmp <<
") n2=" << n2 <<
" (" << n2_tmp <<
")" <<
endmsg;
167 m_logstr << MSG::ERROR <<
"Found 1: " << off1 <<
" " << dim1 <<
endmsg;
168 m_logstr << MSG::ERROR <<
"Found 2: " << off2 <<
" " << dim2 <<
endmsg;
169 m_logstr << MSG::ERROR <<
"Found 3: " << off3 <<
" " << dim3 << std::dec <<
endmsg;
171 if(n1==n1_tmp && n2==n2_tmp) {
178 m_logstr << MSG::ERROR <<
"Recomputed 1: " << std::hex << off1 <<
" " << dim1 <<
endmsg;
179 m_logstr << MSG::ERROR <<
"Recomputed 2: " << off2 <<
" " << dim2 <<
endmsg;
180 m_logstr << MSG::ERROR <<
"Recomputed 3: " << off3 <<
" " << dim3 << std::dec <<
endmsg;
210 if(off1< off2 && off1 + dim1 > off2) problem = 1;
211 if(off1< off3 && off1 + dim1 > off3) problem = 2;
212 if(off2< off1 && off2 + dim2 > off1) problem = 3;
213 if(off2< off3 && off2 + dim2 > off3) problem = 4;
214 if(off3< off1 && off3 + dim3 > off1) problem = 5;
215 if(off3< off2 && off3 + dim3 > off2) problem = 6;
219 m_logstr << MSG::ERROR <<
"LArByteStreamProblem " << problem <<
endmsg;
231 m_logstr << MSG::DEBUG <<
"Let s go in getNextRawData..." <<
endmsg;
239 m_logstr << MSG::DEBUG <<
"Maximum number of channels reached" <<
endmsg;
250 channelNumber=((rodChannelNumber&0xe)<<2) + ((rodChannelNumber&0x1)<<6) + (rodChannelNumber>>4);
256 m_logstr << MSG::DEBUG <<
"This FEB has " << nsamples <<
" samples" <<
endmsg;
257 m_logstr << MSG::DEBUG <<
"This FEB has " << ngains <<
" gains" <<
endmsg;
260 if(ngains==0 || nsamples==0)
return 0;
261 int s_size = nsamples+1;
262 int offset = (10+nsamples)&0xfffc;
266 if((nsamples+1)&0x7) {
269 samples.push_back(s[0]);
270 for(
unsigned int i=0;i<nsamples/2;i++) {
273 samples.push_back(s[0]);
274 samples.push_back(s[1]);
281 samples.push_back(s[0]);
282 for(
unsigned int i=0;i<nsamples/2;i++) {
285 samples.push_back(s[0]);
286 samples.push_back(s[1]);
289 for(
unsigned int i=0;i<nsamples/2;i++) {
292 samples.push_back(s[0]);
293 samples.push_back(s[1]);
297 samples.push_back(s[0]);
304 m_logstr << MSG::DEBUG <<
" ===> FEB Channel = " << channelNumber <<
endmsg;
306 for(
int i=0;i<nsamples;i++)
307 m_logstr << MSG::DEBUG <<
" ===> sample " << i <<
" = " << samples[i] <<
endmsg;
314 unsigned rearrangeFirstSample=0;
319 if (rearrangeFirstSample && rearrangeFirstSample<samples.size())
321 short movedSample=samples[0];
322 for (
unsigned i=1;i<=rearrangeFirstSample;i++)
323 samples[i-1]=samples[i];
324 samples[rearrangeFirstSample]=movedSample;
336 m_logstr << MSG::DEBUG <<
"Let s go in getNextDigits..." <<
endmsg;
345 m_logstr << MSG::DEBUG <<
"Maximum number of channels reached" <<
endmsg;
351 m_logstr << MSG::DEBUG <<
"No Digits Block in this FEB" <<
endmsg;
357 m_logstr << MSG::DEBUG <<
"No Mask Digits Block in this FEB" <<
endmsg;
367 while(hasDigits==0) {
371 m_logstr << MSG::DEBUG <<
"Maximum number of channels reached" <<
endmsg;
380 channelNumber=((rodChannelNumber&0xe)<<2) + ((rodChannelNumber&0x1)<<6) + (rodChannelNumber>>4);
387 }
else gain=0xffffffff;
390 m_logstr << MSG::DEBUG <<
"This FEB has " << nsamples <<
" samples" <<
endmsg;
393 if(nsamples==0)
return 0;
394 int s_size = nsamples;
428 m_logstr << MSG::DEBUG <<
" ===> FEB Channel = " << channelNumber <<
endmsg;
430 for(
int i=0;i<nsamples;i++)
431 m_logstr << MSG::DEBUG <<
" ===> sample " << i <<
" = " << samples[i] <<
endmsg;
435 unsigned rearrangeFirstSample=0;
440 if (rearrangeFirstSample && rearrangeFirstSample<samples.size())
442 short movedSample=samples[0];
443 for (
unsigned i=1;i<=rearrangeFirstSample;i++)
444 samples[i-1]=samples[i];
445 samples[rearrangeFirstSample]=movedSample;
470 for(
int j=0;j<32;j++)
480 for(
int j=0;j<32;j++)
514 if(sample%2) sample+=2;
518 if(sample==0)
index=6;
519 else if(sample & 0x1)
index=7+sample-1;
520 else index=7+sample+1;
522 if(adc>=8)
return x>>8;
561 unsigned int sizeRead=0;
563 while (sizeRead<fragment.size()) {
564 std::vector<uint32_t>::iterator FebIter;
565 FebIter=fragment.begin()+sizeRead;
569 if (FebIter+currFebSize>fragment.end()) {
573 m_mFebBlocks[currFEBid].assign(FebIter,FebIter+currFebSize);
608 const int32_t time,
const int32_t quality,
const uint32_t gain)
619 setNextEnergy((int16_t)0,(int16_t)32767,(int16_t)-32767,(uint32_t)0);
624 uint32_t abse,EncodedE;
625 int16_t thetime,thequality;
629 thetime = (int16_t) time/10;
630 thequality = (int16_t) quality;
632 sign=(energy>=0?1:-1);
633 abse=(uint32_t)abs(energy);
637 if ((abse>8192)&&(abse<65536))
639 EncodedE=((abse>>3)|0x4000);
641 else if ((abse>65535)&&(abse<524288))
643 EncodedE=((abse>>6)|0x8000);
645 else if ((abse>524288))
647 EncodedE=((abse>>9)|0xc000);
652 if (
sign<0) EncodedE |= 0x2000;
653 theenergy = (uint16_t) EncodedE;
663 setNextEnergy(theenergy,(int16_t)32767,(int16_t)-32767,gain);
714 uint16_t mask_idx=cchIdx>>5;
715 uint16_t mask_bit=(cchIdx&0x1f);
717 for(std::vector<short>::const_iterator i=samples.begin();i!=samples.end();++i){
726 setNextEnergy((uint16_t)0,(int16_t)32767,(int32_t)-32767,(uint32_t)0);
747 for(
unsigned int i=0;i<n;i++){
758 for (
unsigned i=0;i<n;i++){
769 for (
unsigned i=0;i<n;i++){
777 uint32_t radd_nANC=0x0;
780 radd_nANC = (radd_nANC<<16);
785 for(
int i=0; i < (nsamples-1)/2; i++)
797 for(
unsigned int i=0;i<n/2;i++) {
810 unsigned int imax = n/2;
811 for(
unsigned int i=0;i<
imax;i++){
812 const std::uint32_t to_push = pack_words(
825 for(
unsigned int i=0;i<
imax;i++){
829 const std::uint32_t to_push = pack_words(
840 for(
size_t ii=0;ii<
endtag/2;ii++){
841 sum+=((*m_vFragment)[ii]);
855 FEBMAPTYPE::const_iterator feb_it_b=
m_mFebBlocks.begin();
857 FEBMAPTYPE::const_iterator feb_it;
858 for (feb_it=feb_it_b;feb_it!=feb_it_e;++feb_it) {
859 if (feb_it!=feb_it_b)
864 feb_it->second.begin(), feb_it->second.end());
871template<
class RAWDATA>
872bool LArRodBlockPhysicsV6::operator ()
873 (
const RAWDATA* ch1,
const RAWDATA* ch2)
const
881 if(febId1 == febId2 ){
887 return febId1 < febId2 ;
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
uint16_t getFirstSampleIndex() const
virtual uint32_t getNumberOfGains() const
uint16_t getNbSweetCells2FromMask() const
void initializeFEB(const uint32_t id)
virtual uint32_t getStatus() const
const uint16_t * m_DigitsPointer
virtual uint16_t getCtrl1(uint32_t adc) const
uint16_t m_numberHotCellOffTime
virtual uint16_t getRawDataSize() const
virtual uint16_t getCtrl2(uint32_t adc) const
static std::string BlockType()
const LArOnlineID * m_onlineHelper
virtual void resetPointers()
uint16_t m_EnergyThreshold2
std::vector< uint16_t > m_TimeQualityBlock
LArRodBlockPhysicsV6(IMessageSvc *msgSvc)
void setRawData(const int, const std::vector< short > &, const uint32_t)
virtual int FebToRodChannel(int ch) const
const int32_t * m_SumPointer
std::vector< uint32_t > m_SumBlkBlockE2
const uint32_t * m_MaskDigitsPointer
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain)
const uint16_t * m_EnergyPointer
uint16_t getNbSweetCells1FromMask() const
int getNextDigits(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
virtual uint16_t getCtrl3(uint32_t adc) const
virtual uint16_t getNbSweetCells1() const
virtual bool setPointers()
const uint16_t * m_RawDataPointer
const uint16_t * m_TimeQualityPointer
std::vector< uint32_t > m_GainBlock
const uint32_t * m_GainPointer
unsigned short m_requiredNSamples
virtual int getNextEnergy(int &channelNumber, int32_t &energy, int32_t &time, int32_t &quality, uint32_t &gain)
std::vector< uint32_t > m_SumBlkBlockE1
virtual uint16_t getResults2Size() const
virtual uint16_t getNbSweetCells2() const
uint16_t m_EnergyThreshold1
const uint32_t * m_MaskTimeQualityPointer
virtual uint32_t getNumberOfSamples() const
const uint16_t * m_RaddPointer
std::vector< uint16_t > m_DigitsEncode
void initializeFragment(std::vector< uint32_t > &fragment)
virtual uint16_t getResults1Size() const
std::vector< uint16_t > m_EnergyBlockEncode
unsigned int m_rearrangeFirstSample
uint16_t getHeader16(const unsigned n) const
void setHeader32(const unsigned n, const uint32_t w)
uint32_t getHeader32(const unsigned n) const
const uint32_t * m_FebBlock
void setHeader16(const unsigned n, const uint16_t w)
std::vector< uint32_t > * m_pRODblock
unsigned short m_iHeadBlockSize
LArRodBlockStructure(IMessageSvc *msgSvc, const std::string &blockType)
uint32_t OfflineToRawGain(const uint32_t gain) const
std::vector< uint32_t > * m_vFragment
int32_t m_MiddleHeaderSize
uint32_t RawToOfflineGain(const uint32_t gain) const
uint32_t getNumberOfWords() const
singleton-like access to IMessageSvc via open function and helper