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-2026 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#ifdef LARBSDBGOUTPUT
24#define MYLEVEL (MSG::FATAL)
25#define LARBSDBG(text) logstr<<MYLEVEL<<text<<endmsg
26#else
27#define LARBSDBG(text)
28#endif
29
31{
32public:
33 // ----------------- Header words indexes -----------------
34 enum {
35 NWTot, // First words: DSP event header
39 FEB_SN, // FEB serial number
40 FEB_SN_h, // FEB serial number
41 ResultsOff1, // Size of results (Physics averages in DSP)
42 ResultsDim1, // Offset to results
43 ResultsOff2, // Size of times (in physics)
44 ResultsDim2, // Offset to times (in physics)
46 RawDataBlkDim, // Raw FEB event offset
47 EventStatus, // Bits describing the event
53 InFPGAFormat, // added 08.09.2005 - wrong 28.09.2005?
55 endtag //This tag needs to be an odd number, see *) for constructor
56 };
57 // constructor
58 LArRodBlockPhysicsV6(IMessageSvc* msgSvc);
59
60 // ------ Identify RodBlockStructure -------
61 static std::string BlockType() { return std::string("RodBlockPhysicsV6");}
62 public:
63 // ----------------- Decoding methods -----------------
64 // Never to be used while encoding!
65 // set full ROD fragment before trying to get anything!
66 // in case there is more than 1 FEB in 1 fragment, jump to next FEB
67 virtual inline int getNextEnergy(int& channelNumber, int32_t& energy, int32_t& time,int32_t& quality,uint32_t& gain);
68 virtual int getNextRawData(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
69 int getNextDigits(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
70 virtual uint16_t getResults1Size() const;
71 virtual uint16_t getResults2Size() const;
72 virtual uint16_t getRawDataSize() const;
73 virtual uint16_t getNbSweetCells1() const;
74 virtual uint16_t getNbSweetCells2() const;
75 virtual uint32_t getNumberOfSamples() const;
76 virtual uint32_t getNumberOfGains() const;
77 virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const;
78 virtual uint16_t getCtrl1(uint32_t adc) const;
79 virtual uint16_t getCtrl2(uint32_t adc) const;
80 virtual uint16_t getCtrl3(uint32_t adc) const;
81 virtual uint32_t getStatus() const;
82
83 virtual inline uint32_t hasCalibBlock() const {return 0;} ;
84 virtual inline uint32_t hasPhysicsBlock() const {return getHeader16(ResultsOff1);} ;
85 virtual inline uint32_t hasRawDataBlock() const {return getHeader16(RawDataBlkOff)+getHeader16(ResultsOff2);} ;
86 virtual inline uint32_t hasControlWords() const {return getHeader16(RawDataBlkOff);} ;
87 virtual inline int FebToRodChannel(int ch) const;
88
89 // Decode counter block
90 virtual inline int32_t getEx() const;
91 virtual inline int32_t getEy() const;
92 virtual inline int32_t getEz() const;
93 virtual inline int32_t getSumE() const;
94 virtual inline uint32_t getVROBFebId();
95 virtual inline int32_t getVROBEx() const;
96 virtual inline int32_t getVROBEy() const;
97 virtual inline int32_t getVROBEz() const;
98 virtual inline int32_t getVROBSumE() const;
99
100 virtual inline int setGain(const int /*GainValue*/) { return 1; };
101
102 // Enconding methods
103 void initializeFragment(std::vector<uint32_t>& fragment);
104 void initializeFEB(const uint32_t id);
105 void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain);
106 void setRawData(const int , const std::vector<short>& , const uint32_t);
107 void finalizeFEB();
108 // build full ROD fragment
109 void concatinateFEBs();
110 virtual inline void setEx(double);
111 virtual inline void setEy(double);
112 virtual inline void setEz(double);
113 virtual inline void setSumE(double);
114
115 void setRequiredNSamples(unsigned short ns) { m_requiredNSamples = ns; }
116
117 //Ordering relation for channels & digits
118 template<class RAWDATA>
119 bool operator () (const RAWDATA* ch1, const RAWDATA* ch2) const;
120 using LArRodBlockStructure::sortDataVector; // avoid warnings.
121 void sortDataVector( std::vector<const LArDigit*>& vDigit)
122 {std::sort(vDigit.begin(),vDigit.end(),*this); }
123
124
125private:
126 void setE(unsigned int index, double E);
127 virtual void resetPointers();
128 virtual bool setPointers();
129 void setNextEnergy(const uint16_t energy,const int16_t time, const int16_t quality, const uint32_t gain);
130 uint16_t getNbSweetCells1FromMask() const;
131 uint16_t getNbSweetCells2FromMask() const;
132
133 std::vector<uint32_t> m_SumBlkBlockE1;
134 std::vector<uint32_t> m_SumBlkBlockE2;
135 std::vector<uint32_t> m_GainBlock;
136 std::vector<uint32_t> m_FebInfoBlock;
137 std::vector<uint16_t> m_TimeQualityBlock;
138 std::vector<uint32_t> m_RawDataBlock;
139 std::vector<uint16_t> m_EnergyBlockEncode;
140 std::vector<uint16_t> m_DigitsEncode;
141
147 const uint32_t* m_GainPointer = nullptr;
148 const uint32_t* m_MaskTimeQualityPointer = nullptr;
149 const uint32_t* m_MaskDigitsPointer = nullptr;
150 const uint16_t* m_RaddPointer = nullptr;
151 const uint16_t* m_EnergyPointer = nullptr;
152 const int32_t* m_SumPointer = nullptr;
153 const uint16_t* m_TimeQualityPointer = nullptr;
154 const uint16_t* m_DigitsPointer = nullptr;
155 const uint16_t* m_RawDataPointer = nullptr;
156
157 //For fixed gain mode
159 uint16_t m_numberHotCell = 0U;
161 // Needs one threshold to send time/quality another for samples
165
166 unsigned short m_requiredNSamples;
168
169public:
170 inline uint16_t getFebConfig() const;
171 inline uint16_t getFirstSampleIndex() const;
172
173 virtual bool canSetCalibration() {return false;}
174 bool canSetEnergy() { return true;}
175 bool canSetRawData() { return false;}
176 bool canIncludeRawData() { return true;}
177};
178
180{
181 return getHeader16(FebConfig);
182}
183
185{
187}
188
189inline int LArRodBlockPhysicsV6::getNextEnergy(int& channelNumber,int32_t& energy,int32_t& time,int32_t& quality, uint32_t& gain)
190{
191 #ifdef LARBSDBGOUTPUT
192 MsgStream logstr(Athena::getMessageSvc(), BlockType());
193 #endif
194
195 LARBSDBG("in LArRodBlockPhysicsV6::getNextEnergy.");
196 LARBSDBG("m_channelsPerFEB=" << m_channelsPerFEB);
197 if (m_EnergyIndex>=m_channelsPerFEB) // Already beyond maximal number of channels
198 return 0;
199 if (!m_EnergyPointer) // No data block present
200 return 0;
201
202 unsigned rodChannelNumber=m_EnergyIndex; // Index of Channel in ROD-Block
203 channelNumber=((rodChannelNumber&0xe)<<2) + ((rodChannelNumber&0x1)<<6) + (rodChannelNumber>>4); //channel number of the FEB
204
205 // get information available for all cells
206 // Energy on a 16 bit word and decode ranges
207 uint16_t encodedEnergy; // 16 bits Encoded Energy word
208 int32_t aux;
209 uint16_t range; // 2 bits range
210 uint16_t sign;
211
212 LARBSDBG("-------->>>> in LArRodBlockPhysicsV6::getNextEnergy : decode energy.....");
213 // decode energy
214 if(m_EnergyIndex & 0x1) encodedEnergy = m_EnergyPointer[m_EnergyIndex-1]; // Big/Little Endien stuff
215 else encodedEnergy = m_EnergyPointer[m_EnergyIndex+1]; // Big/Little Endien stuff
216
217 aux = (int32_t) (encodedEnergy&0x1fff);
218 range = (encodedEnergy & 0xc000) >> 14;
219 if(aux==0 && range>0) aux=0x2000;
220 sign = encodedEnergy & 0x2000;
221 aux <<= 3*range;
222 if(sign) aux = -aux;
223 energy = aux;
224
225 // gain in 2 bits of a 32 bits word
226 if(m_GainPointer) {
227 gain = (uint32_t) ((m_GainPointer[m_EnergyIndex>>4] >> ((m_EnergyIndex&0xf)<<1)) & 0x3);
228 gain=RawToOfflineGain(gain);
229 } else gain=0xffffffff;
230
231 // Get Time and Quality if the information is present according to summary block
232 uint32_t hasTQ;
234 hasTQ = (uint32_t) ((m_MaskTimeQualityPointer[m_EnergyIndex>>5] >> (m_EnergyIndex&0x1f)) &0x1);
235 else
236 hasTQ = 0;
238 if (m_TimeQualityPointer && hasTQ) // Data has Time and Quality information
239 {
240 //Time is in 10 ps in ByteStream, hence the factor 10 to convert to ps
241 time = 10*(reinterpret_cast<const int16_t *>(m_TimeQualityPointer))[m_TimeQualityIndex++];
243
244#ifdef LARBSDBGOUTPUT
245 logstr << MYLEVEL <<"This cell has time and Quality information "<<endmsg;
246#endif
247 }
248 else // Data has no Time and Quality information
249 {
250 time=0;
251 quality=-1;
252 }
253
254
255#ifdef LARBSDBGOUTPUT
256 logstr << MYLEVEL <<"Range = "<<range<<endmsg;
257 logstr << MYLEVEL <<"Sign = "<<sign<<endmsg;
258 logstr << MYLEVEL <<" Encoded Energy ="<< MSG::hex << encodedEnergy << MSG::dec << " E=" << energy
259 << " t=" << time
260 << " Q=" << quality
261 << " G=" << gain
262 << " channel Number=" << channelNumber
263 << endmsg;
264#endif
265
266 return 1;
267}
268
269inline int32_t LArRodBlockPhysicsV6::getEx() const
270{
271 if(m_SumPointer) return (m_SumPointer[0]>>9);
272 return 0;
273}
274
275inline int32_t LArRodBlockPhysicsV6::getEy() const
276{
277 if(m_SumPointer) return (m_SumPointer[1]>>9);
278 return 0;
279}
280
281inline int32_t LArRodBlockPhysicsV6::getEz() const
282{
283 if(m_SumPointer) return (m_SumPointer[2]>>9);
284 return 0;
285}
286inline int32_t LArRodBlockPhysicsV6::getSumE() const
287{
288 if(m_SumPointer) return (m_SumPointer[3]>>9);
289 return 0;
290}
291
302
304{
305 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
306 if(p) return (p[1]>>9);
307 return 0;
308}
309
311{
312 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
313 if(p) return (p[2]>>9);
314 return 0;
315}
316
318{
319 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
320 if(p) return (p[3]>>9);
321 return 0;
322}
323
325{
326 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
327 if(p) return (p[4]>>9);
328 return 0;
329}
330
332{
333return ( (ch&0x7) << 4) | ( (ch&0x38) >>2 ) | ((ch&0x40)>>6);
334
335}
336
337inline void LArRodBlockPhysicsV6::setE(unsigned index, double E){
338
339 union {
340 int32_t i;
341 uint16_t us[2];
342 } conv;
343 conv.i = static_cast<int32_t>(E);
344 // Write as multiplication, not as left shift, since left-shifting
345 // a negative number is undefined in C++.
346 // Compiles to the same code on x86_64.
347 conv.i *= (1<<9);
348 if ( m_TimeQualityBlock.size()>=8 ){
349 m_TimeQualityBlock[index]=conv.us[0];
350 m_TimeQualityBlock[index+1]=conv.us[1];
351 }
352}
353
354
355inline void LArRodBlockPhysicsV6::setEx(double Ex){
356 setE (0, Ex);
357}
358
359
360inline void LArRodBlockPhysicsV6::setEy(double Ey){
361 setE (2, Ey);
362}
363
364
365inline void LArRodBlockPhysicsV6::setEz(double Ez){
366 setE (4, Ez);
367}
368
369inline void LArRodBlockPhysicsV6::setSumE(double SumE){
370 setE (6, SumE);
371}
372
373
374
375
376#ifdef LARBSDBGOUTPUT
377#undef LARBSDBGOUTPUT
378#endif
379#undef LARBSDBG
380
381#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)
static std::string BlockType()
const LArOnlineID * m_onlineHelper
uint16_t getFebConfig() const
std::vector< uint16_t > m_TimeQualityBlock
LArRodBlockPhysicsV6(IMessageSvc *msgSvc)
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
LArRodBlockStructure(IMessageSvc *msgSvc, const std::string &blockType)
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.