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-2026 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#include <cstdint>
23class IMessageSvc;
24
25
27{
28public:
29 // ----------------- Header words indexes -----------------
30 enum {
31 NWTot, // First words: DSP event header
35 FEB_SN, // FEB serial number
36 FEB_SN_h, // FEB serial number
37 ResultsOff1, // Size of results (Physics averages in DSP)
38 ResultsDim1, // Offset to results
39 ResultsOff2, // Size of times (in physics)
40 ResultsDim2, // Offset to times (in physics)
42 RawDataBlkDim, // Raw FEB event offset
43 EventStatus, // Bits describing the event
49 InFPGAFormat, // added 08.09.2005 - wrong 28.09.2005?
51 endtag //This tag needs to be an odd number, see *) for constructor
52 };
53 // constructor
54 LArRodBlockPhysicsV5(IMessageSvc* msgSvc);
55
56 // ------ Identify RodBlockStructure -------
57 static std::string BlockType() { return std::string("RodBlockPhysicsV5");}
58 public:
59 // ----------------- Decoding methods -----------------
60 // Never to be used while encoding!
61 // set full ROD fragment before trying to get anything!
62 // in case there is more than 1 FEB in 1 fragment, jump to next FEB
63 virtual inline int getNextEnergy(int& channelNumber, int32_t& energy, int32_t& time,int32_t& quality,uint32_t& gain);
64 virtual int getNextRawData(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
65 int getNextDigits(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
66 virtual uint16_t getResults1Size() const;
67 virtual uint16_t getResults2Size() const;
68 virtual uint16_t getRawDataSize() const;
69 virtual uint16_t getNbSweetCells1() const;
70 virtual uint16_t getNbSweetCells2() const;
71 virtual uint32_t getNumberOfSamples() const;
72 virtual uint32_t getNumberOfGains() const;
73 virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const;
74 virtual uint16_t getCtrl1(uint32_t adc) const;
75 virtual uint16_t getCtrl2(uint32_t adc) const;
76 virtual uint16_t getCtrl3(uint32_t adc) const;
77 virtual uint32_t getStatus() const;
78
79 virtual inline uint32_t hasCalibBlock() const {return 0;} ;
80 virtual inline uint32_t hasPhysicsBlock() const {return getHeader16(ResultsOff1);} ;
81 virtual inline uint32_t hasRawDataBlock() const {return getHeader16(RawDataBlkOff)+getHeader16(ResultsOff2);} ;
82 virtual inline uint32_t hasControlWords() const {return getHeader16(RawDataBlkOff);} ;
83 virtual inline int FebToRodChannel(int ch) const;
84
85 // Decode counter block
86 virtual inline int32_t getEx() const;
87 virtual inline int32_t getEy() const;
88 virtual inline int32_t getEz() const;
89 virtual inline uint32_t getVROBFebId();
90 virtual inline int32_t getVROBEx() const;
91 virtual inline int32_t getVROBEy() const;
92 virtual inline int32_t getVROBEz() const;
93
94 virtual inline int setGain(const int /*GainValue*/) { return 1; };
95
96 // Enconding methods
97 void initializeFragment(std::vector<uint32_t>& fragment);
98 void initializeFEB(const uint32_t id);
99 void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain);
100 void setRawData(const int , const std::vector<short>& , const uint32_t);
101 void finalizeFEB();
102 // build full ROD fragment
103 void concatinateFEBs();
104 virtual inline void setEx(double);
105 virtual inline void setEy(double);
106 virtual inline void setEz(double);
107
108 void setRequiredNSamples(unsigned short ns) { m_requiredNSamples = ns; }
109
110 //Ordering relation for channels & digits
111 template<class RAWDATA>
112 bool operator () (const RAWDATA* ch1, const RAWDATA* ch2) const;
113 using LArRodBlockStructure::sortDataVector; // avoid warnings.
114 void sortDataVector( std::vector<const LArDigit*>& vDigit)
115 {std::sort(vDigit.begin(),vDigit.end(),*this); }
116
117
118private:
119 inline void setE(unsigned index, double E);
120 virtual void resetPointers();
121 virtual bool setPointers();
122 void setNextEnergy(const uint16_t energy,const int16_t time, const int16_t quality, const uint32_t gain);
123 uint16_t getNbSweetCells1FromMask() const;
124 uint16_t getNbSweetCells2FromMask() const;
125
126 std::vector<uint32_t> m_SumBlkBlockE1;
127 std::vector<uint32_t> m_SumBlkBlockE2;
128 std::vector<uint32_t> m_GainBlock;
129 std::vector<uint32_t> m_FebInfoBlock;
130 std::vector<uint16_t> m_TimeQualityBlock;
131 std::vector<uint32_t> m_RawDataBlock;
132 std::vector<uint16_t> m_EnergyBlockEncode;
133 std::vector<uint16_t> m_DigitsEncode;
134
140 const uint32_t* m_GainPointer = nullptr;
141 const uint32_t* m_MaskTimeQualityPointer = nullptr;
142 const uint32_t* m_MaskDigitsPointer = nullptr;
143 const uint16_t* m_RaddPointer = nullptr;
144 const uint16_t* m_EnergyPointer = nullptr;
145 const int32_t* m_SumPointer = nullptr;
146 const uint16_t* m_TimeQualityPointer = nullptr;
147 const uint16_t* m_DigitsPointer = nullptr;
148 const uint16_t* m_RawDataPointer = nullptr;
149
150 //For fixed gain mode
152 uint16_t m_numberHotCell = 0U;
154 // Needs one threshold to send time/quality another for samples
158
159 unsigned short m_requiredNSamples;
161
162public:
163 inline uint16_t getFebConfig() const;
164 inline uint16_t getFirstSampleIndex() const;
165
166 virtual bool canSetCalibration() {return false;}
167 bool canSetEnergy() { return true;}
168 bool canSetRawData() { return false;}
169 bool canIncludeRawData() { return true;}
170};
171
173{
174 return getHeader16(FebConfig);
175}
176
178{
180}
181
182inline int LArRodBlockPhysicsV5::getNextEnergy(int& channelNumber,int32_t& energy,int32_t& time,int32_t& quality, uint32_t& gain)
183{
184 m_logstr << MSG::DEBUG << "in LArRodBlockPhysicsV5::getNextEnergy." << endmsg;
185 m_logstr << MSG::DEBUG << "m_channelsPerFEB=" << m_channelsPerFEB << endmsg;
186 if (m_EnergyIndex>=m_channelsPerFEB) // Already beyond maximal number of channels
187 return 0;
188 if (!m_EnergyPointer) // No data block present
189 return 0;
190
191 unsigned rodChannelNumber=m_EnergyIndex; // Index of Channel in ROD-Block
192 channelNumber=((rodChannelNumber&0xe)<<2) + ((rodChannelNumber&0x1)<<6) + (rodChannelNumber>>4); //channel number of the FEB
193
194 // get information available for all cells
195 // Energy on a 16 bit word and decode ranges
196 uint16_t encodedEnergy; // 16 bits Encoded Energy word
197 int32_t aux;
198 uint16_t range; // 2 bits range
199 uint16_t sign;
200
201 m_logstr << MSG::DEBUG << "-------->>>> in LArRodBlockPhysicsV5::getNextEnergy : decode energy....." << "\n";
202 // decode energy
203 if(m_EnergyIndex & 0x1) encodedEnergy = m_EnergyPointer[m_EnergyIndex-1]; // Big/Little Endien stuff
204 else encodedEnergy = m_EnergyPointer[m_EnergyIndex+1]; // Big/Little Endien stuff
205
206 aux = (int32_t) (encodedEnergy&0x1fff);
207 range = (encodedEnergy & 0xc000) >> 14;
208 if(aux==0 && range>0) aux=0x2000;
209 sign = encodedEnergy & 0x2000;
210 aux <<= 3*range;
211 if(sign) aux = -aux;
212 energy = aux;
213
214 // gain in 2 bits of a 32 bits word
215 if(m_GainPointer) {
216 gain = (uint32_t) ((m_GainPointer[m_EnergyIndex>>4] >> ((m_EnergyIndex&0xf)<<1)) & 0x3);
217 gain=RawToOfflineGain(gain);
218 } else gain=0xffffffff;
219
220 // Get Time and Quality if the information is present according to summary block
221 uint32_t hasTQ;
223 hasTQ = (uint32_t) ((m_MaskTimeQualityPointer[m_EnergyIndex>>5] >> (m_EnergyIndex&0x1f)) &0x1);
224 else
225 hasTQ = 0;
227 if (m_TimeQualityPointer && hasTQ) // Data has Time and Quality information
228 {
229 //Time is in 10 ps in ByteStream, hence the factor 10 to convert to ps
230 time = 10*(reinterpret_cast<const int16_t *>(m_TimeQualityPointer))[m_TimeQualityIndex++];
232
233#ifdef LARBSDBGOUTPUT
234 m_logstr << MSG::DEBUG <<"This cell has time and Quality information "<<endmsg;
235#endif
236 }
237 else // Data has no Time and Quality information
238 {
239 time=0;
240 quality=-1;
241 }
242
243
244#ifdef LARBSDBGOUTPUT
245 m_logstr << MSG::DEBUG <<"Range = "<<range<<endmsg;
246 m_logstr << MSG::DEBUG <<"Sign = "<<sign<<endmsg;
247 m_logstr << MSG::DEBUG <<" Encoded Energy ="<< MSG::hex << encodedEnergy << MSG::dec << " E=" << energy
248 << " t=" << time
249 << " Q=" << quality
250 << " G=" << gain
251 << " channel Number=" << channelNumber
252 << endmsg;
253#endif
254
255 return 1;
256}
257
258inline int32_t LArRodBlockPhysicsV5::getEx() const
259{
260 if(m_SumPointer) return (m_SumPointer[0]>>9);
261 return 0;
262}
263
264inline int32_t LArRodBlockPhysicsV5::getEy() const
265{
266 if(m_SumPointer) return (m_SumPointer[1]>>9);
267 return 0;
268}
269
270inline int32_t LArRodBlockPhysicsV5::getEz() const
271{
272 if(m_SumPointer) return (m_SumPointer[2]>>9);
273 return 0;
274}
275
286
288{
289 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
290 if(p) return (p[1]>>9);
291 return 0;
292}
293
295{
296 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
297 if(p) return (p[2]>>9);
298 return 0;
299}
300
302{
303 const int32_t* p = reinterpret_cast<const int32_t*>(m_virtualROBPointerLocal);
304 if(p) return (p[3]>>9);
305 return 0;
306}
307
309{
310 return ( (ch&0x7) << 4) | ( (ch&0x38) >>2 ) | ((ch&0x40)>>6);
311}
312
313inline void
315 if (m_TimeQualityBlock.size() < index + 2) {
316 return;
317 }
318 const auto scaled = static_cast<std::int32_t>(E) * (1 << 9);
319 const auto bits = static_cast<std::uint32_t>(scaled);
320 m_TimeQualityBlock[index] = static_cast<std::uint16_t>(bits & 0xffffu);
321 m_TimeQualityBlock[index + 1] = static_cast<std::uint16_t>((bits >> 16) & 0xffffu);
322}
323
324inline void LArRodBlockPhysicsV5::setEx(double Ex){
325 setE (0, Ex);
326}
327
328
329inline void LArRodBlockPhysicsV5::setEy(double Ey){
330 setE (2, Ey);
331}
332
333
334inline void LArRodBlockPhysicsV5::setEz(double Ez){
335 setE (4, Ez);
336}
337
338
339#endif
#define endmsg
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
LArRodBlockPhysicsV5(IMessageSvc *msgSvc)
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)
static std::string BlockType()
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
LArRodBlockStructure(IMessageSvc *msgSvc, const std::string &blockType)
uint32_t RawToOfflineGain(const uint32_t gain) const
Definition index.py:1
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.