ATLAS Offline Software
Loading...
Searching...
No Matches
LArRodBlockPhysicsV5.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_LARRODBLOCKPHYSICSV5_H
8#define LARBYTESTREAM_LARRODBLOCKPHYSICSV5_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("RodBlockPhysicsV5");}
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 uint32_t getVROBFebId();
98 virtual inline int32_t getVROBEx() const;
99 virtual inline int32_t getVROBEy() const;
100 virtual inline int32_t getVROBEz() const;
101
102 virtual inline int setGain(const int /*GainValue*/) { return 1; };
103
104 // Enconding methods
105 void initializeFragment(std::vector<uint32_t>& fragment);
106 void initializeFEB(const uint32_t id);
107 void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain);
108 void setRawData(const int , const std::vector<short>& , const uint32_t);
109 void finalizeFEB();
110 // build full ROD fragment
111 void concatinateFEBs();
112 virtual inline void setEx(double);
113 virtual inline void setEy(double);
114 virtual inline void setEz(double);
115
116 void setRequiredNSamples(unsigned short ns) { m_requiredNSamples = ns; }
117
118 //Ordering relation for channels & digits
119 template<class RAWDATA>
120 bool operator () (const RAWDATA* ch1, const RAWDATA* ch2) const;
121 using LArRodBlockStructure::sortDataVector; // avoid warnings.
122 void sortDataVector( std::vector<const LArDigit*>& vDigit)
123 {std::sort(vDigit.begin(),vDigit.end(),*this); }
124
125
126private:
127 inline void setE(unsigned index, double E);
128 virtual void resetPointers();
129 virtual bool setPointers();
130 void setNextEnergy(const uint16_t energy,const int16_t time, const int16_t quality, const uint32_t gain);
131 uint16_t getNbSweetCells1FromMask() const;
132 uint16_t getNbSweetCells2FromMask() const;
133
134 std::vector<uint32_t> m_SumBlkBlockE1;
135 std::vector<uint32_t> m_SumBlkBlockE2;
136 std::vector<uint32_t> m_GainBlock;
137 std::vector<uint32_t> m_FebInfoBlock;
138 std::vector<uint16_t> m_TimeQualityBlock;
139 std::vector<uint32_t> m_RawDataBlock;
140 std::vector<uint16_t> m_EnergyBlockEncode;
141 std::vector<uint16_t> m_DigitsEncode;
142
148 const uint32_t* m_GainPointer = nullptr;
149 const uint32_t* m_MaskTimeQualityPointer = nullptr;
150 const uint32_t* m_MaskDigitsPointer = nullptr;
151 const uint16_t* m_RaddPointer = nullptr;
152 const uint16_t* m_EnergyPointer = nullptr;
153 const int32_t* m_SumPointer = nullptr;
154 const uint16_t* m_TimeQualityPointer = nullptr;
155 const uint16_t* m_DigitsPointer = nullptr;
156 const uint16_t* m_RawDataPointer = nullptr;
157
158 //For fixed gain mode
160 // If one needs to use a log output not only for MSG::DEBUG
161 //MsgStream *m_logstr;
162 uint16_t m_numberHotCell = 0U;
164 // Needs one threshold to send time/quality another for samples
168
169 unsigned short m_requiredNSamples;
171
172public:
173 inline uint16_t getFebConfig() const;
174 inline uint16_t getFirstSampleIndex() const;
175
176 virtual bool canSetCalibration() {return false;}
177 bool canSetEnergy() { return true;}
178 bool canSetRawData() { return false;}
179 bool canIncludeRawData() { return true;}
180};
181
183{
184 return getHeader16(FebConfig);
185}
186
188{
190}
191
192inline int LArRodBlockPhysicsV5::getNextEnergy(int& channelNumber,int32_t& energy,int32_t& time,int32_t& quality, uint32_t& gain)
193{
194 #ifdef LARBSDBGOUTPUT
195 MsgStream logstr(Athena::getMessageSvc(), BlockType());
196 #endif
197
198 LARBSDBG("in LArRodBlockPhysicsV5::getNextEnergy.");
199 LARBSDBG("m_channelsPerFEB=" << m_channelsPerFEB);
200 if (m_EnergyIndex>=m_channelsPerFEB) // Already beyond maximal number of channels
201 return 0;
202 if (!m_EnergyPointer) // No data block present
203 return 0;
204
205 unsigned rodChannelNumber=m_EnergyIndex; // Index of Channel in ROD-Block
206 channelNumber=((rodChannelNumber&0xe)<<2) + ((rodChannelNumber&0x1)<<6) + (rodChannelNumber>>4); //channel number of the FEB
207 //channelNumber=(rodChannelNumber>>4) + ((rodChannelNumber&0xf)<<3); //channel number of the FEB
208
209// if(channelNumber==0) {
210// int size = getNumberOfWords();
211// int off1 = getHeader16(ResultsOff1)-8;
212// int dim1 = getHeader16(ResultsDim1);
213// int off2 = getHeader16(ResultsOff2)-8;
214// int dim2 = getHeader16(ResultsDim2);
215// int off3 = getHeader16(RawDataBlkOff)-8;
216// int dim3 = getHeader16(RawDataBlkDim);
217//
218// for(int i=0;i<size;i++) {
219// if(i==0)
220// std::cout << std::hex << i << " : NWTot " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
221// else if(i==1)
222// std::cout << std::hex << i << " : FEBid " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
223// else if(i==2)
224// std::cout << std::hex << i << " : FEBsn " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
225// else if(i==3)
226// std::cout << std::hex << i << " : Block1 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
227// else if(i==4)
228// std::cout << std::hex << i << " : Block2 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
229// else if(i==5)
230// std::cout << std::hex << i << " : Block3 " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
231// else if(i==6)
232// std::cout << std::hex << i << " : Status " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
233// else if(i==7)
234// std::cout << std::hex << i << " : Gain/Sample " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
235// else if(i==8)
236// std::cout << std::hex << i << " : 1st/FebConf " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
237// else if(i==9)
238// std::cout << std::hex << i << " : InFPGA " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
239// else if (i>=off1 && i<off1+dim1)
240// std::cout << std::hex << i << " : results1 " << i-off1 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
241// else if (i>=off2 && i<off2+dim2)
242// std::cout << std::hex << i << " : results2 " << i-off2 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
243// else if (i>=off3 && i<off3+dim3)
244// std::cout << std::hex << i << " : raw data " << i-off3 << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
245// else
246// std::cout << std::hex << i << " " << std::hex << m_FebBlock+i << " : " << std::hex << m_FebBlock[i] << std::endl;
247// }
248// }
249
250 // get information available for all cells
251 // Energy on a 16 bit word and decode ranges
252 uint16_t encodedEnergy; // 16 bits Encoded Energy word
253 int32_t aux;
254 uint16_t range; // 2 bits range
255 uint16_t sign;
256
257 LARBSDBG("-------->>>> in LArRodBlockPhysicsV5::getNextEnergy : decode energy.....");
258 // decode energy
259 if(m_EnergyIndex & 0x1) encodedEnergy = m_EnergyPointer[m_EnergyIndex-1]; // Big/Little Endien stuff
260 else encodedEnergy = m_EnergyPointer[m_EnergyIndex+1]; // Big/Little Endien stuff
261
262 aux = (int32_t) (encodedEnergy&0x1fff);
263 range = (encodedEnergy & 0xc000) >> 14;
264 if(aux==0 && range>0) aux=0x2000;
265 sign = encodedEnergy & 0x2000;
266 aux <<= 3*range;
267 if(sign) aux = -aux;
268 energy = aux;
269
270 // gain in 2 bits of a 32 bits word
271 if(m_GainPointer) {
272 gain = (uint32_t) ((m_GainPointer[m_EnergyIndex>>4] >> ((m_EnergyIndex&0xf)<<1)) & 0x3);
273 gain=RawToOfflineGain(gain);
274 } else gain=0xffffffff;
275
276 // Get Time and Quality if the information is present according to summary block
277 uint32_t hasTQ;
279 hasTQ = (uint32_t) ((m_MaskTimeQualityPointer[m_EnergyIndex>>5] >> (m_EnergyIndex&0x1f)) &0x1);
280 else
281 hasTQ = 0;
283 if (m_TimeQualityPointer && hasTQ) // Data has Time and Quality information
284 {
285 //Time is in 10 ps in ByteStream, hence the factor 10 to convert to ps
286 time = 10*(reinterpret_cast<const int16_t *>(m_TimeQualityPointer))[m_TimeQualityIndex++];
288
289#ifdef LARBSDBGOUTPUT
290 logstr << MYLEVEL <<"This cell has time and Quality information "<<endmsg;
291#endif
292 }
293 else // Data has no Time and Quality information
294 {
295 time=0;
296 quality=-1;
297 }
298
299
300#ifdef LARBSDBGOUTPUT
301 logstr << MYLEVEL <<"Range = "<<range<<endmsg;
302 logstr << MYLEVEL <<"Sign = "<<sign<<endmsg;
303 logstr << MYLEVEL <<" Encoded Energy ="<< MSG::hex << encodedEnergy << MSG::dec << " E=" << energy
304 << " t=" << time
305 << " Q=" << quality
306 << " G=" << gain
307 << " channel Number=" << channelNumber
308 << endmsg;
309#endif
310
311 return 1;
312}
313
314inline int32_t LArRodBlockPhysicsV5::getEx() const
315{
316 if(m_SumPointer) return (m_SumPointer[0]>>9);
317 return 0;
318}
319
320inline int32_t LArRodBlockPhysicsV5::getEy() const
321{
322 if(m_SumPointer) return (m_SumPointer[1]>>9);
323 return 0;
324}
325
326inline int32_t LArRodBlockPhysicsV5::getEz() const
327{
328 if(m_SumPointer) return (m_SumPointer[2]>>9);
329 return 0;
330}
331
342
344{
345 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
346 if(p) return (p[1]>>9);
347 return 0;
348}
349
351{
352 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
353 if(p) return (p[2]>>9);
354 return 0;
355}
356
358{
359 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
360 if(p) return (p[3]>>9);
361 return 0;
362}
363
365{
366return ( (ch&0x7) << 4) | ( (ch&0x38) >>2 ) | ((ch&0x40)>>6);
367
368}
369
370inline void LArRodBlockPhysicsV5::setE(unsigned index, double E){
371
372 union {
373 int32_t i;
374 uint16_t us[2];
375 } conv;
376 conv.i = static_cast<int32_t>(E);
377 // Write as multiplication, not as left shift, since left-shifting
378 // a negative number is undefined in C++.
379 // Compiles to the same code on x86_64.
380 conv.i *= (1<<9);
381 if ( m_TimeQualityBlock.size()>=6 ){
382 m_TimeQualityBlock[index]=conv.us[0];
383 m_TimeQualityBlock[index+1]=conv.us[1];
384 }
385}
386
387
388inline void LArRodBlockPhysicsV5::setEx(double Ex){
389 setE (0, Ex);
390}
391
392
393inline void LArRodBlockPhysicsV5::setEy(double Ey){
394 setE (2, Ey);
395}
396
397
398inline void LArRodBlockPhysicsV5::setEz(double Ez){
399 setE (4, Ez);
400}
401
402
403
404#ifdef LARBSDBGOUTPUT
405#undef LARBSDBGOUTPUT
406#endif
407#undef LARBSDBG
408
409#endif
#define endmsg
#define MYLEVEL
#define LARBSDBG(text)
This class provides decoding/encoding from/to ROD format.
int sign(int a)
virtual int32_t getEx() const
virtual uint16_t getRawDataSize() const
void setE(unsigned index, double E)
std::vector< uint32_t > m_FebInfoBlock
virtual void setEy(double)
const LArOnlineID * m_onlineHelper
const uint32_t * m_GainPointer
virtual int32_t getEz() const
virtual uint32_t hasControlWords() const
std::vector< uint16_t > m_EnergyBlockEncode
virtual int32_t getVROBEx() const
virtual uint32_t hasPhysicsBlock() const
unsigned short m_requiredNSamples
virtual uint16_t getResults2Size() const
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
virtual int FebToRodChannel(int ch) const
virtual int32_t getEy() const
virtual uint32_t hasCalibBlock() const
void initializeFragment(std::vector< uint32_t > &fragment)
virtual uint16_t getCtrl2(uint32_t adc) const
virtual uint16_t getNbSweetCells2() const
virtual uint32_t hasRawDataBlock() const
virtual uint16_t getCtrl1(uint32_t adc) const
uint16_t getFebConfig() const
virtual uint32_t getNumberOfSamples() const
std::vector< uint32_t > m_SumBlkBlockE1
virtual int32_t getVROBEz() const
bool operator()(const RAWDATA *ch1, const RAWDATA *ch2) const
uint16_t getNbSweetCells1FromMask() const
std::vector< uint32_t > m_SumBlkBlockE2
const uint16_t * m_RawDataPointer
const uint16_t * m_DigitsPointer
void sortDataVector(std::vector< const LArDigit * > &vDigit)
virtual void setEz(double)
const uint32_t * m_MaskDigitsPointer
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
virtual uint16_t getResults1Size() const
int getNextDigits(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
uint16_t getNbSweetCells2FromMask() const
uint16_t getFirstSampleIndex() const
std::vector< uint32_t > m_RawDataBlock
std::vector< uint32_t > m_GainBlock
virtual int32_t getVROBEy() const
const uint32_t * m_MaskTimeQualityPointer
const uint16_t * m_TimeQualityPointer
virtual uint32_t getVROBFebId()
virtual uint16_t getCtrl3(uint32_t adc) const
virtual int setGain(const int)
virtual uint16_t getNbSweetCells1() const
virtual uint32_t getStatus() const
void initializeFEB(const uint32_t id)
const uint16_t * m_RaddPointer
void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain)
void setRawData(const int, const std::vector< short > &, const uint32_t)
const uint16_t * m_EnergyPointer
virtual uint32_t getNumberOfGains() const
virtual void setEx(double)
std::vector< uint16_t > m_DigitsEncode
virtual int getNextEnergy(int &channelNumber, int32_t &energy, int32_t &time, int32_t &quality, uint32_t &gain)
void setRequiredNSamples(unsigned short ns)
std::vector< uint16_t > m_TimeQualityBlock
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.