ATLAS Offline Software
Loading...
Searching...
No Matches
LArRodBlockPhysicsV6.h
Go to the documentation of this file.
1//Dear emacs, this is -*- c++ -*-
2
3/*
4 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
5*/
6
7#ifndef LARBYTESTREAM_LARRODBLOCKPHYSICSV6_H
8#define LARBYTESTREAM_LARRODBLOCKPHYSICSV6_H
9
17
20#include "GaudiKernel/ISvcLocator.h"
22
23//#define LARBSDBGOUTPUT
24#ifdef LARBSDBGOUTPUT
25#define MYLEVEL (MSG::FATAL)
26#define LARBSDBG(text) logstr<<MYLEVEL<<text<<endmsg
27#else
28#define LARBSDBG(text)
29#endif
30
32{
33public:
34 // ----------------- Header words indexes -----------------
35 enum {
36 NWTot, // First words: DSP event header
40 FEB_SN, // FEB serial number
41 FEB_SN_h, // FEB serial number
42 ResultsOff1, // Size of results (Physics averages in DSP)
43 ResultsDim1, // Offset to results
44 ResultsOff2, // Size of times (in physics)
45 ResultsDim2, // Offset to times (in physics)
47 RawDataBlkDim, // Raw FEB event offset
48 EventStatus, // Bits describing the event
54 InFPGAFormat, // added 08.09.2005 - wrong 28.09.2005?
56 endtag //This tag needs to be an odd number, see *) for constructor
57 };
58 // constructor
60
61 // ------ Identify RodBlockStructure -------
62 std::string BlockType() { return std::string("RodBlockPhysicsV6");}
63 public:
64 // ----------------- Decoding methods -----------------
65 // Never to be used while encoding!
66 // set full ROD fragment before trying to get anything!
67 // in case there is more than 1 FEB in 1 fragment, jump to next FEB
68 virtual inline int getNextEnergy(int& channelNumber, int32_t& energy, int32_t& time,int32_t& quality,uint32_t& gain);
69 virtual int getNextRawData(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
70 int getNextDigits(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
71 virtual uint16_t getResults1Size() const;
72 virtual uint16_t getResults2Size() const;
73 virtual uint16_t getRawDataSize() const;
74 virtual uint16_t getNbSweetCells1() const;
75 virtual uint16_t getNbSweetCells2() const;
76 virtual uint32_t getNumberOfSamples() const;
77 virtual uint32_t getNumberOfGains() const;
78 virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const;
79 virtual uint16_t getCtrl1(uint32_t adc) const;
80 virtual uint16_t getCtrl2(uint32_t adc) const;
81 virtual uint16_t getCtrl3(uint32_t adc) const;
82 virtual uint32_t getStatus() const;
83
84 //virtual uint32_t onlineCheckSum() const;
85 //virtual uint32_t offlineCheckSum() const;
86
87 virtual inline uint32_t hasCalibBlock() const {return 0;} ;
88 virtual inline uint32_t hasPhysicsBlock() const {return getHeader16(ResultsOff1);} ;
89 virtual inline uint32_t hasRawDataBlock() const {return getHeader16(RawDataBlkOff)+getHeader16(ResultsOff2);} ;
90 virtual inline uint32_t hasControlWords() const {return getHeader16(RawDataBlkOff);} ;
91 virtual inline int FebToRodChannel(int ch) const;
92
93 // Decode counter block
94 virtual inline int32_t getEx() const;
95 virtual inline int32_t getEy() const;
96 virtual inline int32_t getEz() const;
97 virtual inline int32_t getSumE() const;
98 virtual inline uint32_t getVROBFebId();
99 virtual inline int32_t getVROBEx() const;
100 virtual inline int32_t getVROBEy() const;
101 virtual inline int32_t getVROBEz() const;
102 virtual inline int32_t getVROBSumE() const;
103
104 virtual inline int setGain(const int /*GainValue*/) { return 1; };
105
106 // Enconding methods
107 void initializeFragment(std::vector<uint32_t>& fragment);
108 void initializeFEB(const uint32_t id);
109 void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain);
110 void setRawData(const int , const std::vector<short>& , const uint32_t);
111 void finalizeFEB();
112 // build full ROD fragment
113 void concatinateFEBs();
114 virtual inline void setEx(double);
115 virtual inline void setEy(double);
116 virtual inline void setEz(double);
117 virtual inline void setSumE(double);
118
119 void setRequiredNSamples(unsigned short ns) { m_requiredNSamples = ns; }
120
121 //Ordering relation for channels & digits
122 template<class RAWDATA>
123 bool operator () (const RAWDATA* ch1, const RAWDATA* ch2) const;
124 using LArRodBlockStructure::sortDataVector; // avoid warnings.
125 void sortDataVector( std::vector<const LArDigit*>& vDigit)
126 {std::sort(vDigit.begin(),vDigit.end(),*this); }
127
128
129private:
130 void setE(unsigned int index, double E);
131 virtual void resetPointers();
132 virtual bool setPointers();
133 void setNextEnergy(const uint16_t energy,const int16_t time, const int16_t quality, const uint32_t gain);
134 uint16_t getNbSweetCells1FromMask() const;
135 uint16_t getNbSweetCells2FromMask() const;
136
137 std::vector<uint32_t> m_SumBlkBlockE1;
138 std::vector<uint32_t> m_SumBlkBlockE2;
139 std::vector<uint32_t> m_GainBlock;
140 std::vector<uint32_t> m_FebInfoBlock;
141 std::vector<uint16_t> m_TimeQualityBlock;
142 std::vector<uint32_t> m_RawDataBlock;
143 std::vector<uint16_t> m_EnergyBlockEncode;
144 std::vector<uint16_t> m_DigitsEncode;
145
151 const uint32_t* m_GainPointer = nullptr;
152 const uint32_t* m_MaskTimeQualityPointer = nullptr;
153 const uint32_t* m_MaskDigitsPointer = nullptr;
154 const uint16_t* m_RaddPointer = nullptr;
155 const uint16_t* m_EnergyPointer = nullptr;
156 const int32_t* m_SumPointer = nullptr;
157 const uint16_t* m_TimeQualityPointer = nullptr;
158 const uint16_t* m_DigitsPointer = nullptr;
159 const uint16_t* m_RawDataPointer = nullptr;
160
161 //For fixed gain mode
163 // If one needs to use a log output not only for MSG::DEBUG
164 //MsgStream *m_logstr;
165 uint16_t m_numberHotCell = 0U;
167 // Needs one threshold to send time/quality another for samples
171
172 unsigned short m_requiredNSamples;
174
175public:
176 inline uint16_t getFebConfig() const;
177 inline uint16_t getFirstSampleIndex() const;
178
179 virtual bool canSetCalibration() {return false;}
180 bool canSetEnergy() { return true;}
181 bool canSetRawData() { return false;}
182 bool canIncludeRawData() { return true;}
183};
184
186{
187 return getHeader16(FebConfig);
188}
189
191{
193}
194
195inline int LArRodBlockPhysicsV6::getNextEnergy(int& channelNumber,int32_t& energy,int32_t& time,int32_t& quality, uint32_t& gain)
196{
197 #ifdef LARBSDBGOUTPUT
198 MsgStream logstr(Athena::getMessageSvc(), BlockType());
199 #endif
200
201 LARBSDBG("in LArRodBlockPhysicsV6::getNextEnergy.");
202 LARBSDBG("m_channelsPerFEB=" << m_channelsPerFEB);
203 if (m_EnergyIndex>=m_channelsPerFEB) // Already beyond maximal number of channels
204 return 0;
205 if (!m_EnergyPointer) // No data block present
206 return 0;
207
208 unsigned rodChannelNumber=m_EnergyIndex; // Index of Channel in ROD-Block
209 channelNumber=((rodChannelNumber&0xe)<<2) + ((rodChannelNumber&0x1)<<6) + (rodChannelNumber>>4); //channel number of the FEB
210 //channelNumber=(rodChannelNumber>>4) + ((rodChannelNumber&0xf)<<3); //channel number of the FEB
211
212// if(channelNumber==0) {
213// int size = getNumberOfWords();
214// int off1 = getHeader16(ResultsOff1)-8;
215// int dim1 = getHeader16(ResultsDim1);
216// int off2 = getHeader16(ResultsOff2)-8;
217// int dim2 = getHeader16(ResultsDim2);
218// int off3 = getHeader16(RawDataBlkOff)-8;
219// int dim3 = getHeader16(RawDataBlkDim);
220//
221// for(int i=0;i<size;i++) {
222// if(i==0)
223// std::cout << std::hex << i << " : NWTot " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
224// else if(i==1)
225// std::cout << std::hex << i << " : FEBid " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
226// else if(i==2)
227// std::cout << std::hex << i << " : FEBsn " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
228// else if(i==3)
229// std::cout << std::hex << i << " : Block1 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
230// else if(i==4)
231// std::cout << std::hex << i << " : Block2 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
232// else if(i==5)
233// std::cout << std::hex << i << " : Block3 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
234// else if(i==6)
235// std::cout << std::hex << i << " : Status " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
236// else if(i==7)
237// std::cout << std::hex << i << " : Gain/Sample " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
238// else if(i==8)
239// std::cout << std::hex << i << " : 1st/FebConf " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
240// else if(i==9)
241// std::cout << std::hex << i << " : InFPGA " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
242// else if (i>=off1 && i<off1+dim1)
243// std::cout << std::hex << i << " : results1 " << i-off1 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
244// else if (i>=off2 && i<off2+dim2)
245// std::cout << std::hex << i << " : results2 " << i-off2 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
246// else if (i>=off3 && i<off3+dim3)
247// std::cout << std::hex << i << " : raw data " << i-off3 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
248// else
249// std::cout << std::hex << i << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
250// }
251// }
252
253 // get information available for all cells
254 // Energy on a 16 bit word and decode ranges
255 uint16_t encodedEnergy; // 16 bits Encoded Energy word
256 int32_t aux;
257 uint16_t range; // 2 bits range
258 uint16_t sign;
259
260 LARBSDBG("-------->>>> in LArRodBlockPhysicsV6::getNextEnergy : decode energy.....");
261 // decode energy
262 if(m_EnergyIndex & 0x1) encodedEnergy = m_EnergyPointer[m_EnergyIndex-1]; // Big/Little Endien stuff
263 else encodedEnergy = m_EnergyPointer[m_EnergyIndex+1]; // Big/Little Endien stuff
264
265 aux = (int32_t) (encodedEnergy&0x1fff);
266 range = (encodedEnergy & 0xc000) >> 14;
267 if(aux==0 && range>0) aux=0x2000;
268 sign = encodedEnergy & 0x2000;
269 aux <<= 3*range;
270 if(sign) aux = -aux;
271 energy = aux;
272
273 // gain in 2 bits of a 32 bits word
274 if(m_GainPointer) {
275 gain = (uint32_t) ((m_GainPointer[m_EnergyIndex>>4] >> ((m_EnergyIndex&0xf)<<1)) & 0x3);
276 gain=RawToOfflineGain(gain);
277 } else gain=0xffffffff;
278
279 // Get Time and Quality if the information is present according to summary block
280 uint32_t hasTQ;
282 hasTQ = (uint32_t) ((m_MaskTimeQualityPointer[m_EnergyIndex>>5] >> (m_EnergyIndex&0x1f)) &0x1);
283 else
284 hasTQ = 0;
286 if (m_TimeQualityPointer && hasTQ) // Data has Time and Quality information
287 {
288 //Time is in 10 ps in ByteStream, hence the factor 10 to convert to ps
289 time = 10*(reinterpret_cast<const int16_t *>(m_TimeQualityPointer))[m_TimeQualityIndex++];
291
292#ifdef LARBSDBGOUTPUT
293 logstr << MYLEVEL <<"This cell has time and Quality information "<<endmsg;
294#endif
295 }
296 else // Data has no Time and Quality information
297 {
298 time=0;
299 quality=-1;
300 }
301
302
303#ifdef LARBSDBGOUTPUT
304 logstr << MYLEVEL <<"Range = "<<range<<endmsg;
305 logstr << MYLEVEL <<"Sign = "<<sign<<endmsg;
306 logstr << MYLEVEL <<" Encoded Energy ="<< MSG::hex << encodedEnergy << MSG::dec << " E=" << energy
307 << " t=" << time
308 << " Q=" << quality
309 << " G=" << gain
310 << " channel Number=" << channelNumber
311 << endmsg;
312#endif
313
314 return 1;
315}
316
317inline int32_t LArRodBlockPhysicsV6::getEx() const
318{
319 if(m_SumPointer) return (m_SumPointer[0]>>9);
320 return 0;
321}
322
323inline int32_t LArRodBlockPhysicsV6::getEy() const
324{
325 if(m_SumPointer) return (m_SumPointer[1]>>9);
326 return 0;
327}
328
329inline int32_t LArRodBlockPhysicsV6::getEz() const
330{
331 if(m_SumPointer) return (m_SumPointer[2]>>9);
332 return 0;
333}
334inline int32_t LArRodBlockPhysicsV6::getSumE() const
335{
336 if(m_SumPointer) return (m_SumPointer[3]>>9);
337 return 0;
338}
339
350
352{
353 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
354 if(p) return (p[1]>>9);
355 return 0;
356}
357
359{
360 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
361 if(p) return (p[2]>>9);
362 return 0;
363}
364
366{
367 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
368 if(p) return (p[3]>>9);
369 return 0;
370}
371
373{
374 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
375 if(p) return (p[4]>>9);
376 return 0;
377}
378
380{
381return ( (ch&0x7) << 4) | ( (ch&0x38) >>2 ) | ((ch&0x40)>>6);
382
383}
384
385inline void LArRodBlockPhysicsV6::setE(unsigned index, double E){
386
387 union {
388 int32_t i;
389 uint16_t us[2];
390 } conv;
391 conv.i = static_cast<int32_t>(E);
392 // Write as multiplication, not as left shift, since left-shifting
393 // a negative number is undefined in C++.
394 // Compiles to the same code on x86_64.
395 conv.i *= (1<<9);
396 if ( m_TimeQualityBlock.size()>=8 ){
397 m_TimeQualityBlock[index]=conv.us[0];
398 m_TimeQualityBlock[index+1]=conv.us[1];
399 }
400}
401
402
403inline void LArRodBlockPhysicsV6::setEx(double Ex){
404 setE (0, Ex);
405}
406
407
408inline void LArRodBlockPhysicsV6::setEy(double Ey){
409 setE (2, Ey);
410}
411
412
413inline void LArRodBlockPhysicsV6::setEz(double Ez){
414 setE (4, Ez);
415}
416
417inline void LArRodBlockPhysicsV6::setSumE(double SumE){
418 setE (6, SumE);
419}
420
421
422
423
424#ifdef LARBSDBGOUTPUT
425#undef LARBSDBGOUTPUT
426#endif
427#undef LARBSDBG
428
429#endif
#define endmsg
#define MYLEVEL
#define LARBSDBG(text)
This class provides decoding/encoding from/to ROD format.
int sign(int a)
virtual void setEx(double)
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
void setE(unsigned int index, double E)
virtual uint32_t hasRawDataBlock() const
uint16_t getFirstSampleIndex() const
virtual uint32_t hasCalibBlock() const
virtual uint32_t getNumberOfGains() const
uint16_t getNbSweetCells2FromMask() const
virtual int32_t getEy() const
virtual int32_t getVROBEz() const
virtual void setEz(double)
virtual uint32_t hasControlWords() const
std::vector< uint32_t > m_RawDataBlock
void initializeFEB(const uint32_t id)
virtual uint32_t getStatus() const
const uint16_t * m_DigitsPointer
virtual int setGain(const int)
virtual uint16_t getCtrl1(uint32_t adc) const
virtual int32_t getSumE() const
bool operator()(const RAWDATA *ch1, const RAWDATA *ch2) const
virtual uint16_t getRawDataSize() const
void sortDataVector(std::vector< const LArDigit * > &vDigit)
virtual uint16_t getCtrl2(uint32_t adc) const
virtual int32_t getEz() const
void setRequiredNSamples(unsigned short ns)
const LArOnlineID * m_onlineHelper
uint16_t getFebConfig() const
std::vector< uint16_t > m_TimeQualityBlock
void setRawData(const int, const std::vector< short > &, const uint32_t)
virtual void setSumE(double)
virtual int FebToRodChannel(int ch) const
std::vector< uint32_t > m_SumBlkBlockE2
virtual int32_t getVROBEy() const
const uint32_t * m_MaskDigitsPointer
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
virtual void setEy(double)
virtual int32_t getVROBSumE() 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 int32_t getVROBEx() const
std::vector< uint32_t > m_FebInfoBlock
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 uint32_t hasPhysicsBlock() const
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 uint32_t getVROBFebId()
virtual uint16_t getNbSweetCells2() const
const uint32_t * m_MaskTimeQualityPointer
virtual uint32_t getNumberOfSamples() const
const uint16_t * m_RaddPointer
std::vector< uint16_t > m_DigitsEncode
virtual int32_t getEx() const
void initializeFragment(std::vector< uint32_t > &fragment)
virtual uint16_t getResults1Size() const
std::vector< uint16_t > m_EnergyBlockEncode
virtual void sortDataVector(std::vector< const LArRawChannel * > &)
const uint32_t * m_virtualROBPointerLocal
uint16_t getHeader16(const unsigned n) const
const uint32_t * m_virtualROBPointer
uint32_t RawToOfflineGain(const uint32_t gain) const
IMessageSvc * getMessageSvc(bool quiet=false)
Definition index.py:1
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.