ATLAS Offline Software
Loading...
Searching...
No Matches
LArRodBlockAccumulatedV3.cxx
Go to the documentation of this file.
1//Dear emacs, this is -*- c++ -*-
2
3/*
4 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
5*/
6
7// Implementation of a LArRODBlockStructure class
8// This version contains LArDigits in fixed gain.
9// See .h file for more details.
10
11#include "GaudiKernel/MsgStream.h"
14//#include <cstdio>
15#include <iostream>
16
17//#define LARBSDBGOUTPUT
18#ifdef LARBSDBGOUTPUT
19#define LARBSDBG(text) logstr<<MSG::DEBUG<<text<<endmsg
20#else
21#define LARBSDBG(text)
22#endif
23
24
31
41
43{
44 return (getHeader16(NSamples)>>8);
45}
46
47int LArRodBlockAccumulatedV3::getNextRawData(int& channelNumber, std::vector<short>& samples, uint32_t& gain)
48{
49#ifdef LARBSDBGOUTPUT
50 MsgStream logstr(Athena::getMessageSvc(), BlockType());
51#endif
52 //Debug output
53 /*
54 LARBSDBG("GetNextRawData for FEB 0x" << MSG::hex << (uint32_t)getHeader32(FEBID) << MSG::dec);
55 LARBSDBG("m_RawDataCounter=" << m_RawDataCounter << " m_RawDataIndex="<< m_RawDataIndex
56 << " m_channelsPerFEB=" << m_channelsPerFEB);
57 LARBSDBG("requested gain= " << m_fixedGain);
58 */
59 //std::cout << "RAWDATA " << m_RawDataCounter << std::endl;
60 if (m_RawDataCounter>=m_channelsPerFEB) { //Already beyond maximal number of channels
61 LARBSDBG("Maximum number of channels reached");
62 return 0;
63 }
64 //const uint16_t block = getHeader16(m_RawDataOff);//Position of the raw FEB data block
65 const uint16_t block = getHeader16(RawDataBlkOff);
66 if (!block) { //Block does not exist
67 LARBSDBG("No Raw Data Block in this FEB");
68 return 0;
69 }
70 //The m_RawDataChannel keeps track of the last read channel
71 //std::cout << "endtag=" << endtag << " m_iHeadBlockSize=" << m_iHeadBlockSize << std::endl;
72
73 // Get next channel
74 channelNumber=m_RawDataCounter;
75 uint32_t febgain=0;
76 const unsigned int nsamples = getHeader16(NSamples) & 0xff;
77 const unsigned int ngains = getHeader16(NGains);
78 /*
79 LARBSDBG("This FEB has " << nsamples << " samples");
80 LARBSDBG("This FEB has " << ngains << " gains");
81 */
82 if(ngains==0 || nsamples==0) return 0;
83 // Loop over gains to look for m_fixedGain
84 unsigned int this_gain=0;
85 int offset;
86 LARBSDBG(" ===> fixedGain= " << m_fixedGain << " CaloGain = " << CaloGain::LARNGAIN);
87 if (m_fixedGain!=CaloGain::LARNGAIN) { //Fixed gain: Search for gain
88 offset=block + 8 + ((channelNumber&0x3F)>>3) + ((channelNumber & 0x7)<<3);
89 for(this_gain=0;this_gain<ngains;this_gain++) {
90 int index = offset + 64*this_gain;
91 uint32_t x = m_FebBlock[index];
92 if(channelNumber>=64)
93 x = (x & 0x3000) >> 12;
94 else
95 x = (x & 0x30000000) >> 28;
96 unsigned data_gain = RawToOfflineGain(x);
97 if(data_gain==m_fixedGain) break;
98 }
99 }
100 if (this_gain<ngains) { //Gain found in this fragment
101 int s_size = 8 + 64 * ngains; // Size of one sample block 16 RADD of 16 bit + 128 channels (16 bit data)
102 offset = block + 8 + ((channelNumber&0x3F)>>3) + ((channelNumber & 0x7)<<3) + 64*this_gain;
103 int index = offset;
104 uint32_t x = m_FebBlock[index];
105 if(channelNumber>=64) { //low channels on lower bits
106 // First decode gain
107 febgain = (x & 0x3000) >> 12; // gain on bits 12 and 13
108 // Than samples
109 for(unsigned int s=0;s<nsamples;s++) {
110 index = offset + s*s_size;
111 x = m_FebBlock[index];
112 // if((s==0) && (channelNumber==64)) std::cout << "===> " << std::dec << channelNumber << " " << (x&0xfff) << " " << std::endl;
113 samples.push_back((short) (x & 0x0fff)); // sample on bits 0 to 11
114 }
115 } else { //high channels on higher bits
116 // First decode gain
117 febgain = (x & 0x30000000) >> 28; // gain on bits 12 and 13
118 // Than samples
119 for(unsigned int s=0;s<nsamples;s++) {
120 index = offset + s*s_size;
121 x = (m_FebBlock[index]) >> 16;
122 samples.push_back((short) (x & 0x0fff)); // sample on bits 0 to 11
123 }
124 }
125 gain=RawToOfflineGain(febgain);
126 }
127 //std::cout << "Gain= " << gain << " Febgain=" << febgain << std::endl;
129 unsigned rearrangeFirstSample=0;
131 rearrangeFirstSample=m_rearrangeFirstSample; //Overwrite by jobOptions
132 else
133 rearrangeFirstSample=getFirstSampleIndex();
134 //std::cout << "FebConfig: "<< getFebConfig() << " FirstSampleIndex " << getFirstSampleIndex() <<std::endl;
135 if (rearrangeFirstSample && rearrangeFirstSample<samples.size()) //FIXME: Very ugly hack! See explanation in LArRodDecoder.h file
136 {//Change e.g. 3 0 1 2 4 to 0 1 2 3 4
137 short movedSample=samples[0];
138 for (unsigned i=1;i<=rearrangeFirstSample;i++)
139 samples[i-1]=samples[i];
140 samples[rearrangeFirstSample]=movedSample;
141 }
142 LARBSDBG("GetNextRawData for FEB finished 0x" << MSG::hex << (uint32_t)getHeader32(FEBID) << MSG::dec);
143 return 1;
144}
145
146int LArRodBlockAccumulatedV3::getNextAccumulatedDigit(int& channelNumber, std::vector<uint64_t>& samplesSum,
147 std::vector < uint64_t >& corr2Sum, uint32_t& gain )
148{
149#ifdef LARBSDBGOUTPUT
150 MsgStream logstr(Athena::getMessageSvc(), BlockType());
151#endif
152 //Debug output
153 LARBSDBG("m_Result1Counter" << m_Result1Counter << " m_Result1Index="<< m_Result1Index
154 << " m_channelsPerFEB=" << m_channelsPerFEB);
155 LARBSDBG("requested gain= " << m_fixedGain);
156 if (m_Result1Counter>=m_channelsPerFEB) { //Already beyond maximal number of channels
157 LARBSDBG("Maximum number of channels reached");
158 return 0;
159 }
160 uint16_t block = getHeader16(ResultsOff1);//Position of the AccumulatedCalibDigits FEB data block
161 uint16_t bsize = getHeader16(ResultsDim1);//Position of the AccumulatedCalibDigits FEB data block
162 uint32_t size = getNumberOfWords();
163 if (!block) { //Block does not exist
164 LARBSDBG("No Accumulated Digit Block in this FEB");
165 // std::cout << "index= " << ResultsOff1 << "word= " << getHeader16(ResultsOff1) << std::endl;
166 return 0;
167 }
168 //The m_Result1Channel keeps track of the last read channel
169 //std::cout << "endtag=" << endtag << " m_iHeadBlockSize=" << m_iHeadBlockSize << std::endl;
170
171 // Get next channel
172 channelNumber=m_Result1Counter;
173
174 // This is just for fun; these data are not stored here but in RodBlockDecoder.cxx
175 // IWS 08.08.2005 This part is useless in fact - just for debugging
176 const unsigned int nsamples = getHeader16(NSamples);
177 const unsigned int ngains = getHeader16(NGains);
178
179 //if(channelNumber==0) {
180 // for(uint3_t i=0;i<size;i++) {
181 // if(i==0)
182 // std::cout << std::hex << i << " : NWTot " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
183 // else if(i==1)
184 // std::cout << std::hex << i << " : FEBid " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
185 // else if(i==2)
186 // std::cout << std::hex << i << " : FEBsn " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
187 // else if(i==3)
188 // std::cout << std::hex << i << " : Block1 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
189 // else if(i==4)
190 // std::cout << std::hex << i << " : Block2 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
191 // else if(i==5)
192 // std::cout << std::hex << i << " : Block3 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
193 // else if(i==6)
194 // std::cout << std::hex << i << " : Status " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
195 // else if(i==7)
196 // std::cout << std::hex << i << " : Gain/Sample " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
197 // else if(i==8)
198 // std::cout << std::hex << i << " : 1st/FebConf " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
199 // else if(i==9)
200 // std::cout << std::hex << i << " : InFPGA " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
201 // else if (i<block)
202 // std::cout << std::hex << i << " : raw data " << i-12 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
203 // else if(i-block<bsize) {
204 // if (i<block+1)
205 // std::cout << std::hex << i << " : ntrigger " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
206 // else if (i<block+2)
207 // std::cout << std::hex << i << " : step i&n " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
208 // else if (((i-block-2)%(2*nsamples))<nsamples)
209 // std::cout << std::hex << i << " " << (i-block-2)/(2*nsamples) << " : sum channel " << (i-block-2)/(nsamples+1) << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
210 // else
211 // std::cout << std::hex << i << " " << (i-block-2)/(2*nsamples) << " : sum*sum " << (i-block-2)%(nsamples+1) << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
212 // }
213 // else if(i<size-3)
214 // std::cout << std::hex << i << " : raw data " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::dec << std::endl;
215 // else
216 // std::cout << std::hex << i << " : trailer " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::dec << std::endl;
217 // }
218 //}
219
220 const unsigned int FebConfig = (int) getFebConfig();
221 if(ngains==0 || nsamples==0) return 0;
222 // Loop over gains to look for m_fixedGain
223 //unsigned int this_gain=0;
224 int offset;
225 uint32_t x;
226
227 if (FebConfig==0 || FebConfig>3) {
228 //Converter can currently not deal with this situation
229 LARBSDBG("Suspicious FebConfig valud" << FebConfig << ", don't know what to do for Accumulated Calib Digit - return 0");
230 return 0;
231 }
232
233 const uint32_t febgain=FebConfig&0x3; // to be done better when this is better understood
234 gain=RawToOfflineGain(febgain);
235
237 gain!=m_fixedGain) {
238 LARBSDBG("Requested gain: " << m_fixedGain << " got " << gain << " data ingored.");
239 return 0;
240 }
241
242
243 // 2 is the size of the accumulated header
244 offset=block + 2 + (channelNumber&0x7F)*(nsamples*2); // needs to be updated for loop on gains
245 if(offset+2*nsamples>size-3) return 0;
246 if((channelNumber&0x7F)*nsamples*2>bsize) return 0;
247
248
249 samplesSum.resize(nsamples);
250 corr2Sum.resize(nsamples);
251
252 for (unsigned int i=0;i<nsamples;i++)
253 {
254 x=m_FebBlock[offset+i];
255 samplesSum[i]=x;
256 //std::cout << "SUM[" << i-1 << "] = " << std::hex << x << std::endl;
257 }
258 offset+=nsamples;
259 for (unsigned int i=0;i<nsamples;i++)
260 {
261 x=m_FebBlock[offset+i];
262 corr2Sum[i]=x;
263 //std::cout << "SUMSQ[" << i-1 << "] = " << std::hex << x << std::endl;
264 }
265
266 gain=RawToOfflineGain(febgain);
267
269 return 1;
270}
271
272
277
279{
280 return getHeader16(NGains);
281}
282
284{
285
287 uint32_t x=m_FebBlock[index+NTrigger/2];
288 return (uint16_t) x;
289}
290
292{
294 uint32_t x = m_FebBlock[index+StepIndex/2]&0xffff;
295 return (uint16_t) x;
296}
297
302
307
312
314{
316 uint32_t x = m_FebBlock[index+StepIndex/2]>>16;
317 return (uint16_t) x;
318}
319
320uint32_t LArRodBlockAccumulatedV3::getRadd(uint32_t adc, uint32_t sample) const
321{
322 int ngain=getHeader16(NGains);
324 if(index<=0) return 0;
325 index+=(8+64*ngain)*sample+adc/2;
326 uint32_t x=m_FebBlock[index];
327 if(adc&0x1) return x>>16;
328 return x&0xffff;
329}
330
331uint16_t LArRodBlockAccumulatedV3::getCtrl1(uint32_t adc) const
332{
333 int index=getHeader16(RawDataBlkOff)-16+adc/2;
334 uint32_t x=m_FebBlock[index];
335 if(adc&0x1) x=x>>16;
336 else x=x&0xffff;
337 uint16_t ctrl=x;
338 return ctrl;
339 /*
340 int index=getHeader16(RawDataBlkOff)-16;
341 uint32_t x=m_FebBlock[index];
342 if(adc&0x1) return x>>16;
343 return x&0xffff;
344 */
345}
346
347uint16_t LArRodBlockAccumulatedV3::getCtrl2(uint32_t adc) const
348{
349 int index=getHeader16(RawDataBlkOff)-8+adc/2;
350 uint32_t x=m_FebBlock[index];
351 if(adc&0x1) x=x>>16;
352 else x=x&0xffff;
353 uint16_t ctrl=x;
354 return ctrl;
355 /*
356 int index=getHeader16(RawDataBlkOff)-8 ;
357 uint32_t x=m_FebBlock[index];
358 if(adc&0x1) return x>>16;
359 return x&0xffff;
360 */
361}
362
363uint16_t LArRodBlockAccumulatedV3::getCtrl3(uint32_t adc) const
364{
365 int nsamples=getHeader16(NSamples);
366 int ngains=getHeader16(NGains);
367 int offset=nsamples*(8+64*ngains)+adc/2;
368 int index=getHeader16(RawDataBlkOff)+offset;
369 uint32_t x=m_FebBlock[index];
370 if(adc&0x1) x=x>>16;
371 else x=x&0xffff;
372 uint16_t ctrl=x;
373 return ctrl;
374 /*
375 int index=getHeader16(RawDataBlkOff)-3;
376 uint32_t x=m_FebBlock[index];
377 x=x>>16;
378 uint16_t ctrl=x;
379 return ctrl;
380 */
381}
382
384{
385 // Old version: get Dsp status word
386 if(getNumberOfWords()<EventStatus/2) return 0;
387 uint32_t x=getHeader32(EventStatus);
388 return x;
389
390 // New verion: get Rod status word
391 //int nsamples = getHeader16(NSamples);
392 //int ngains = getHeader16(NGains);
393 //int offset = nsamples*(8+64*ngains)+8;
394 //int index = getHeader16(RawDataBlkOff)+offset;
395 //uint32_t x = m_FebBlock[index];
396 //return x;
397}
398
399
400#ifdef LARBSDBGOUTPUT
401#undef LARBSDBGOUTPUT
402#endif
403#undef LARBSDBG
#define LARBSDBG(text)
This class provides decoding/encoding from/to ROD format.
#define x
virtual uint8_t getTDCPhase() const
virtual uint16_t getCtrl2(uint32_t adc) const
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
virtual int getNextAccumulatedDigit(int &channelNumber, std::vector< uint64_t > &SamplesSum, std::vector< uint64_t > &corr2Sum, uint32_t &gain)
virtual uint32_t getNumberOfGains() const
virtual uint16_t getResults1Size() const
virtual uint16_t getRawDataSize() const
virtual uint32_t getStatus() const
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
virtual uint16_t getCtrl3(uint32_t adc) const
virtual uint16_t getCtrl1(uint32_t adc) const
virtual uint16_t getResults2Size() const
virtual uint32_t getNumberOfSamples() const
uint16_t getHeader16(const unsigned n) const
uint32_t getHeader32(const unsigned n) const
uint32_t RawToOfflineGain(const uint32_t gain) const
uint32_t getNumberOfWords() const
singleton-like access to IMessageSvc via open function and helper
IMessageSvc * getMessageSvc(bool quiet=false)
@ LARNGAIN
Definition CaloGain.h:19
Definition index.py:1