CMS 3D CMS Logo

HcalHTRData.cc
Go to the documentation of this file.
1 //#include "Utilities/Configuration/interface/Architecture.h"
2 /*
3  * \author J. Mans -- UMD
4  */
5 #ifndef HTBDAQ_DATA_STANDALONE
7 #else
8 #include "HcalHTRData.h"
11 #endif
12 #include <cstring>
13 #include <cstdio>
14 
15 HcalHTRData::HcalHTRData() : m_formatVersion(-2), m_rawLength(0), m_rawConst(nullptr), m_ownData(nullptr) { }
16 HcalHTRData::HcalHTRData(const unsigned short* data, int length) {
17  adoptData(data,length);
18  m_ownData=nullptr;
19 }
21 
22 HcalHTRData::HcalHTRData(int version_to_create) : m_formatVersion(version_to_create) {
23  allocate(version_to_create);
24 }
25 
26 void HcalHTRData::allocate(int version_to_create) {
27  m_formatVersion=version_to_create;
28  // the needed space is for the biggest possible event...
29  const int needed=0x200;
30  // create a buffer big enough...
31  m_ownData=new unsigned short[needed];
32  // clear isn't really necessary, but it makes valgrind happy
33  memset(m_ownData,0,sizeof(unsigned short)*needed);
34  m_rawLength=0;
36 }
37 
39  if (m_ownData==nullptr) {
43  }
44  return (*this);
45 }
46 
47 void HcalHTRData::adoptData(const unsigned short* data, int length) {
48  m_rawLength=length;
50  if (m_rawLength<5) {
51  m_formatVersion=-2; // invalid!
52  } else {
53  // determine format version
54  if ((m_rawConst[2]&0x8000)==0) m_formatVersion=-1; // original format before versions
55  else m_formatVersion=(m_rawConst[4]>>12)&0xF;
56  }
57 }
58 
59 // check :: not EE, length is reasonable, length matches wordcount
60 // length required for tp+daq is correct
61 
62 bool HcalHTRData::check() const {
63  if (m_formatVersion==-1) {
64  // length checks
65  // minimum length
66  if (m_rawLength<6+12) return false;
67  // matches wordcount
68  if (m_rawLength!=m_rawConst[m_rawLength-3]) return false;
69  // empty event check
70  if (m_rawConst[2]&0x20) return false;
71  } else {
72  // length checks
73  // minimum length
74  if (m_rawLength<8+4) return false;
75  if (m_formatVersion<=3) {
76  // matches wordcount
78  if (isHistogramEvent() && m_rawConst[m_rawLength-3]==786) {
79  // known bug!
80  } else
81  return false;
82  }
83  } else {
84  // eventually add CRC check
85  }
86  // empty event check (redundant...)
87  if (m_rawConst[2]&0x4) return false;
88  }
89 
90  if (!isHistogramEvent()) {
91  // daq/tp length check
92  int tp, daq, header, trailer;
93  determineSectionLengths(tp,daq,header,trailer);
94  if (tp+daq+header+trailer>m_rawLength) return false;
95  }
96 
97  return true;
98 }
99 
101  if (m_formatVersion==-1) {
102  return (m_rawConst[2]&0x20)!=0;
103  } else {
104  return (m_rawConst[2]&0x4)!=0;
105  }
106 }
107 
108 
110  if (m_formatVersion==-1) {
111  return false; // too old to care.
112  } else {
113  return (m_rawConst[2]&0x1)!=0;
114  }
115 }
116 
117 bool HcalHTRData::isBusy() const {
118  if (m_formatVersion==-1) {
119  return false; // too old to care.
120  } else {
121  return (m_rawConst[2]&0x2)!=0;
122  }
123 }
124 
125 void HcalHTRData::determineSectionLengths(int& tpWords, int& daqWords, int& headerWords, int& trailerWords) const {
126  if (m_formatVersion==-1) {
127  tpWords=m_rawConst[5]>>8;
128  daqWords=CHANNELS_PER_SPIGOT*(m_rawConst[m_rawLength-4]>>8); // always 24 channels, no zero suppresion
129  headerWords=6;
130  trailerWords=12;
131  } else {
132  tpWords=m_rawConst[5]>>8;
133  if (m_rawLength>4)
134  daqWords=m_rawConst[m_rawLength-4]&0x7FF; // zero suppression supported
135  else daqWords = 0;//should there be a warning as well?
136  headerWords=8;
137  trailerWords=4; // minimum, may be more...
138  }
139 }
140 
141 void HcalHTRData::determineStaticLengths(int& headerWords, int& trailerWords) const {
142  if (m_formatVersion==-1) {
143  headerWords=6;
144  trailerWords=12;
145  } else if (m_formatVersion<5) {
146  headerWords=8;
147  trailerWords=4; // minimum, may be more...
148  } else {
149  headerWords=8;
150  trailerWords=12; // minimum, may be more...
151  }
152 }
153 
154 void HcalHTRData::dataPointers(const unsigned short** daq_first,
155  const unsigned short** daq_last,
156  const unsigned short** tp_first,
157  const unsigned short** tp_last) const {
158  int tp_words_total, daq_words_total, headerLen, trailerLen;
159  determineSectionLengths(tp_words_total,daq_words_total,headerLen,trailerLen);
160 
161  *tp_first=m_rawConst+headerLen;
162  *tp_last=*tp_first+(tp_words_total-1);
163  *daq_first=*tp_last+1;
164  *daq_last=*daq_first+(daq_words_total-1);
165 }
166 
167 /* using FiberAd[2:0] ChanId[1:0] */
168 static const int channelDecoder[32] = { 0, 1, 2, 99, 3, 4, 5, 99,
169  6, 7, 8, 99, 9,10,11, 99,
170  12,13,14,99,15,16,17, 99,
171  18,19,20,99,21,22,23, 99};
172 
173 void HcalHTRData::unpack(unsigned char* daq_lengths, unsigned short* daq_samples,
174  unsigned char* tp_lengths, unsigned short* tp_samples) const {
175 
176  if (daq_lengths!=nullptr) memset(daq_lengths,0,CHANNELS_PER_SPIGOT);
177  if (tp_lengths!=nullptr) memset(tp_lengths,0,CHANNELS_PER_SPIGOT);
178 
179  // currently, the major differences between the versions are
180  // -1 : 6 word header, no zero suppression, trailer setup
181  // 0 : 8 word header, zero suppression,
182 
183  int tp_words_total, daq_words_total, headerLen, trailerLen;
184  determineSectionLengths(tp_words_total,daq_words_total,headerLen,trailerLen);
185 
186  // printf("%d %d %d %d\n",tp_words_total,daq_words_total,headerLen,trailerLen);
187  int wordPtr;
188  const unsigned short* tpBase=m_rawConst+headerLen;
189  // process the trigger primitive words
190  if (tp_lengths!=nullptr) {
191  for (wordPtr=0; wordPtr<tp_words_total; wordPtr++) {
192  int ichan=channelDecoder[tpBase[wordPtr]>>11];
193  if (ichan>=24) continue;
194  tp_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+tp_lengths[ichan]]=tpBase[wordPtr]&0x3ff;
195  tp_lengths[ichan]++;
196  }
197  }
198 
199  const unsigned short* daqBase=m_rawConst+headerLen+tp_words_total;
200  // process the DAQ words [ assumes that data from one channel will always be together ]
201  int lastChan=-1;
202  int lastCapid=0;
203  if (daq_lengths!=nullptr) {
204  for (wordPtr=0; wordPtr<daq_words_total; wordPtr++) {
205  int ichan=channelDecoder[daqBase[wordPtr]>>11];
206  if (ichan>=24) continue;
207  int capid=(daqBase[wordPtr]&0x180)>>7;
208  int erdv=(daqBase[wordPtr]&0x600)>>9;
209  if (erdv!=0x1 ||
210  (lastChan==ichan && (capid!=((lastCapid+1)%4)))) {
211  daq_lengths[ichan]|=0x80;
212  }
213  lastChan=ichan;
214  lastCapid=capid;
215 
216  int useLength=daq_lengths[ichan]&0x1F;
217  // printf("%d %d\n",ichan,useLength);
218  daq_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+useLength]=daqBase[wordPtr]&0x3ff;
219  daq_lengths[ichan]=(useLength+1)|(daq_lengths[ichan]&0xE0); // keep the error bits
220  }
221  }
222 
223 }
224 
225 void HcalHTRData::pack(unsigned char* daq_lengths, unsigned short* daq_samples,
226  unsigned char* tp_lengths, unsigned short* tp_samples, bool do_capid) {
227 
228  int tp_words_total=0, daq_words_total=0, headerLen, trailerLen;
229  determineStaticLengths(headerLen,trailerLen);
230 
231  tp_words_total=0;
232  daq_words_total=0;
233  int ichan,isample;
234 
235  // trigger primitive words
236  unsigned short* ptr=m_ownData+headerLen;
237  if (tp_samples!=nullptr && tp_lengths!=nullptr) {
238  for (ichan=0; ichan<24; ichan++) {
239  unsigned short chanid=((ichan%4)+(((ichan/4)+1)<<2))<<11;
240  for (isample=0; isample<tp_lengths[ichan] && isample<MAXIMUM_SAMPLES_PER_CHANNEL; isample++) {
241  ptr[tp_words_total]=chanid|(tp_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+isample]&0x3FF);
242  tp_words_total++;
243  }
244  }
245  }
246 
247  // daq words
248  ptr=m_ownData+headerLen+tp_words_total;
249  for (ichan=0; ichan<24; ichan++) {
250  unsigned short chanid=((ichan%3)+((ichan/3)<<2))<<11;
251  for (isample=0; isample<daq_lengths[ichan] && isample<MAXIMUM_SAMPLES_PER_CHANNEL; isample++) {
252  unsigned short basedata=daq_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+isample]&0x7FF;
253  if (do_capid) basedata=(basedata&0x7F)|(0x200)|((isample%4)<<7);
254  ptr[daq_words_total]=chanid|basedata;
255  daq_words_total++;
256  }
257  }
258  unsigned short totalLen;
259  if (m_formatVersion==-1) {
260  m_ownData[5]=(tp_words_total<<8)|0x1;
261  totalLen=headerLen+tp_words_total+daq_words_total+trailerLen;
262  m_rawLength=totalLen;
263  m_ownData[totalLen-3]=totalLen;
264  m_ownData[totalLen-4]=(tp_words_total/CHANNELS_PER_SPIGOT)|((daq_words_total/CHANNELS_PER_SPIGOT)<<8);
265  } else {
266  m_ownData[5]=(tp_words_total<<8)|0x1;
267  totalLen=headerLen+tp_words_total+daq_words_total+trailerLen;
268  if ((totalLen%2)==1) {
269  m_ownData[totalLen-4]=0xFFFF; // parity word
270  totalLen++; // round to even number of 16-bit words
271  }
272  m_rawLength=totalLen;
273  m_ownData[totalLen-2]=totalLen/2; // 32-bit words
274  m_ownData[totalLen-3]=totalLen;
275  m_ownData[totalLen-4]=daq_words_total;
276  }
277  if (trailerLen==12) { // initialize extra trailer words if present
278  for (int i=12; i>4; i--)
279  m_ownData[totalLen-i]=0;
280  }
281 
282 }
283 
284 void HcalHTRData::packHeaderTrailer(int L1Anumber, int bcn, int submodule, int orbitn, int pipeline, int ndd, int nps, int firmwareRev, int firmwareFlav) {
285  m_ownData[0]=L1Anumber&0xFF;
286  m_ownData[1]=(L1Anumber&0xFFFF00)>>8;
287  if (m_formatVersion==-1) {
288  m_ownData[2]=((pipeline&0x7F)<<8); // no error bits
289  m_ownData[3]=((orbitn&0xFF)<<8)|(submodule&0xFF);
290  m_ownData[4]=bcn&0xFFF;
291  // m_ownData[5]&=0xFF01;
292  } else {
293  m_ownData[2]=0x8000; // Version is valid, no error bits
294  if (m_formatVersion==0)
295  m_ownData[3]=((orbitn&0x3F)<<10)|(submodule&0x3FF);
296  else
297  m_ownData[3]=((orbitn&0x1F)<<11)|(submodule&0x7FF);
298  m_ownData[4]=((m_formatVersion&0xF)<<12)|(bcn&0xFFF);
299  m_ownData[5]|=((nps&0x1F)<<3)|0x1;
300  m_ownData[6]=((firmwareRev&0x70000)>>3)|(firmwareRev&0x1FFF);
301  m_ownData[7]=(pipeline&0xFF)|((firmwareFlav&0x3F)<<8);
302  m_ownData[m_rawLength-4]&=0x7FF;
303  m_ownData[m_rawLength-4]|=(ndd&0x1F)<<11;
304  }
305  m_ownData[m_rawLength-2]=m_rawLength/2; // 32-bit words
306  m_ownData[m_rawLength-1]=(L1Anumber&0xFF)<<8;
307 }
308 
309 void HcalHTRData::packUnsuppressed(const bool* mp) {
310  if (m_formatVersion<4) return;
311 
312  for (int fiber=1; fiber<=8; fiber++) {
313  for (int fiberchan=0; fiberchan<=2; fiberchan++) {
314  int linchan=(fiber-1)*3+fiberchan;
315 
316  unsigned short& val=m_ownData[m_rawLength-12+(linchan/8)];
317  if (mp[linchan]) val|=1<<(linchan%8);
318  }
319  }
320 
321  // set the unsupressed bit
322  m_ownData[6]|=0x8000;
323 }
324 
325 unsigned int HcalHTRData::getOrbitNumber() const {
326  switch (m_formatVersion) {
327  case (-1) : return (m_rawConst[3]>>8);
328  case (0) : return (m_rawConst[3]>>10);
329  default : return (m_rawConst[3]>>11);
330  }
331 }
332 unsigned int HcalHTRData::getSubmodule() const {
333  switch (m_formatVersion) {
334  case (-1) : return (m_rawConst[3]&0xFF);
335  case (0) : return (m_rawConst[3]&0x3FF);
336  default : return (m_rawConst[3]&0x7FF);
337  }
338 }
339 unsigned int HcalHTRData::htrSlot() const{
340  const unsigned int smid = getSubmodule();
341  return ((smid>>1)&0x1F);
342 }
343 unsigned int HcalHTRData::htrTopBottom() const{
344  const unsigned int smid = getSubmodule();
345  return (smid&0x01);
346 }
347 unsigned int HcalHTRData::readoutVMECrateId() const{
348  const unsigned int smid = getSubmodule();
349  return ((smid>>6)&0x1F);
350 }
352  return (m_formatVersion==-1)?(false):(m_rawConst[2]&0x4000);
353 }
355  return (m_formatVersion<4)?(false):(m_rawConst[6]&0x8000);
356 }
357 bool HcalHTRData::wasMarkAndPassZS(int fiber, int fiberchan) const {
358  if (fiber<1 || fiber>8 || fiberchan<0 || fiberchan>2) return false;
359  if (!isUnsuppressed() || m_formatVersion<5) return false;
360  int linchan=(fiber-1)*3+fiberchan;
361 
362  unsigned short val=m_rawConst[m_rawLength-12+(linchan/8)];
363  return ((val>>(linchan%8))&0x1)!=0;
364 }
365 bool HcalHTRData::wasMarkAndPassZSTP(int slb, int slbchan) const {
366  if (slb<1 || slb>6 || slbchan<0 || slbchan>3) return false;
367  if (!isUnsuppressed() || m_formatVersion<5) return false;
368  int linchan=(slb-1)*4+slbchan;
369 
370  unsigned short val=m_rawConst[m_rawLength-12+(linchan/8)];
371  return ((val>>(linchan%8))&0x100)!=0;
372 }
373 
374 uint32_t HcalHTRData::zsBunchMask() const {
375  uint32_t mask=0;
376  if (isUnsuppressed() && m_formatVersion>=5) {
377  mask=m_rawConst[m_rawLength-5]|
378  ((m_rawConst[m_rawLength-6]&0xF000)<<4);
379  }
380  return mask;
381 }
382 
384  return (m_formatVersion==-1)?(false):(m_rawConst[2]&0x1000);
385 }
387  return (m_formatVersion==-1)?(m_rawConst[2]&0x2):(m_rawConst[2]&0x2000);
388 }
389 int HcalHTRData::getNDD() const {
390  return (m_formatVersion==-1)?(m_rawConst[m_rawLength-4]>>8):(m_rawConst[m_rawLength-4]>>11);
391 }
392 int HcalHTRData::getNTP() const {
393  int retval=-1;
394  if (m_formatVersion==-1) retval=m_rawConst[m_rawLength-4]&0xFF;
395  else if (m_formatVersion<3) retval=m_rawConst[m_rawLength-4]>>11;
396  return retval;
397 }
399  return (m_formatVersion==-1)?(m_rawConst[m_rawLength-4]&0xFF):(m_rawConst[m_rawLength-4]&0x7FF);
400 }
401 int HcalHTRData::getNPS() const {
402  return (m_formatVersion==-1)?(0):((m_rawConst[5]>>3)&0x1F);
403 }
404 unsigned int HcalHTRData::getPipelineLength() const {
405  return (m_formatVersion==-1)?(m_rawConst[2]>>8):(m_rawConst[7]&0xFF);
406 }
407 unsigned int HcalHTRData::getFirmwareRevision() const {
408  return (m_formatVersion==-1)?(0):((m_rawConst[6]&0x1FFF)+((m_rawConst[6]&0xE000)<<3));
409 }
411  return (m_formatVersion<2)?(-1):((m_rawConst[7]>>8)&0xFF);
412 }
413 
414 void HcalHTRData::getHistogramFibers(int& a, int& b) const {
415  a=-1;
416  b=-1;
417  if (m_formatVersion==-1) {
418  a=((m_rawConst[2]&0x0F00)>>8);
419  b=((m_rawConst[2]&0xF000)>>12);
420  } else {
421  a=((m_rawConst[5]&0x0F00)>>8)+1;
422  b=((m_rawConst[5]&0xF000)>>12)+1;
423  }
424 }
425 
426 bool HcalHTRData::wasHistogramError(int ifiber) const {
427  bool retval=!isHistogramEvent();
428  if (!retval) {
429  retval=((m_rawConst[7])&(1<<ifiber))!=0;
430  }
431  return retval;
432 }
433 
434 bool HcalHTRData::unpack_per_channel_header(unsigned short header, int& flav, int& error_flags, int& capid0, int& channelid) {
435  flav=(header>>12)&0x7;
436  error_flags=(header>>10)&0x3;
437  capid0=(header>>8)&0x3;
438  channelid=(header)&0xFF;
439  return (header&0x8000)!=0;
440 }
441 
442 bool HcalHTRData::unpackHistogram(int myfiber, int mysc, int capid, unsigned short* histogram) const {
443  // check for histogram mode
444  if (!isHistogramEvent()) return false;
445 
446  int fiber1, fiber2;
447  getHistogramFibers(fiber1,fiber2);
448  if (fiber1!=myfiber && fiber2!=myfiber) return false;
449 
450  if (m_formatVersion==-1) {
451  int offset=6+mysc*4*32+capid*32;
452  if (myfiber==fiber2) offset+=3*4*32; // skip to the second half...
453  for (int i=0; i<32; i++)
454  histogram[i]=m_rawConst[offset+i];
455  return true;
456  } else {
457  int offset=8+mysc*4*32+capid*32;
458  if (myfiber==fiber2) offset+=3*4*32; // skip to the second half...
459  for (int i=0; i<32; i++)
460  histogram[i]=m_rawConst[offset+i];
461  return true;
462  }
463 }
unsigned short * m_ownData
Definition: HcalHTRData.h:255
int getNDD() const
Get the number of daq data samples per channel when not zero-suppressed.
Definition: HcalHTRData.cc:389
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
Definition: HcalHTRData.cc:62
static int slb(const HcalTriggerPrimitiveSample &theSample)
int m_formatVersion
Definition: HcalHTRData.h:252
unsigned int htrTopBottom() const
HcalElectronicsId-style HTR top/bottom (1=top/0=bottom)
Definition: HcalHTRData.cc:343
void packUnsuppressed(const bool *mp)
pack trailer with Mark and Pass bits
Definition: HcalHTRData.cc:309
bool isPatternRAMEvent() const
Is this event a pattern-ram event?
Definition: HcalHTRData.cc:383
const unsigned short * m_rawConst
Definition: HcalHTRData.h:254
void determineStaticLengths(int &headerWords, int &trailerWords) const
Definition: HcalHTRData.cc:141
bool wasMarkAndPassZS(int fiber, int fiberchan) const
Was this channel passed as part of Mark&Pass ZS?
Definition: HcalHTRData.cc:357
bool wasHistogramError(int ifiber) const
Was there an error on the given fiber for this event (only in histogram mode!)
Definition: HcalHTRData.cc:426
static const int CHANNELS_PER_SPIGOT
Definition: HcalHTRData.h:18
static bool unpack_per_channel_header(unsigned short, int &flav, int &error_flags, int &capid0, int &channelid)
Unpack a per-channel header word (compact format)
Definition: HcalHTRData.cc:434
#define nullptr
static const int MAXIMUM_SAMPLES_PER_CHANNEL
Definition: HcalHTRData.h:19
void getHistogramFibers(int &a, int &b) const
Get the fiber numbers for the data present in this event (only in histogram mode!) ...
Definition: HcalHTRData.cc:414
unsigned int getOrbitNumber() const
Get the HTR orbit number.
Definition: HcalHTRData.cc:325
HcalHTRData & operator=(const HcalHTRData &)
Definition: HcalHTRData.cc:38
int getNPrecisionWords() const
Get the total number of precision data 16-bit words.
Definition: HcalHTRData.cc:398
bool isCalibrationStream() const
Is this event a calibration-stream event?
Definition: HcalHTRData.cc:351
bool isUnsuppressed() const
Is this event an unsuppresed event?
Definition: HcalHTRData.cc:354
void allocate(int version_to_create=0)
Definition: HcalHTRData.cc:26
unsigned int getPipelineLength() const
Get the pipeline length used for this event.
Definition: HcalHTRData.cc:404
bool isOverflowWarning() const
Definition: HcalHTRData.cc:109
unsigned int htrSlot() const
HcalElectronicsId-style HTR slot.
Definition: HcalHTRData.cc:339
void unpack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples) const
Unpack the HTR data into TP and DAQ data sorted by channel.
Definition: HcalHTRData.cc:173
bool unpackHistogram(int fiber, int fiberchan, int capid, unsigned short *histogram) const
Unpack special histogramming mode data.
Definition: HcalHTRData.cc:442
int getNTP() const
Get the number of trigger data samples when not zero-suppressed (not available after FW 4) ...
Definition: HcalHTRData.cc:392
bool isEmptyEvent() const
Definition: HcalHTRData.cc:100
void pack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples, bool do_capid=false)
Unpack the HTR data into TP and DAQ data sorted by channel.
Definition: HcalHTRData.cc:225
void dataPointers(const unsigned short **daq_first, const unsigned short **daq_last, const unsigned short **tp_first, const unsigned short **tp_last) const
Obtain the starting and ending pointers for external unpacking of the data.
Definition: HcalHTRData.cc:154
static const int channelDecoder[32]
Definition: HcalHTRData.cc:168
double b
Definition: hdecay.h:120
int getNPS() const
Get the number of presamples in daq data.
Definition: HcalHTRData.cc:401
int getFirmwareFlavor() const
Get the HTR firmware flavor.
Definition: HcalHTRData.cc:410
unsigned int readoutVMECrateId() const
HcalElectronicsId-style VME crate number.
Definition: HcalHTRData.cc:347
void packHeaderTrailer(int L1Anumber, int bcn, int submodule, int orbitn, int pipeline, int ndd, int nps, int firmwareRev=0, int firmwareFlav=0)
pack header and trailer (call after pack)
Definition: HcalHTRData.cc:284
void adoptData(const unsigned short *data, int length)
Definition: HcalHTRData.cc:47
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
bool wasMarkAndPassZSTP(int slb, int slbchan) const
Was this channel passed as part of Mark&Pass ZS?
Definition: HcalHTRData.cc:365
double a
Definition: hdecay.h:121
uint32_t zsBunchMask() const
ZS Bunch Mask (if available)
Definition: HcalHTRData.cc:374
unsigned int getSubmodule() const
Get the HTR submodule number.
Definition: HcalHTRData.cc:332
bool isBusy() const
Definition: HcalHTRData.cc:117
unsigned int getFirmwareRevision() const
Get the HTR firmware version.
Definition: HcalHTRData.cc:407
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
Definition: HcalHTRData.cc:386
void determineSectionLengths(int &tpWords, int &daqWords, int &headerWords, int &trailerWords) const
Definition: HcalHTRData.cc:125