CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripFEDBufferComponents.h
Go to the documentation of this file.
1 #ifndef EventFilter_SiStripRawToDigi_SiStripFEDBufferComponents_H
2 #define EventFilter_SiStripRawToDigi_SiStripFEDBufferComponents_H
3 
4 #include "boost/cstdint.hpp"
5 #include <ostream>
6 #include <memory>
7 #include <cstring>
10 
11 namespace sistrip {
12 
13  //
14  // Constants
15  //
16 
17  static const uint8_t INVALID=0xFF;
18 
19  static const uint8_t APV_MAX_ADDRESS=192;
20 
21  static const uint16_t SCOPE_MODE_MAX_SCOPE_LENGTH=1022;
22 
27  };
28  //these are the values which appear in the buffer.
29  static const uint8_t BUFFER_FORMAT_CODE_OLD = 0xED;
30  static const uint8_t BUFFER_FORMAT_CODE_NEW = 0xC5;
31 
32  //enum values are values which appear in buffer. DO NOT CHANGE!
36  HEADER_TYPE_NONE=4 //spy channel
37  };
38 
39  //enum values are values which appear in buffer. DO NOT CHANGE!
56  };
57 
70  };
71 
72  static const uint8_t PACKET_CODE_SCOPE = 0xE1;
73  static const uint8_t PACKET_CODE_VIRGIN_RAW = 0xE6;
74  static const uint8_t PACKET_CODE_VIRGIN_RAW10 = 0x86;
75  static const uint8_t PACKET_CODE_VIRGIN_RAW8_BOTBOT = 0xC6; //FIXME need to implement this!
76  static const uint8_t PACKET_CODE_VIRGIN_RAW8_TOPBOT = 0xA6;
77  static const uint8_t PACKET_CODE_PROC_RAW = 0xF2;
78  static const uint8_t PACKET_CODE_PROC_RAW10 = 0x92; //FIXME need to implement this!
79  static const uint8_t PACKET_CODE_PROC_RAW8_BOTBOT = 0xCA;
80  static const uint8_t PACKET_CODE_PROC_RAW8_TOPBOT = 0xB2;
81  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED = 0xEA;
82  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE10 = 0x8A;
83  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE8 = 0xEA;
84  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE8_BOTBOT = 0xCA;
85  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE8_TOPBOT = 0xAA;
86 
87  //enum values are values which appear in buffer. DO NOT CHANGE!
88  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
97  };
98 
99  //enum values are values which appear in buffer. DO NOT CHANGE!
100  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
104  TTS_BUSY=0x4,
106  TTS_ERROR=0x12,
109 
110  //enum values are values which appear in buffer. DO NOT CHANGE!
115  };
116 
117  //enum values are values which appear in buffer. DO NOT CHANGE!
130  };
131 
132  //
133  // Global function declarations
134  //
135 
136  //used by these classes
137  uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum);
138  void printHex(const void* pointer, const size_t length, std::ostream& os);
139  //calculate the CRC for a FED buffer
140  uint16_t calculateFEDBufferCRC(const uint8_t* buffer, const size_t lengthInBytes);
141  //to make enums printable
142  std::ostream& operator<<(std::ostream& os, const FEDBufferFormat& value);
143  std::ostream& operator<<(std::ostream& os, const FEDHeaderType& value);
144  std::ostream& operator<<(std::ostream& os, const FEDLegacyReadoutMode& value);
145  std::ostream& operator<<(std::ostream& os, const FEDReadoutMode& value);
146  std::ostream& operator<<(std::ostream& os, const FEDDAQEventType& value);
147  std::ostream& operator<<(std::ostream& os, const FEDTTSBits& value);
148  std::ostream& operator<<(std::ostream& os, const FEDBufferState& value);
149  std::ostream& operator<<(std::ostream& os, const FEDChannelStatus& value);
150  //convert name of an element of enum to enum value (useful for getting values from config)
151  FEDBufferFormat fedBufferFormatFromString(const std::string& bufferFormatString);
152  FEDHeaderType fedHeaderTypeFromString(const std::string& headerTypeString);
153  FEDReadoutMode fedReadoutModeFromString(const std::string& readoutModeString);
154  FEDDAQEventType fedDAQEventTypeFromString(const std::string& daqEventTypeString);
155 
156  //
157  // Class definitions
158  //
159 
160  //handles conversion between order of data in buffer in VR/PR modes (readout order) and strip order (physical order)
162  {
163  public:
164  //convert strip/sample index in channel (ie 0-255) between physical and readout order
165  static uint8_t physicalOrderForStripInChannel(const uint8_t readoutOrderStripIndexInChannel);
166  static uint8_t readoutOrderForStripInChannel(const uint8_t physicalOrderStripIndexInChannel);
167  //convert strip/sample index in APV (ie 0-127) between physical and readout order
168  static uint8_t physicalOrderForStripInAPV(const uint8_t readoutOrderStripIndexInAPV);
169  static uint8_t readoutOrderForStripInAPV(const uint8_t physicalOrderStripIndexInAPV);
170  };
171 
172  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
174  {
175  public:
177  explicit FEDDAQHeader(const uint8_t* header);
178  //0x5 in first fragment
179  uint8_t boeNibble() const;
180  uint8_t eventTypeNibble() const;
181  FEDDAQEventType eventType() const;
182  uint32_t l1ID() const;
183  uint16_t bxID() const;
184  uint16_t sourceID() const;
185  uint8_t version() const;
186  //0 if current header word is last, 1 otherwise
187  bool hBit() const;
188  bool lastHeader() const;
189  void print(std::ostream& os) const;
190  //used by digi2Raw
191  const uint8_t* data() const;
192  FEDDAQHeader& setEventType(const FEDDAQEventType evtType);
193  FEDDAQHeader& setL1ID(const uint32_t l1ID);
194  FEDDAQHeader& setBXID(const uint16_t bxID);
195  FEDDAQHeader& setSourceID(const uint16_t sourceID);
196  FEDDAQHeader(const uint32_t l1ID, const uint16_t bxID, const uint16_t sourceID,
197  const FEDDAQEventType evtType = DAQ_EVENT_TYPE_PHYSICS);
198  private:
199  uint8_t header_[8];
200  };
201 
202  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
204  {
205  public:
207  explicit FEDDAQTrailer(const uint8_t* trailer);
208  //0xA in first fragment
209  uint8_t eoeNibble() const;
210  uint32_t eventLengthIn64BitWords() const;
211  uint32_t eventLengthInBytes() const;
212  uint16_t crc() const;
213  //set to 1 if FRL detects a transmission error over S-link
214  bool cBit() const;
215  bool slinkTransmissionError() const { return cBit(); }
216  //set to 1 if the FED ID is not the one expected by the FRL
217  bool fBit() const;
218  bool badSourceID() const { return fBit(); }
219  uint8_t eventStatusNibble() const;
220  uint8_t ttsNibble() const;
221  FEDTTSBits ttsBits() const;
222  //0 if the current trailer is the last, 1 otherwise
223  bool tBit() const;
224  bool lastTrailer() const { return !tBit(); }
225  //set to 1 if the S-link sender card detects a CRC error (the CRC it computes is put in the CRC field)
226  bool rBit() const;
227  bool slinkCRCError() const { return rBit(); }
228  void print(std::ostream& os) const;
229  //used by digi2Raw
230  const uint8_t* data() const;
232  FEDDAQTrailer& setCRC(const uint16_t crc);
233  FEDDAQTrailer& setSLinkTransmissionErrorBit(const bool bitSet);
234  FEDDAQTrailer& setBadSourceIDBit(const bool bitSet);
235  FEDDAQTrailer& setSLinkCRCErrorBit(const bool bitSet);
238  FEDDAQTrailer(const uint32_t eventLengthIn64BitWords, const uint16_t crc = 0, const FEDTTSBits ttsBits = TTS_READY,
239  const bool slinkTransmissionError = false, const bool badFEDID = false, const bool slinkCRCError = false,
240  const uint8_t eventStatusNibble = 0);
241  private:
242  uint8_t trailer_[8];
243  };
244 
246  {
247  public:
248  FEDStatusRegister(const uint16_t fedStatusRegister);
249  bool slinkFullFlag() const;
251  bool qdrMemoryFullFlag() const;
252  bool qdrMemoryPartialFullFlag() const;
253  bool qdrMemoryEmptyFlag() const;
254  bool l1aBxFIFOFullFlag() const;
255  bool l1aBxFIFOPartialFullFlag() const;
256  bool l1aBxFIFOEmptyFlag() const;
259  bool feDataMissingFlag(const uint8_t internalFEUnitNum) const;
260  void print(std::ostream& os) const;
261  void printFlags(std::ostream& os) const;
262  operator uint16_t () const;
263  //used by digi2Raw
264  FEDStatusRegister& setSLinkFullFlag(const bool bitSet);
268  FEDStatusRegister(const FEDBufferState qdrMemoryBufferState = BUFFER_STATE_UNSET,
269  const FEDBufferState l1aBxFIFOBufferState = BUFFER_STATE_UNSET,
270  const bool trackerHeaderMonitorDataReadyFlagSet = false,
271  const bool slinkFullFlagSet = false);
272  private:
273  bool getBit(const uint8_t num) const;
274  void setBit(const uint8_t num, const bool bitSet);
275  void setQDRMemoryFullFlag(const bool bitSet);
276  void setQDRMemoryPartialFullFlag(const bool bitSet);
277  void setQDRMemoryEmptyFlag(const bool bitSet);
278  void setL1ABXFIFOFullFlag(const bool bitSet);
279  void setL1ABXFIFOPartialFullFlag(const bool bitSet);
280  void setL1ABXFIFOEmptyFlag(const bool bitSet);
281  uint16_t data_;
282  };
283 
285  {
286  public:
288  //construct with a pointer to the data. The data will be coppied and swapped if necessary.
289  explicit TrackerSpecialHeader(const uint8_t* headerPointer);
290  uint8_t bufferFormatByte() const;
292  uint8_t headerTypeNibble() const;
293  FEDHeaderType headerType() const;
294  uint8_t trackerEventTypeNibble() const;
295  FEDReadoutMode readoutMode() const;
297  uint8_t apveAddress() const;
298  uint8_t apvAddressErrorRegister() const;
299  bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const;
300  uint8_t feEnableRegister() const;
301  bool feEnabled(const uint8_t internalFEUnitNum) const;
302  uint8_t feOverflowRegister() const;
303  bool feOverflow(const uint8_t internalFEUnitNum) const;
304  uint16_t fedStatusRegisterWord() const;
306  void print(std::ostream& os) const;
307  //used by digi2Raw
308  //returns ordered buffer (ie this may need to be swapped to get original order)
309  const uint8_t* data() const;
310  bool wasSwapped() const;
311  TrackerSpecialHeader& setBufferFormat(const FEDBufferFormat newBufferFormat);
314  TrackerSpecialHeader& setAPVEAddress(const uint8_t address);
315  TrackerSpecialHeader& setAPVEAddressErrorRegister(const uint8_t addressErrorRegister);
316  TrackerSpecialHeader& setAPVAddressErrorForFEUnit(const uint8_t internalFEUnitNum, const bool error);
317  TrackerSpecialHeader& setFEEnableRegister(const uint8_t feEnableRegister);
318  TrackerSpecialHeader& setFEEnableForFEUnit(const uint8_t internalFEUnitNum, const bool enabled);
319  TrackerSpecialHeader& setFEOverflowRegister(const uint8_t feOverflowRegister);
320  TrackerSpecialHeader& setFEOverflowForFEUnit(const uint8_t internalFEUnitNum, const bool overflow);
322  TrackerSpecialHeader(const FEDBufferFormat bufferFormat, const FEDReadoutMode readoutMode, const FEDHeaderType headerType,
323  const uint8_t address = 0x00, const uint8_t addressErrorRegister = 0x00,
324  const uint8_t feEnableRegister = 0xFF, const uint8_t feOverflowRegister = 0x00,
325  const FEDStatusRegister fedStatusRegister = FEDStatusRegister());
326  private:
327  void setBufferFormatByte(const FEDBufferFormat newBufferFormat);
328  void setHeaderTypeNibble(const uint8_t value);
329  void setReadoutModeBits(const uint8_t value);
331  //copy of header, 32 bit word swapped if needed
332  uint8_t specialHeader_[8];
333  //was the header word swapped wrt order in buffer?
335  };
336 
338  {
339  public:
340  FEDBackendStatusRegister(const uint32_t backendStatusRegister);
341  bool internalFreezeFlag() const;
342  bool slinkDownFlag() const;
343  bool slinkFullFlag() const;
344  bool backpressureFlag() const;
345  bool ttcReadyFlag() const;
354  void print(std::ostream& os) const;
355  void printFlags(std::ostream& os) const;
356  operator uint32_t () const;
357  //used by digi2Raw
359  FEDBackendStatusRegister& setSLinkDownFlag(const bool bitSet);
360  FEDBackendStatusRegister& setSLinkFullFlag(const bool bitSet);
361  FEDBackendStatusRegister& setBackpressureFlag(const bool bitSet);
362  FEDBackendStatusRegister& setTTCReadyFlag(const bool bitSet);
371  FEDBackendStatusRegister(const FEDBufferState qdrMemoryBufferState = BUFFER_STATE_UNSET,
372  const FEDBufferState frameAddressFIFOBufferState = BUFFER_STATE_UNSET,
373  const FEDBufferState totalLengthFIFOBufferState = BUFFER_STATE_UNSET,
374  const FEDBufferState trackerHeaderFIFOBufferState = BUFFER_STATE_UNSET,
375  const FEDBufferState l1aBxFIFOBufferState = BUFFER_STATE_UNSET,
376  const FEDBufferState feEventLengthFIFOBufferState = BUFFER_STATE_UNSET,
377  const FEDBufferState feFPGABufferState = BUFFER_STATE_UNSET,
378  const bool backpressure = false, const bool slinkFull = false,
379  const bool slinkDown = false, const bool internalFreeze = false,
380  const bool trackerHeaderMonitorDataReady = false, const bool ttcReady = true);
381  private:
382  bool getBit(const uint8_t num) const;
383  void setBit(const uint8_t num, const bool bitSet);
384  //get the state of the buffer in position 'bufferPosition'
385  FEDBufferState getBufferState(const uint8_t bufferPosition) const;
386  //set the state of the buffer in position 'bufferPosition' to state 'state'
387  void setBufferSate(const uint8_t bufferPosition, const FEDBufferState state);
388  void printFlagsForBuffer(const FEDBufferState bufferState, const std::string name, std::ostream& os) const;
389  //constants marking order of flags in buffer
390  //eg. bit offset for L1A/BX FIFO Partial full flag is STATE_OFFSET_PARTIAL_FULL+BUFFER_POSITION_L1ABX_FIFO
391  // bit offset for total length FIFO empty flag is STATE_OFFSET_EMPTY+BUFFER_POSITION_TOTAL_LENGTH_FIFO
392  //see BE FPGA technical description
403  uint32_t data_;
404  };
405 
407  {
408  public:
409  //factory function: allocates new FEDFEHeader derrivative of appropriate type
410  static std::auto_ptr<FEDFEHeader> newFEHeader(const FEDHeaderType headerType, const uint8_t* headerBuffer);
411  //used by digi2Raw
412  static std::auto_ptr<FEDFEHeader> newFEHeader(const FEDHeaderType headerType);
413  //create a buffer to use with digi2Raw
414  static std::auto_ptr<FEDFEHeader> newFEFakeHeader(const FEDHeaderType headerType);
415  virtual ~FEDFEHeader();
416  //the length of the header
417  virtual size_t lengthInBytes() const = 0;
418  //check that there are no errors indicated in which ever error bits are available in the header
419  //check bits for both APVs on a channel
420  bool checkChannelStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
421  virtual bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const = 0;
422  //check bits for one APV
423  bool checkStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const;
424  virtual bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const = 0;
425  virtual void print(std::ostream& os) const = 0;
426  virtual FEDFEHeader* clone() const = 0;
427  //used by digi2Raw
428  virtual const uint8_t* data() const = 0;
429  virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status) = 0;
430  virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address) = 0;
431  virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister) = 0;
432  virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length) = 0;
433  void setChannelStatus(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const FEDChannelStatus status);
434  };
435 
436  class FEDAPVErrorHeader final : public FEDFEHeader
437  {
438  public:
439  explicit FEDAPVErrorHeader(const uint8_t* headerBuffer);
440  virtual ~FEDAPVErrorHeader();
441  virtual size_t lengthInBytes() const;
442  virtual bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const;
443  virtual bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
444  virtual void print(std::ostream& os) const;
445  virtual FEDAPVErrorHeader* clone() const;
446  //used by digi2Raw
447  virtual const uint8_t* data() const;
448  FEDAPVErrorHeader& setAPVStatusBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool apvGood);
449  FEDAPVErrorHeader& setAPVStatusBit(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum, const bool apvGood);
450  FEDAPVErrorHeader(const std::vector<bool>& apvsGood = std::vector<bool>(APVS_PER_FED,true));
451  //Information which is not present in APVError mode is allowed to be set here so that the methods can be called on the base class without caring
452  //if the values need to be set.
453  virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status);
454  virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address);
455  virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister);
456  virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length);
457  private:
458  static const size_t APV_ERROR_HEADER_SIZE_IN_64BIT_WORDS = 3;
461  };
462 
463  class FEDFullDebugHeader final : public FEDFEHeader
464  {
465  public:
466  explicit FEDFullDebugHeader(const uint8_t* headerBuffer);
467  virtual ~FEDFullDebugHeader();
468  virtual size_t lengthInBytes() const;
469  virtual bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const;
470  virtual bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
471  virtual void print(std::ostream& os) const;
472  virtual FEDFullDebugHeader* clone() const;
473 
474  uint8_t feUnitMajorityAddress(const uint8_t internalFEUnitNum) const;
476  uint32_t daqRegister() const;
477  uint32_t daqRegister2() const;
478  uint16_t feUnitLength(const uint8_t internalFEUnitNum) const;
479  bool fePresent(const uint8_t internalFEUnitNum) const;
480 
481  FEDChannelStatus getChannelStatus(const uint8_t internalFEDChannelNum) const;
482  FEDChannelStatus getChannelStatus(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
483 
484  //These methods return true if there was an error of the appropriate type (ie if the error bit is 0).
485  //They return false if the error could not occur due to a more general error.
486  //was channel unlocked
487  bool unlocked(const uint8_t internalFEDChannelNum) const;
488  bool unlocked(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
489  //was channel out of sync if it was unlocked
490  bool outOfSync(const uint8_t internalFEDChannelNum) const;
491  bool outOfSync(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
492  //was there an internal APV error if it was in sync
493  bool apvError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
494  bool apvError(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const;
495  //was the APV address wrong if it was in sync (does not depend on APV internal error bit)
496  bool apvAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
497  bool apvAddressError(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const;
498 
499  //used by digi2Raw
500  virtual const uint8_t* data() const;
501  virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status);
502  virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address);
503  virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister);
504  virtual void setDAQRegister(const uint32_t daqRegister);
505  virtual void setDAQRegister2(const uint32_t daqRegister2);
506  virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length);
507  FEDFullDebugHeader(const std::vector<uint16_t>& feUnitLengths = std::vector<uint16_t>(FEUNITS_PER_FED,0),
508  const std::vector<uint8_t>& feMajorityAddresses = std::vector<uint8_t>(FEUNITS_PER_FED,0),
509  const std::vector<FEDChannelStatus>& channelStatus = std::vector<FEDChannelStatus>(FEDCH_PER_FED,CHANNEL_STATUS_NO_PROBLEMS),
510  const FEDBackendStatusRegister beStatusRegister = FEDBackendStatusRegister(),
511  const uint32_t daqRegister = 0, const uint32_t daqRegister2 = 0);
512  private:
513  bool getBit(const uint8_t internalFEDChannelNum, const uint8_t bit) const;
514  static uint32_t get32BitWordFrom(const uint8_t* startOfWord);
515  static void set32BitWordAt(uint8_t* startOfWord, const uint32_t value);
516  const uint8_t* feWord(const uint8_t internalFEUnitNum) const;
517  uint8_t* feWord(const uint8_t internalFEUnitNum);
518  void setBit(const uint8_t internalFEDChannelNum, const uint8_t bit, const bool value);
519 
520  //These methods return true if there was an error of the appropriate type (ie if the error bit is 0).
521  //They ignore any previous errors which make the status bits meaningless and return the value of the bit anyway.
522  //In general, the methods above which only return an error for the likely cause are more useful.
523  bool unlockedFromBit(const uint8_t internalFEDChannelNum) const;
524  bool outOfSyncFromBit(const uint8_t internalFEDChannelNum) const;
525  bool apvErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
526  bool apvAddressErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
527 
528  //following methods set the bits to 1 (no error) if value is false
529  void setUnlocked(const uint8_t internalFEDChannelNum, const bool value);
530  void setOutOfSync(const uint8_t internalFEDChannelNum, const bool value);
531  void setAPVAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value);
532  void setAPVError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value);
536  };
537 
538  //holds information about position of a channel in the buffer for use by unpacker
540  {
541  public:
542  FEDChannel(const uint8_t*const data, const size_t offset, const uint16_t length);
543  //gets length from first 2 bytes (assuming normal FED channel)
544  FEDChannel(const uint8_t*const data, const size_t offset);
545  uint16_t length() const;
546  const uint8_t* data() const;
547  size_t offset() const;
548  uint16_t cmMedian(const uint8_t apvIndex) const;
549  //third byte of channel data for normal FED channels
550  uint8_t packetCode() const;
551  private:
552  friend class FEDBuffer;
553  const uint8_t* data_;
554  size_t offset_;
555  uint16_t length_;
556  };
557 
558  //base class for sistrip FED buffers which have a DAQ header/trailer and tracker special header
560  {
561  public:
562  FEDBufferBase(const uint8_t* fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat = false);
563  virtual ~FEDBufferBase();
564  //dump buffer to stream
565  void dump(std::ostream& os) const;
566  //dump original buffer before word swapping
567  void dumpOriginalBuffer(std::ostream& os) const;
568  virtual void print(std::ostream& os) const;
569  //calculate the CRC from the buffer
570  uint16_t calcCRC() const;
571 
572  //methods to get parts of the buffer
573  FEDDAQHeader daqHeader() const;
574  FEDDAQTrailer daqTrailer() const;
575  size_t bufferSize() const;
577  //methods to get info from DAQ header
579  uint32_t daqLvl1ID() const;
580  uint16_t daqBXID() const;
581  uint16_t daqSourceID() const;
582  uint16_t sourceID() const;
583  //methods to get info from DAQ trailer
584  uint32_t daqEventLengthIn64bitWords() const;
585  uint32_t daqEventLengthInBytes() const;
586  uint16_t daqCRC() const;
587  FEDTTSBits daqTTSState() const;
588  //methods to get info from the tracker special header
590  FEDHeaderType headerType() const;
592  FEDReadoutMode readoutMode() const;
593  uint8_t packetCode(bool legacy=false, const uint8_t internalFEDChannelNum=0) const;
594  uint8_t apveAddress() const;
595  bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const;
596  bool feEnabled(const uint8_t internalFEUnitNum) const;
597  uint8_t nFEUnitsEnabled() const;
598  bool feOverflow(const uint8_t internalFEUnitNum) const;
600 
601  //check that channel has no errors
602  virtual bool channelGood(const uint8_t internalFEDChannelNum) const;
603  bool channelGood(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const;
604  //return channel object for channel
605  const FEDChannel& channel(const uint8_t internalFEDChannelNum) const;
606  const FEDChannel& channel(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const;
607 
608  //summary checks
609  //check that tracker special header is valid (does not check for FE unit errors indicated in special header)
610  bool doTrackerSpecialHeaderChecks() const;
611  //check for errors in DAQ heaqder and trailer (not including bad CRC)
612  bool doDAQHeaderAndTrailerChecks() const;
613  //do both
614  virtual bool doChecks() const;
615  //print the result of all detailed checks
616  virtual std::string checkSummary() const;
617 
618  //detailed checks
619  bool checkCRC() const;
620  bool checkMajorityAddresses() const;
621  //methods to check tracker special header
622  bool checkBufferFormat() const;
623  bool checkHeaderType() const;
624  bool checkReadoutMode() const;
625  bool checkAPVEAddressValid() const;
626  bool checkNoFEOverflows() const;
627  //methods to check daq header and trailer
628  bool checkNoSlinkCRCError() const;
629  bool checkNoSLinkTransmissionError() const;
630  bool checkSourceIDs() const;
631  bool checkNoUnexpectedSourceID() const;
632  bool checkNoExtraHeadersOrTrailers() const;
633  bool checkLengthFromTrailer() const;
634  protected:
635  const uint8_t* getPointerToDataAfterTrackerSpecialHeader() const;
636  const uint8_t* getPointerToByteAfterEndOfPayload() const;
637  FEDBufferBase(const uint8_t* fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat, const bool fillChannelVector);
638  std::vector<FEDChannel> channels_;
639  private:
640  void init(const uint8_t* fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat);
641  const uint8_t* originalBuffer_;
642  const uint8_t* orderedBuffer_;
643  const size_t bufferSize_;
647  };
648 
649  //
650  // Inline function definitions
651  //
652 
653  inline std::ostream& operator << (std::ostream& os, const FEDBufferBase& obj) { obj.print(os); os << obj.checkSummary(); return os; }
654 
655  inline uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
656  {
657  return (internalFEUnitNum*FEDCH_PER_FEUNIT + internalFEUnitChannelNum);
658  }
659 
660  inline std::ostream& operator << (std::ostream& os, const FEDDAQHeader& obj) { obj.print(os); return os; }
661  inline std::ostream& operator << (std::ostream& os, const FEDDAQTrailer& obj) { obj.print(os); return os; }
662  inline std::ostream& operator << (std::ostream& os, const TrackerSpecialHeader& obj) { obj.print(os); return os; }
663  inline std::ostream& operator << (std::ostream& os, const FEDStatusRegister& obj) { obj.print(os); return os; }
664  inline std::ostream& operator << (std::ostream& os, const FEDFEHeader& obj) { obj.print(os); return os; }
665 
666  //FEDStripOrdering
667 
668  inline uint8_t FEDStripOrdering::physicalOrderForStripInChannel(const uint8_t readoutOrderStripIndexInChannel)
669  {
670  return physicalOrderForStripInAPV(readoutOrderStripIndexInChannel/2) + (readoutOrderStripIndexInChannel%2)*STRIPS_PER_APV;
671  }
672 
673  inline uint8_t FEDStripOrdering::readoutOrderForStripInChannel(const uint8_t physicalOrderStripIndexInChannel)
674  {
675  return ( readoutOrderForStripInAPV(physicalOrderStripIndexInChannel%128)*2 + (physicalOrderStripIndexInChannel/128) );
676  }
677 
678  inline uint8_t FEDStripOrdering::physicalOrderForStripInAPV(const uint8_t readout_order)
679  {
680  return ( (32 * (readout_order%4)) +
681  (8 * static_cast<uint16_t>(static_cast<float>(readout_order)/4.0)) -
682  (31 * static_cast<uint16_t>(static_cast<float>(readout_order)/16.0))
683  );
684  }
685 
686  inline uint8_t FEDStripOrdering::readoutOrderForStripInAPV(const uint8_t physical_order)
687  {
688  return ( 4*((static_cast<uint16_t>((static_cast<float>(physical_order)/8.0)))%4) +
689  static_cast<uint16_t>(static_cast<float>(physical_order)/32.0) +
690  16*(physical_order%8)
691  );
692  }
693 
694  //TrackerSpecialHeader
695 
697  : wordSwapped_(false)
698  {
699  }
700 
702  { return specialHeader_[BUFFERFORMAT]; }
703 
705  { return ( (specialHeader_[BUFFERTYPE] & 0xF0) >> 4 ); }
706 
708  { return (specialHeader_[BUFFERTYPE] & 0x0F); }
709 
710  inline uint8_t TrackerSpecialHeader::apveAddress() const
711  { return specialHeader_[APVEADDRESS]; }
712 
714  { return specialHeader_[ADDRESSERROR]; }
715 
716  inline bool TrackerSpecialHeader::majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
717  {
718  return ( !(readoutMode() == READOUT_MODE_SCOPE) && !( (0x1<<internalFEUnitNum) & apvAddressErrorRegister() ) );
719  }
720 
722  { return specialHeader_[FEENABLE]; }
723 
724  inline bool TrackerSpecialHeader::feEnabled(const uint8_t internalFEUnitNum) const
725  {
726  return ( (0x1<<internalFEUnitNum) & feEnableRegister() );
727  }
728 
730  { return specialHeader_[FEOVERFLOW]; }
731 
732  inline bool TrackerSpecialHeader::feOverflow(const uint8_t internalFEUnitNum) const
733  {
734  return ( (0x1<<internalFEUnitNum) & feOverflowRegister() );
735  }
736 
738  {
739  //get 16 bits
740  uint16_t statusRegister = ( (specialHeader_[(FEDSTATUS+1)]<<8) | specialHeader_[FEDSTATUS]);
741  return statusRegister;
742  }
743 
746 
747  inline void TrackerSpecialHeader::print(std::ostream& os) const
748  { printHex(specialHeader_,8,os); }
749 
750  inline const uint8_t* TrackerSpecialHeader::data() const
751  {
752  return specialHeader_;
753  }
754 
756  {
757  return wordSwapped_;
758  }
759 
761  {
762  specialHeader_[BUFFERTYPE] = ( (specialHeader_[BUFFERTYPE] & 0x0F) | ((value<<4) & 0xF0) );
763  }
764 
766  {
767  specialHeader_[BUFFERTYPE] = ( (specialHeader_[BUFFERTYPE] & (~0x0F)) | (value & 0x0F) );
768  }
769 
771  {
772  specialHeader_[APVEADDRESS] = address;
773  return *this;
774  }
775 
777  {
778  specialHeader_[ADDRESSERROR] = addressErrorRegister;
779  return *this;
780  }
781 
782  inline TrackerSpecialHeader& TrackerSpecialHeader::setFEEnableRegister(const uint8_t feEnableRegister)
783  {
785  return *this;
786  }
787 
788  inline TrackerSpecialHeader& TrackerSpecialHeader::setFEOverflowRegister(const uint8_t feOverflowRegister)
789  {
791  return *this;
792  }
793 
795  {
796  specialHeader_[FEDSTATUS] = (static_cast<uint16_t>(fedStatusRegister) & 0x00FF);
797  specialHeader_[FEDSTATUS+1] = ( (static_cast<uint16_t>(fedStatusRegister) & 0xFF00) >> 8);
798  return *this;
799  }
800 
801  //FEDStatusRegister
802 
803  inline FEDStatusRegister::FEDStatusRegister(const uint16_t fedStatusRegister)
804  : data_(fedStatusRegister) { }
805 
806  inline FEDStatusRegister::operator uint16_t () const
807  { return data_; }
808 
809  inline bool FEDStatusRegister::getBit(const uint8_t num) const
810  { return ( (0x1<<num) & (data_) ); }
811 
813  { return getBit(0); }
814 
816  { return getBit(1); }
817 
819  { return getBit(2); }
820 
822  { return getBit(3); }
823 
825  { return getBit(4); }
826 
828  { return getBit(5); }
829 
831  { return getBit(6); }
832 
834  { return getBit(7); }
835 
836  inline bool FEDStatusRegister::feDataMissingFlag(const uint8_t internalFEUnitNum) const
837  {
838  return getBit(8+internalFEUnitNum);
839  }
840 
841  inline void FEDStatusRegister::print(std::ostream& os) const
842  { printHex(&data_,2,os); }
843 
845  { setBit(0,bitSet); return *this; }
846 
848  { setBit(1,bitSet); return *this; }
849 
850  inline void FEDStatusRegister::setQDRMemoryFullFlag(const bool bitSet)
851  { setBit(2,bitSet); }
852 
853  inline void FEDStatusRegister::setQDRMemoryPartialFullFlag(const bool bitSet)
854  { setBit(3,bitSet); }
855 
856  inline void FEDStatusRegister::setQDRMemoryEmptyFlag(const bool bitSet)
857  { setBit(4,bitSet); }
858 
859  inline void FEDStatusRegister::setL1ABXFIFOFullFlag(const bool bitSet)
860  { setBit(5,bitSet); }
861 
862  inline void FEDStatusRegister::setL1ABXFIFOPartialFullFlag(const bool bitSet)
863  { setBit(6,bitSet); }
864 
865  inline void FEDStatusRegister::setL1ABXFIFOEmptyFlag(const bool bitSet)
866  { setBit(7,bitSet); }
867 
868  inline FEDStatusRegister::FEDStatusRegister(const FEDBufferState qdrMemoryBufferState, const FEDBufferState l1aBxFIFOBufferState,
869  const bool trackerHeaderMonitorDataReadyFlagSet, const bool slinkFullFlagSet)
870  : data_(0x0000)
871  {
872  setSLinkFullFlag(slinkFullFlagSet);
873  setTrackerHeaderMonitorDataReadyFlag(trackerHeaderMonitorDataReadyFlagSet);
874  setQDRMemoryBufferState(qdrMemoryBufferState);
875  setL1ABXFIFOBufferState(l1aBxFIFOBufferState);
876  }
877 
878  //FEDBackendStatusRegister
879 
880  inline FEDBackendStatusRegister::FEDBackendStatusRegister(const uint32_t backendStatusRegister)
881  : data_(backendStatusRegister) { }
882 
883  inline FEDBackendStatusRegister::operator uint32_t () const
884  { return data_; }
885 
886  inline void FEDBackendStatusRegister::print(std::ostream& os) const
887  { printHex(&data_,4,os); }
888 
889  inline bool FEDBackendStatusRegister::getBit(const uint8_t num) const
890  { return ( (0x1<<num) & (data_) ); }
891 
893  { return getBit(1); }
894 
896  { return getBit(2); }
897 
899  { return getBit(3); }
900 
902  { return getBit(4); }
903 
905  { return getBit(6); }
906 
908  { return getBit(7); }
909 
911  { setBit(1,bitSet); return *this; }
912 
914  { setBit(2,bitSet); return *this; }
915 
917  { setBit(3,bitSet); return *this; }
918 
920  { setBit(4,bitSet); return *this; }
921 
923  { setBit(6,bitSet); return *this; }
924 
926  { setBit(7,bitSet); return *this; }
927 
929  {
931  }
932 
934  {
936  }
937 
939  {
941  }
942 
944  {
946  }
947 
949  {
951  }
952 
954  {
956  }
957 
959  {
961  }
962 
964  {
966  return *this;
967  }
968 
970  {
972  return *this;
973  }
974 
976  {
978  return *this;
979  }
980 
982  {
984  return *this;
985  }
986 
988  {
990  return *this;
991  }
992 
994  {
996  return *this;
997  }
998 
1000  {
1002  return *this;
1003  }
1004 
1005  //FEDFEHeader
1006 
1007  inline std::auto_ptr<FEDFEHeader> FEDFEHeader::newFEHeader(const FEDHeaderType headerType, const uint8_t* headerBuffer)
1008  {
1009  switch (headerType) {
1011  return std::auto_ptr<FEDFEHeader>(new FEDFullDebugHeader(headerBuffer));
1012  case HEADER_TYPE_APV_ERROR:
1013  return std::auto_ptr<FEDFEHeader>(new FEDAPVErrorHeader(headerBuffer));
1014  default:
1015  return std::auto_ptr<FEDFEHeader>();
1016  }
1017  }
1018 
1019  inline std::auto_ptr<FEDFEHeader> FEDFEHeader::newFEHeader(const FEDHeaderType headerType)
1020  {
1021  switch (headerType) {
1023  return std::auto_ptr<FEDFEHeader>(new FEDFullDebugHeader());
1024  case HEADER_TYPE_APV_ERROR:
1025  return std::auto_ptr<FEDFEHeader>(new FEDAPVErrorHeader());
1026  default:
1027  return std::auto_ptr<FEDFEHeader>();
1028  }
1029  }
1030 
1031  inline std::auto_ptr<FEDFEHeader> FEDFEHeader::newFEFakeHeader(const FEDHeaderType headerType)
1032  {
1033  switch (headerType) {
1035  return std::auto_ptr<FEDFEHeader>(new FEDFullDebugHeader);
1036  case HEADER_TYPE_APV_ERROR:
1037  return std::auto_ptr<FEDFEHeader>(new FEDAPVErrorHeader);
1038  default:
1039  return std::auto_ptr<FEDFEHeader>();
1040  }
1041  }
1042 
1043  inline bool FEDFEHeader::checkChannelStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const
1044  {
1045  return checkChannelStatusBits(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum));
1046  }
1047 
1048  inline bool FEDFEHeader::checkStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const
1049  {
1050  return checkStatusBits(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum),apvNum);
1051  }
1052 
1053  inline void FEDFEHeader::setChannelStatus(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const FEDChannelStatus status)
1054  {
1055  this->setChannelStatus(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum),status);
1056  }
1057 
1058  inline FEDAPVErrorHeader::FEDAPVErrorHeader(const uint8_t* headerBuffer)
1059  {
1060  memcpy(header_,headerBuffer,APV_ERROR_HEADER_SIZE_IN_BYTES);
1061  }
1062 
1063  inline FEDAPVErrorHeader& FEDAPVErrorHeader::setAPVStatusBit(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum,
1064  const uint8_t apvNum, const bool apvGood)
1065  {
1066  return setAPVStatusBit(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum),apvNum,apvGood);
1067  }
1068 
1069  inline FEDFullDebugHeader::FEDFullDebugHeader(const uint8_t* headerBuffer)
1070  {
1071  memcpy(header_,headerBuffer,FULL_DEBUG_HEADER_SIZE_IN_BYTES);
1072  }
1073 
1074  inline uint8_t FEDFullDebugHeader::feUnitMajorityAddress(const uint8_t internalFEUnitNum) const
1075  {
1076  return feWord(internalFEUnitNum)[9];
1077  }
1078 
1080  {
1082  }
1083 
1084  inline uint32_t FEDFullDebugHeader::daqRegister() const
1085  {
1086  return get32BitWordFrom(feWord(7)+10);
1087  }
1088 
1089  inline uint32_t FEDFullDebugHeader::daqRegister2() const
1090  {
1091  return get32BitWordFrom(feWord(6)+10);
1092  }
1093 
1094  inline uint16_t FEDFullDebugHeader::feUnitLength(const uint8_t internalFEUnitNum) const
1095  {
1096  return ( (feWord(internalFEUnitNum)[15]<<8) | (feWord(internalFEUnitNum)[14]) );
1097  }
1098 
1099  inline bool FEDFullDebugHeader::fePresent(const uint8_t internalFEUnitNum) const
1100  {
1101  return (feUnitLength(internalFEUnitNum) != 0);
1102  }
1103 
1104  inline bool FEDFullDebugHeader::unlocked(const uint8_t internalFEDChannelNum) const
1105  {
1106  return unlockedFromBit(internalFEDChannelNum);
1107  }
1108 
1109  inline bool FEDFullDebugHeader::unlocked(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const
1110  {
1111  return unlocked(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum));
1112  }
1113 
1114  inline bool FEDFullDebugHeader::outOfSync(const uint8_t internalFEDChannelNum) const
1115  {
1116  return ( !unlocked(internalFEDChannelNum) && outOfSyncFromBit(internalFEDChannelNum) );
1117  }
1118 
1119  inline bool FEDFullDebugHeader::outOfSync(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const
1120  {
1121  return outOfSync(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum));
1122  }
1123 
1124  inline bool FEDFullDebugHeader::apvError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
1125  {
1126  return ( !unlockedFromBit(internalFEDChannelNum) &&
1127  !outOfSyncFromBit(internalFEDChannelNum) &&
1128  apvErrorFromBit(internalFEDChannelNum,apvNum) );
1129  }
1130 
1131  inline bool FEDFullDebugHeader::apvError(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const
1132  {
1133  return apvError(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum),apvNum);
1134  }
1135 
1136  inline bool FEDFullDebugHeader::apvAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
1137  {
1138  return ( !unlockedFromBit(internalFEDChannelNum) &&
1139  !outOfSyncFromBit(internalFEDChannelNum) &&
1140  apvAddressErrorFromBit(internalFEDChannelNum,apvNum) );
1141  }
1142 
1143  inline bool FEDFullDebugHeader::apvAddressError(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const
1144  {
1145  return apvAddressError(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum),apvNum);
1146  }
1147 
1148  inline FEDChannelStatus FEDFullDebugHeader::getChannelStatus(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const
1149  {
1150  return getChannelStatus(internalFEDChannelNum(internalFEUnitNum,internalFEUnitChannelNum));
1151  }
1152 
1154  {
1155  return !getBit(internalFEDChannelNum,5);
1156  }
1157 
1159  {
1160  return !getBit(internalFEDChannelNum,4);
1161  }
1162 
1163  inline bool FEDFullDebugHeader::apvErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
1164  {
1165  //Discovered March 2012: two bits inverted in firmware. Decided
1166  //to update documentation but keep firmware identical for
1167  //backward compatibility. So status bit order is actually:
1168  //apvErr1 - apvAddrErr0 - apvErr0 - apvAddrErr1 - OOS - unlocked.
1169  //Before, it was: return !getBit(internalFEDChannelNum,0+2*apvNum);
1170 
1171  return !getBit(internalFEDChannelNum,0+2*(1-apvNum));
1172  }
1173 
1174  inline bool FEDFullDebugHeader::apvAddressErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
1175  {
1176  return !getBit(internalFEDChannelNum,1+2*apvNum);
1177  }
1178 
1179  inline bool FEDFullDebugHeader::getBit(const uint8_t internalFEDChannelNum, const uint8_t bit) const
1180  {
1181  const uint8_t* pFEWord = feWord(internalFEDChannelNum / FEDCH_PER_FEUNIT);
1182  const uint8_t bitInFeWord = ((FEDCH_PER_FEUNIT-1) - (internalFEDChannelNum%FEDCH_PER_FEUNIT)) * 6 + bit;
1183  return ( pFEWord[bitInFeWord/8] & (0x1 << (bitInFeWord%8)) );
1184  }
1185 
1186  inline uint32_t FEDFullDebugHeader::get32BitWordFrom(const uint8_t* startOfWord)
1187  {
1188  return ( startOfWord[0] | (startOfWord[1]<<8) | (startOfWord[2]<<16) | (startOfWord[3]<<24) );
1189  }
1190 
1191  inline void FEDFullDebugHeader::set32BitWordAt(uint8_t* startOfWord, const uint32_t value)
1192  {
1193  memcpy(startOfWord,&value,4);
1194  }
1195 
1196  inline const uint8_t* FEDFullDebugHeader::feWord(const uint8_t internalFEUnitNum) const
1197  {
1198  return header_+internalFEUnitNum*2*8;
1199  }
1200 
1201  //re-use const method
1202  inline uint8_t* FEDFullDebugHeader::feWord(const uint8_t internalFEUnitNum)
1203  {
1204  return const_cast<uint8_t*>(static_cast<const FEDFullDebugHeader*>(this)->feWord(internalFEUnitNum));
1205  }
1206 
1207  inline void FEDFullDebugHeader::setUnlocked(const uint8_t internalFEDChannelNum, const bool value)
1208  {
1209  setBit(internalFEDChannelNum,5,!value);
1210  }
1211 
1212  inline void FEDFullDebugHeader::setOutOfSync(const uint8_t internalFEDChannelNum, const bool value)
1213  {
1214  setBit(internalFEDChannelNum,4,!value);
1215  }
1216 
1217  inline void FEDFullDebugHeader::setAPVAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value)
1218  {
1219  setBit(internalFEDChannelNum,1+2*apvNum,!value);
1220  }
1221 
1222  inline void FEDFullDebugHeader::setAPVError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value)
1223  {
1224  //Discovered March 2012: two bits inverted in firmware. Decided
1225  //to update documentation but keep firmware identical for
1226  //backward compatibility. So status bit order is actually:
1227  //apvErr1 - apvAddrErr0 - apvErr0 - apvAddrErr1 - OOS - unlocked.
1228  //Before, it was: return !getBit(internalFEDChannelNum,0+2*apvNum);
1229 
1230  setBit(internalFEDChannelNum,0+2*(1-apvNum),!value);
1231  }
1232 
1233  //FEDDAQHeader
1234 
1235  inline FEDDAQHeader::FEDDAQHeader(const uint8_t* header)
1236  {
1237  memcpy(header_,header,8);
1238  }
1239 
1240  inline uint8_t FEDDAQHeader::boeNibble() const
1241  {
1242  return ( (header_[7] & 0xF0) >> 4 );
1243  }
1244 
1245  inline uint8_t FEDDAQHeader::eventTypeNibble() const
1246  {
1247  return (header_[7] & 0x0F);
1248  }
1249 
1250  inline uint32_t FEDDAQHeader::l1ID() const
1251  {
1252  return ( header_[4] | (header_[5]<<8) | (header_[6]<<16) );
1253  }
1254 
1255  inline uint16_t FEDDAQHeader::bxID() const
1256  {
1257  return ( (header_[3]<<4) | ((header_[2]&0xF0)>>4) );
1258  }
1259 
1260  inline uint16_t FEDDAQHeader::sourceID() const
1261  {
1262  return ( ((header_[2]&0x0F)<<8) | header_[1] );
1263  }
1264 
1265  inline uint8_t FEDDAQHeader::version() const
1266  {
1267  return ( (header_[0] & 0xF0) >> 4 );
1268  }
1269 
1270  inline bool FEDDAQHeader::hBit() const
1271  {
1272  return (header_[0] & 0x8);
1273  }
1274 
1275  inline bool FEDDAQHeader::lastHeader() const
1276  {
1277  return !hBit();
1278  }
1279 
1280  inline const uint8_t* FEDDAQHeader::data() const
1281  {
1282  return header_;
1283  }
1284 
1285  inline void FEDDAQHeader::print(std::ostream& os) const
1286  {
1287  printHex(header_,8,os);
1288  }
1289 
1290  //FEDDAQTrailer
1291 
1292  inline FEDDAQTrailer::FEDDAQTrailer(const uint8_t* trailer)
1293  {
1294  memcpy(trailer_,trailer,8);
1295  }
1296 
1297  inline uint8_t FEDDAQTrailer::eoeNibble() const
1298  {
1299  return ( (trailer_[7] & 0xF0) >> 4 );
1300  }
1301 
1303  {
1304  return ( trailer_[4] | (trailer_[5]<<8) | (trailer_[6]<<16) );
1305  }
1306 
1307  inline uint32_t FEDDAQTrailer::eventLengthInBytes() const
1308  {
1309  return eventLengthIn64BitWords()*8;
1310  }
1311 
1312  inline uint16_t FEDDAQTrailer::crc() const
1313  {
1314  return ( trailer_[2] | (trailer_[3]<<8) );
1315  }
1316 
1317  inline bool FEDDAQTrailer::cBit() const
1318  {
1319  return (trailer_[1] & 0x80);
1320  }
1321 
1322  inline bool FEDDAQTrailer::fBit() const
1323  {
1324  return (trailer_[1] & 0x40);
1325  }
1326 
1327  inline uint8_t FEDDAQTrailer::eventStatusNibble() const
1328  {
1329  return (trailer_[1] & 0x0F);
1330  }
1331 
1332  inline uint8_t FEDDAQTrailer::ttsNibble() const
1333  {
1334  return ( (trailer_[0] & 0xF0) >> 4);
1335  }
1336 
1337  inline bool FEDDAQTrailer::tBit() const
1338  {
1339  return (trailer_[0] & 0x08);
1340  }
1341 
1342  inline bool FEDDAQTrailer::rBit() const
1343  {
1344  return (trailer_[0] & 0x04);
1345  }
1346 
1347  inline void FEDDAQTrailer::print(std::ostream& os) const
1348  {
1349  printHex(trailer_,8,os);
1350  }
1351 
1352  inline const uint8_t* FEDDAQTrailer::data() const
1353  {
1354  return trailer_;
1355  }
1356 
1357  //FEDBufferBase
1358 
1359  inline void FEDBufferBase::dump(std::ostream& os) const
1360  {
1362  }
1363 
1364  inline void FEDBufferBase::dumpOriginalBuffer(std::ostream& os) const
1365  {
1367  }
1368 
1369  inline uint16_t FEDBufferBase::calcCRC() const
1370  {
1372  }
1373 
1375  {
1376  return daqHeader_;
1377  }
1378 
1380  {
1381  return daqTrailer_;
1382  }
1383 
1384  inline size_t FEDBufferBase::bufferSize() const
1385  {
1386  return bufferSize_;
1387  }
1388 
1390  {
1391  return specialHeader_;
1392  }
1393 
1395  {
1396  return daqHeader_.eventType();
1397  }
1398 
1399  inline uint32_t FEDBufferBase::daqLvl1ID() const
1400  {
1401  return daqHeader_.l1ID();
1402  }
1403 
1404  inline uint16_t FEDBufferBase::daqBXID() const
1405  {
1406  return daqHeader_.bxID();
1407  }
1408 
1409  inline uint16_t FEDBufferBase::daqSourceID() const
1410  {
1411  return daqHeader_.sourceID();
1412  }
1413 
1415  {
1417  }
1418 
1420  {
1422  }
1423 
1424  inline uint16_t FEDBufferBase::daqCRC() const
1425  {
1426  return daqTrailer_.crc();
1427  }
1428 
1430  {
1431  return daqTrailer_.ttsBits();
1432  }
1433 
1435  {
1436  return specialHeader_.bufferFormat();
1437  }
1438 
1440  {
1441  return specialHeader_.headerType();
1442  }
1443 
1445  {
1447  }
1448 
1450  {
1451  return specialHeader_.readoutMode();
1452  }
1453 
1454  inline uint8_t FEDBufferBase::packetCode(bool legacy, const uint8_t internalFEDChannelNum) const
1455  {
1456  if (legacy) {
1458  switch(mode) {
1460  return PACKET_CODE_SCOPE;
1463  return PACKET_CODE_VIRGIN_RAW;
1466  return PACKET_CODE_PROC_RAW;
1475  default:
1476  return 0;
1477  }
1478  } else {
1480  switch(mode) {
1481  case READOUT_MODE_SCOPE:
1482  return PACKET_CODE_SCOPE;
1484  return channel(internalFEDChannelNum).packetCode();
1485  case READOUT_MODE_PROC_RAW:
1486  return PACKET_CODE_PROC_RAW;
1501  case READOUT_MODE_SPY:
1502  case READOUT_MODE_INVALID:
1503  default:
1504  return 0;
1505  }
1506  }
1507  }
1508 
1509  inline uint8_t FEDBufferBase::apveAddress() const
1510  {
1511  return specialHeader_.apveAddress();
1512  }
1513 
1514  inline bool FEDBufferBase::majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
1515  {
1516  return (specialHeader_.majorityAddressErrorForFEUnit(internalFEUnitNum) && (specialHeader_.apveAddress() != 0x00));
1517  }
1518 
1519  inline bool FEDBufferBase::feEnabled(const uint8_t internalFEUnitNum) const
1520  {
1521  return specialHeader_.feEnabled(internalFEUnitNum);
1522  }
1523 
1524  inline bool FEDBufferBase::feOverflow(const uint8_t internalFEUnitNum) const
1525  {
1526  return specialHeader_.feOverflow(internalFEUnitNum);
1527  }
1528 
1530  {
1532  }
1533 
1534  inline bool FEDBufferBase::channelGood(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const
1535  {
1536  return channelGood(internalFEDChannelNum(internalFEUnitNum,internalChannelNum));
1537  }
1538 
1539  inline const FEDChannel& FEDBufferBase::channel(const uint8_t internalFEDChannelNum) const
1540  {
1542  }
1543 
1544  inline const FEDChannel& FEDBufferBase::channel(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const
1545  {
1546  return channel(internalFEDChannelNum(internalFEUnitNum,internalChannelNum));
1547  }
1548 
1550  {
1551  return ( checkBufferFormat() &&
1552  checkHeaderType() &&
1553  checkReadoutMode() &&
1554  //checkAPVEAddressValid() &&
1555  checkNoFEOverflows() );
1556  }
1557 
1559  {
1560  return ( checkNoSLinkTransmissionError() &&
1561  checkSourceIDs() &&
1565  }
1566 
1567  inline bool FEDBufferBase::checkCRC() const
1568  {
1569  return ( checkNoSlinkCRCError() && (calcCRC()==daqCRC()) );
1570  }
1571 
1573  {
1574  return (bufferFormat() != BUFFER_FORMAT_INVALID);
1575  }
1576 
1578  {
1579  return (headerType() != HEADER_TYPE_INVALID);
1580  }
1581 
1583  {
1584  return (readoutMode() != READOUT_MODE_INVALID);
1585  }
1586 
1588  {
1589  return (apveAddress() <= APV_MAX_ADDRESS);
1590  }
1591 
1593  {
1595  }
1596 
1598  {
1599  return !daqTrailer_.slinkCRCError();
1600  }
1601 
1603  {
1605  }
1606 
1608  {
1609  return !daqTrailer_.badSourceID();
1610  }
1611 
1613  {
1614  return ( (daqHeader_.boeNibble() == 0x5) && (daqTrailer_.eoeNibble() == 0xA) );
1615  }
1616 
1618  {
1619  return (bufferSize() == daqEventLengthInBytes());
1620  }
1621 
1623  {
1624  return orderedBuffer_+16;
1625  }
1626 
1628  {
1629  return orderedBuffer_+bufferSize_-8;
1630  }
1631 
1632  //FEDChannel
1633 
1634  inline FEDChannel::FEDChannel(const uint8_t*const data, const size_t offset)
1635  : data_(data),
1636  offset_(offset)
1637  {
1638  length_ = ( data_[(offset_)^7] + (data_[(offset_+1)^7] << 8) );
1639  }
1640 
1641  inline FEDChannel::FEDChannel(const uint8_t*const data, const size_t offset, const uint16_t length)
1642  : data_(data),
1643  offset_(offset),
1644  length_(length)
1645  {
1646  }
1647 
1648  inline uint16_t FEDChannel::length() const
1649  {
1650  return length_;
1651  }
1652 
1653  inline uint8_t FEDChannel::packetCode() const
1654  {
1655  return data_[(offset_+2)^7];
1656  }
1657 
1658  inline const uint8_t* FEDChannel::data() const
1659  {
1660  return data_;
1661  }
1662 
1663  inline size_t FEDChannel::offset() const
1664  {
1665  return offset_;
1666  }
1667 
1668 }
1669 
1670 #endif //ndef EventFilter_SiStripRawToDigi_FEDBufferComponents_H
static uint8_t physicalOrderForStripInChannel(const uint8_t readoutOrderStripIndexInChannel)
FEDBackendStatusRegister & setFEFPGABufferState(const FEDBufferState state)
FEDBackendStatusRegister & setQDRMemoryState(const FEDBufferState state)
FEDBackendStatusRegister & setL1ABXFIFOState(const FEDBufferState state)
bool getBit(const uint8_t internalFEDChannelNum, const uint8_t bit) const
uint16_t sourceID() const
virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister)=0
bool feDataMissingFlag(const uint8_t internalFEUnitNum) const
virtual size_t lengthInBytes() const =0
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE8_BOTBOT
virtual void setDAQRegister(const uint32_t daqRegister)
virtual void print(std::ostream &os) const
static const size_t APV_ERROR_HEADER_SIZE_IN_BYTES
void printFlags(std::ostream &os) const
void setBit(const uint8_t num, const bool bitSet)
bool fePresent(const uint8_t internalFEUnitNum) const
void setOutOfSync(const uint8_t internalFEDChannelNum, const bool value)
virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length)
bool getBit(const uint8_t num) const
void setQDRMemoryEmptyFlag(const bool bitSet)
uint32_t daqEventLengthIn64bitWords() const
bool feEnabled(const uint8_t internalFEUnitNum) const
virtual std::string checkSummary() const
FEDStatusRegister & setTrackerHeaderMonitorDataReadyFlag(const bool bitSet)
FEDBackendStatusRegister & setFrameAddressFIFOState(const FEDBufferState state)
TrackerSpecialHeader & setFEOverflowRegister(const uint8_t feOverflowRegister)
bool unlockedFromBit(const uint8_t internalFEDChannelNum) const
virtual bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
const uint8_t * getPointerToByteAfterEndOfPayload() const
FEDDAQTrailer daqTrailer() const
static const uint8_t PACKET_CODE_SCOPE
bool unlocked(const uint8_t internalFEDChannelNum) const
FEDBackendStatusRegister & setTrackerHeaderFIFOState(const FEDBufferState state)
FEDFullDebugHeader(const uint8_t *headerBuffer)
virtual bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const
void print(std::ostream &os) const
static const uint8_t PACKET_CODE_PROC_RAW10
FEDDAQTrailer & setSLinkCRCErrorBit(const bool bitSet)
FEDDAQTrailer & setTTSBits(const FEDTTSBits ttsBits)
const uint8_t * feWord(const uint8_t internalFEUnitNum) const
virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister)
FEDBackendStatusRegister beStatusRegister() const
FEDReadoutMode readoutMode() const
bool getBit(const uint8_t num) const
FEDStatusRegister(const uint16_t fedStatusRegister)
static uint32_t get32BitWordFrom(const uint8_t *startOfWord)
void setAPVError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value)
virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address)
FEDStatusRegister & setSLinkFullFlag(const bool bitSet)
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
FEDStatusRegister fedStatusRegister() const
void print(std::ostream &os) const
TrackerSpecialHeader & setAPVEAddress(const uint8_t address)
const uint8_t * getPointerToDataAfterTrackerSpecialHeader() const
FEDDAQTrailer & setSLinkTransmissionErrorBit(const bool bitSet)
FEDHeaderType fedHeaderTypeFromString(const std::string &headerTypeString)
void printFlags(std::ostream &os) const
TrackerSpecialHeader & setBufferFormat(const FEDBufferFormat newBufferFormat)
uint16_t calculateFEDBufferCRC(const uint8_t *buffer, const size_t lengthInBytes)
FEDChannel(const uint8_t *const data, const size_t offset, const uint16_t length)
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE10
std::ostream & operator<<(std::ostream &os, const FEDBufferFormat &value)
virtual bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
bool apvError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
FEDAPVErrorHeader(const uint8_t *headerBuffer)
const uint8_t * data() const
FEDBufferFormat fedBufferFormatFromString(const std::string &bufferFormatString)
void setBit(const uint8_t num, const bool bitSet)
FEDDAQEventType daqEventType() const
TrackerSpecialHeader & setHeaderType(const FEDHeaderType headerType)
static std::auto_ptr< FEDFEHeader > newFEFakeHeader(const FEDHeaderType headerType)
void dumpOriginalBuffer(std::ostream &os) const
FEDReadoutMode fedReadoutModeFromString(const std::string &readoutModeString)
bool feOverflow(const uint8_t internalFEUnitNum) const
static uint8_t readoutOrderForStripInChannel(const uint8_t physicalOrderStripIndexInChannel)
FEDBackendStatusRegister(const uint32_t backendStatusRegister)
uint16_t cmMedian(const uint8_t apvIndex) const
static const uint8_t PACKET_CODE_VIRGIN_RAW10
virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length)
virtual void print(std::ostream &os) const
bool checkStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const
const uint8_t * data() const
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED
virtual FEDFullDebugHeader * clone() const
virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister)
FEDBackendStatusRegister & setTotalLengthFIFOState(const FEDBufferState state)
TrackerSpecialHeader & setFEEnableForFEUnit(const uint8_t internalFEUnitNum, const bool enabled)
FEDDAQTrailer & setEventLengthIn64BitWords(const uint32_t eventLengthIn64BitWords)
FEDLegacyReadoutMode legacyReadoutMode() const
FEDDAQTrailer & setEventStatusNibble(const uint8_t eventStatusNibble)
bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
void setUnlocked(const uint8_t internalFEDChannelNum, const bool value)
FEDBackendStatusRegister & setTTCReadyFlag(const bool bitSet)
FEDDAQTrailer & setCRC(const uint16_t crc)
TrackerSpecialHeader & setAPVEAddressErrorRegister(const uint8_t addressErrorRegister)
TrackerSpecialHeader & setFEDStatusRegister(const FEDStatusRegister fedStatusRegister)
bool apvErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
TrackerSpecialHeader & setAPVAddressErrorForFEUnit(const uint8_t internalFEUnitNum, const bool error)
FEDStatusRegister & setL1ABXFIFOBufferState(const FEDBufferState state)
FEDAPVErrorHeader & setAPVStatusBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool apvGood)
static const uint16_t FEUNITS_PER_FED
FEDBufferState qdrMemoryState() const
FEDLegacyReadoutMode legacyReadoutMode() const
void setQDRMemoryFullFlag(const bool bitSet)
bool feEnabled(const uint8_t internalFEUnitNum) const
virtual void setDAQRegister2(const uint32_t daqRegister2)
virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length)=0
virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status)=0
void dump(std::ostream &os) const
void setL1ABXFIFOFullFlag(const bool bitSet)
static const uint8_t BUFFER_FORMAT_CODE_NEW
FEDBufferBase(const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat=false)
FEDHeaderType headerType() const
virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address)=0
void setAPVAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value)
void printFlagsForBuffer(const FEDBufferState bufferState, const std::string name, std::ostream &os) const
static const size_t APV_ERROR_HEADER_SIZE_IN_64BIT_WORDS
static const uint8_t APV_MAX_ADDRESS
virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address)
uint8_t packetCode(bool legacy=false, const uint8_t internalFEDChannelNum=0) const
void setL1ABXFIFOPartialFullFlag(const bool bitSet)
FEDBufferState l1aBxFIFOState() const
void setHeaderTypeNibble(const uint8_t value)
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE8
static const uint8_t INVALID
const FEDChannel & channel(const uint8_t internalFEDChannelNum) const
static const uint8_t PACKET_CODE_VIRGIN_RAW8_TOPBOT
FEDDAQEventType fedDAQEventTypeFromString(const std::string &daqEventTypeString)
bool outOfSync(const uint8_t internalFEDChannelNum) const
std::vector< FEDChannel > channels_
void setBufferFormatByte(const FEDBufferFormat newBufferFormat)
FEDBufferState getBufferState(const uint8_t bufferPosition) const
bool checkChannelStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const
FEDDAQTrailer & setBadSourceIDBit(const bool bitSet)
void print(std::ostream &os) const
static const size_t FULL_DEBUG_HEADER_SIZE_IN_BYTES
static const uint8_t PACKET_CODE_PROC_RAW
static const uint16_t APVS_PER_FED
static const uint8_t PACKET_CODE_VIRGIN_RAW8_BOTBOT
virtual void print(std::ostream &os) const =0
void printHex(const void *pointer, const size_t length, std::ostream &os)
static uint8_t physicalOrderForStripInAPV(const uint8_t readoutOrderStripIndexInAPV)
static const uint16_t FEDCH_PER_FEUNIT
Constants and enumerated types for FED/FEC systems.
FEDBackendStatusRegister & setTrackerHeaderMonitorDataReadyFlag(const bool bitSet)
void setReadoutModeBits(const uint8_t value)
bool apvAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status)
FEDDAQHeader & setEventType(const FEDDAQEventType evtType)
const uint8_t * data() const
TrackerSpecialHeader trackerSpecialHeader() const
FEDDAQHeader & setL1ID(const uint32_t l1ID)
FEDBackendStatusRegister & setSLinkFullFlag(const bool bitSet)
void print(std::ostream &os) const
FEDDAQHeader & setSourceID(const uint16_t sourceID)
uint16_t feUnitLength(const uint8_t internalFEUnitNum) const
void setBufferSate(const uint8_t bufferPosition, const FEDBufferState state)
virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status)
void init(const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat)
virtual const uint8_t * data() const =0
uint8_t header_[FULL_DEBUG_HEADER_SIZE_IN_BYTES]
uint8_t feUnitMajorityAddress(const uint8_t internalFEUnitNum) const
TrackerSpecialHeader specialHeader_
virtual const uint8_t * data() const
FEDChannelStatus getChannelStatus(const uint8_t internalFEDChannelNum) const
virtual void print(std::ostream &os) const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
static const uint16_t FEDCH_PER_FED
static const uint16_t STRIPS_PER_APV
TrackerSpecialHeader & setFEOverflowForFEUnit(const uint8_t internalFEUnitNum, const bool overflow)
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED_LITE8_TOPBOT
virtual bool channelGood(const uint8_t internalFEDChannelNum) const
static const size_t FULL_DEBUG_HEADER_SIZE_IN_64BIT_WORDS
virtual FEDFEHeader * clone() const =0
FEDBackendStatusRegister & setFEEventLengthFIFOState(const FEDBufferState state)
static const uint8_t PACKET_CODE_PROC_RAW8_BOTBOT
virtual const uint8_t * data() const
bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
static std::auto_ptr< FEDFEHeader > newFEHeader(const FEDHeaderType headerType, const uint8_t *headerBuffer)
FEDDAQHeader & setBXID(const uint16_t bxID)
bool apvAddressErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
static const uint8_t BUFFER_FORMAT_CODE_OLD
volatile std::atomic< bool > shutdown_flag false
void setBit(const uint8_t internalFEDChannelNum, const uint8_t bit, const bool value)
static const uint16_t SCOPE_MODE_MAX_SCOPE_LENGTH
tuple status
Definition: ntuplemaker.py:245
static uint8_t readoutOrderForStripInAPV(const uint8_t physicalOrderStripIndexInAPV)
FEDStatusRegister & setQDRMemoryBufferState(const FEDBufferState state)
virtual FEDAPVErrorHeader * clone() const
FEDDAQEventType eventType() const
static void set32BitWordAt(uint8_t *startOfWord, const uint32_t value)
uint8_t header_[APV_ERROR_HEADER_SIZE_IN_BYTES]
FEDBackendStatusRegister & setInternalFreezeFlag(const bool bitSet)
static const uint8_t PACKET_CODE_PROC_RAW8_TOPBOT
void setL1ABXFIFOEmptyFlag(const bool bitSet)
virtual bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const
FEDBackendStatusRegister & setBackpressureFlag(const bool bitSet)
static const uint8_t PACKET_CODE_VIRGIN_RAW
TrackerSpecialHeader & setReadoutMode(const FEDReadoutMode readoutMode)
bool outOfSyncFromBit(const uint8_t internalFEDChannelNum) const
bool feOverflow(const uint8_t internalFEUnitNum) const
FEDStatusRegister fedStatusRegister() const
void setQDRMemoryPartialFullFlag(const bool bitSet)
FEDBackendStatusRegister & setSLinkDownFlag(const bool bitSet)
FEDBufferFormat bufferFormat() const
TrackerSpecialHeader & setFEEnableRegister(const uint8_t feEnableRegister)