ATLAS Offline Software
Loading...
Searching...
No Matches
LArRodBlockPhysicsV2.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_LARRODBLOCKPYSICSV2_H
8#define LARBYTESTREAM_LARRODBLOCKPYSICSV2_H
9
30
31
32
33#include <stdint.h>
34#include <vector>
38
39
40#ifdef LARBSDBGOUTPUT
41#define LARBSDBG(text) m_logstr<<MSG::DEBUG<<text<<endmsg
42#else
43#define LARBSDBG(text)
44#endif
45
47{
48public:
49 // constructor
50 LArRodBlockPhysicsV2(IMessageSvc* msgSvc);
51
52protected:
53 // ----------------- Header words indexes -----------------
54 enum {
64 RawDataBlkOffset, //Elements below this are not used by the converter
70 };
71
72 public:
73 static std::string BlockType() { return std::string("RodBlockPhysicsV2");}
74 // ----------------- Encoding methods -----------------
75 // Never to be used while decoding!
76 virtual void initializeFragment(std::vector<uint32_t>& fragment);
77 virtual void initializeFEB(const uint32_t id);
78 virtual void setNumberOfSamples(const uint8_t n);
79 virtual void setNumberOfGains(const uint8_t n);
80 virtual void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain);
81 virtual void setRawData(const int channel, const std::vector<short>& samples, const uint32_t gain);
82 virtual void finalizeFEB();
83 // build full ROD fragment
84 virtual void concatinateFEBs();
85 //Function to sort RawData Container before encoding:
86 using LArRodBlockStructure::sortDataVector; // avoid warnings.
87 virtual void sortDataVector(std::vector<const LArRawChannel*>& );
88 virtual void sortDataVector( std::vector<const LArDigit*>& );
89 // declare capabilities of this Rod Block Structure
90 virtual bool canSetEnergy() { return true;}
91 virtual bool canSetRawData() {return true;}
92 //Ordering relation for channels & digits
93 template<class RAWDATA>
94 bool operator () (const RAWDATA* ch1, const RAWDATA* ch2) const;
95
96 // ----------------- Decoding methods -----------------
97 // Never to be used while encoding!
98 // set full ROD fragment before trying to get anything!
99 // in case there is more than 1 FEB in 1 fragment, jump to next FEB
100 virtual inline int setGain(const int /*GainValue*/) { return 1; };
101 virtual bool setPointers();
102 virtual inline int getNextEnergy(int& channelNumber, int32_t& energy, int32_t& time,int32_t& quality,uint32_t& gain);
103 virtual int getNextRawData(int& channelNumber, std::vector<short>& samples, uint32_t& gain);
104 virtual uint32_t getNumberOfSamples() const;
105 virtual uint32_t getNumberOfGains() const;
106 virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const;
107 virtual uint16_t getCtrl1(uint32_t adc) const;
108 virtual uint16_t getCtrl2(uint32_t adc) const;
109 virtual uint16_t getCtrl3(uint32_t adc) const;
110 virtual uint32_t getStatus() const;
111
112 virtual inline uint32_t hasPhysicsBlock() const {return LE_getHeader16(LowEBlkOffset);} ;
113 virtual inline uint32_t hasRawDataBlock() const {return LE_getHeader16(RawDataBlkOffset);} ;
114
115 private:
116 void clearBlocks();
117 virtual void resetPointers();
118 //Separated blocks for encoding
119 std::vector<uint32_t> m_LowEnergyBlock;
120 std::vector<uint32_t> m_HighEnergyBlock;
121 std::vector<uint32_t> m_RawDataBlock;
122 //Counter for channels inside of a FEB
123 int m_ECounter = 0;
125 int m_LowEIndex = 0;
128 int m_EIndex = 0; //For writing....
129 const uint16_t *m_RawDataPtr;
130 const uint32_t *m_RawDataFlagsPtr;
131 const uint32_t *m_GainPtr;
132 const int32_t *m_HighEPtr;
133 const uint32_t*m_FlagPtr;
134 const int16_t *m_LowEPtr;
135 //Number of flagging words at the beginning of Block 2, 3, and 4 (Depends on the number of channels)
136 unsigned short m_NFlaggingWords;
137
139 static const uint32_t m_DummyBitMap[4];
140 //Private functions:
141 inline int FebToRodChannel(int ch) const;
142 void setNextEnergy(const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain);
143};
144
146 //{return ch/8 + 16 * (ch%8);}
147{return (ch>>3) + ((ch&0x7)<<4);}
148
149inline int LArRodBlockPhysicsV2::getNextEnergy(int& channelNumber,int32_t& energy,int32_t& time,int32_t& quality, uint32_t& gain)
150{
151 LARBSDBG("in LArRodBlockPhysicsV2::getEnergy.");
152 LARBSDBG("m_ECounter=" << m_ECounter << " m_RawDataIndex="<< m_EIndex);
153 LARBSDBG("m_channelsPerFEB=" << m_channelsPerFEB);
154 if (m_LowEIndex+m_HighEIndex>=m_channelsPerFEB) //Already beyond maximal number of channels
155 return 0;
156 if (!m_FlagPtr || !m_LowEPtr) //No data block present
157 return 0;
158 uint32_t gtQ;
159 int rodChannelNumber=m_LowEIndex+m_HighEIndex; //Index of Channel in ROD-Block
160 channelNumber=rodChannelNumber; // Arno claims he is using FEB numbering
161 //channelNumber=(rodChannelNumber>>4) + ((rodChannelNumber&0xf)<<3); //channel number of the FEB
162 if (getBit(m_FlagPtr,rodChannelNumber)) //Data in high energy block
163 {energy = m_HighEPtr[m_HighEIndex*2];
164 gtQ=m_HighEPtr[m_HighEIndex*2+1];
165 // Q in bits 0-15
166 // t in bits 16-29
167 // gain in bits 30-31
168 quality = gtQ & 0xffff;
169 gtQ = gtQ >> 16;
170 //time = gtQ & 0x3fff;
171 time = gtQ & 0x7fff;
172 if (gtQ & 0x8000)
173 time*=-1;
174 gain=3-((m_GainPtr[channelNumber/16] >> (channelNumber%16)*2) & 0x3);
175 m_HighEIndex++;
176 LARBSDBG("Reading Raw data form High E block. E=" << energy << " Q=" << quality);
177 }
178 else //Data in low energy block
179 {
180 if (!m_LowEPtr)
181 return 0; //Block does not exist;
182 if(m_LowEIndex%2==0)
183 energy=m_LowEPtr[m_LowEIndex+1];
184 else
185 energy=m_LowEPtr[m_LowEIndex-1];
186
187 gain=3-((m_GainPtr[channelNumber/16] >> (channelNumber%16)*2) & 0x3);
188 time=0;
189 quality=-1;
190 m_LowEIndex++;
191 LARBSDBG("*** Reading Raw data form Low E block. E=" << energy);
192 }
193 return 1;
194}
195
196#ifdef LARBSDBGOUTPUT
197#undef LARBSDBGOUTPUT
198#endif
199#undef LARBSDBG
200
201#endif
#define LARBSDBG(text)
This class provides decoding/encoding from/to ROD format.
std::vector< uint32_t > m_LowEnergyBlock
std::vector< uint32_t > m_HighEnergyBlock
std::vector< uint32_t > m_RawDataBlock
virtual uint32_t hasPhysicsBlock() const
static std::string BlockType()
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
virtual void setNumberOfSamples(const uint8_t n)
virtual void setNumberOfGains(const uint8_t n)
virtual uint32_t getStatus() const
virtual int setGain(const int)
virtual uint16_t getCtrl2(uint32_t adc) const
virtual uint32_t hasRawDataBlock() const
virtual uint32_t getNumberOfSamples() const
LArRodBlockPhysicsV2(IMessageSvc *msgSvc)
bool operator()(const RAWDATA *ch1, const RAWDATA *ch2) const
const uint16_t * m_RawDataPtr
virtual void initializeFragment(std::vector< uint32_t > &fragment)
virtual void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain)
const LArOnlineID * m_onlineHelper
virtual void setRawData(const int channel, const std::vector< short > &samples, const uint32_t gain)
virtual uint32_t getNumberOfGains() const
virtual uint16_t getCtrl1(uint32_t adc) const
const uint32_t * m_RawDataFlagsPtr
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
virtual void sortDataVector(std::vector< const LArRawChannel * > &)
static const uint32_t m_DummyBitMap[4]
virtual int getNextEnergy(int &channelNumber, int32_t &energy, int32_t &time, int32_t &quality, uint32_t &gain)
virtual uint16_t getCtrl3(uint32_t adc) const
int FebToRodChannel(int ch) const
virtual void initializeFEB(const uint32_t id)
virtual void sortDataVector(std::vector< const LArRawChannel * > &)
int getBit(const uint32_t *const p, const unsigned chan) const
LArRodBlockStructure(IMessageSvc *msgSvc, const std::string &blockType)
uint16_t LE_getHeader16(const unsigned n) const
singleton-like access to IMessageSvc via open function and helper