CMS 3D CMS Logo

SiStripFEDBufferComponents.h
Go to the documentation of this file.
1 #ifndef EventFilter_SiStripRawToDigi_SiStripFEDBufferComponents_H
2 #define EventFilter_SiStripRawToDigi_SiStripFEDBufferComponents_H
3 
4 #include <ostream>
5 #include <memory>
6 #include <cstring>
7 #include <vector>
10 #include <cstdint>
11 
12 namespace sistrip {
13 
14  //
15  // Constants
16  //
17 
18  static const uint8_t INVALID = 0xFF;
19 
20  static const uint8_t APV_MAX_ADDRESS = 192;
21 
22  static const uint16_t SCOPE_MODE_MAX_SCOPE_LENGTH = 1022;
23 
29  };
30  //these are the values which appear in the buffer.
31  static const uint8_t BUFFER_FORMAT_CODE_OLD = 0xED;
32  static const uint8_t BUFFER_FORMAT_CODE_NEW = 0xC5;
33 
34  //enum values are values which appear in buffer. DO NOT CHANGE!
39  HEADER_TYPE_NONE = 4 //spy channel
40  };
41 
42  //enum values are values which appear in buffer. DO NOT CHANGE!
60  };
61 
75  };
76 
77  static const uint8_t PACKET_CODE_SCOPE = 0xE1;
78  static const uint8_t PACKET_CODE_VIRGIN_RAW = 0xE6;
79  static const uint8_t PACKET_CODE_VIRGIN_RAW10 = 0x86;
80  static const uint8_t PACKET_CODE_VIRGIN_RAW8_BOTBOT = 0xC6; //FIXME need to implement this!
81  static const uint8_t PACKET_CODE_VIRGIN_RAW8_TOPBOT = 0xA6;
82  static const uint8_t PACKET_CODE_PROC_RAW = 0xF2;
83  static const uint8_t PACKET_CODE_PROC_RAW10 = 0x92; //FIXME need to implement this!
84  static const uint8_t PACKET_CODE_PROC_RAW8_BOTBOT = 0xCA;
85  static const uint8_t PACKET_CODE_PROC_RAW8_TOPBOT = 0xB2;
86  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED = 0xEA;
87  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED10 = 0x8A;
88  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_BOTBOT = 0xCA;
89  static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_TOPBOT = 0xAA;
90 
91  //enum values are values which appear in buffer. DO NOT CHANGE!
92  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
102  };
103 
104  //enum values are values which appear in buffer. DO NOT CHANGE!
105  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
106  enum FEDTTSBits {
110  TTS_BUSY = 0x4,
111  TTS_READY = 0x8,
112  TTS_ERROR = 0x12,
114  TTS_INVALID = INVALID
115  };
116 
117  //enum values are values which appear in buffer. DO NOT CHANGE!
123  };
124 
125  //enum values are values which appear in buffer. DO NOT CHANGE!
136  };
137 
138  //
139  // Global function declarations
140  //
141 
142  //used by these classes
143  uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum);
144  void printHex(const void* pointer, const size_t length, std::ostream& os);
145  //calculate the CRC for a FED buffer
146  uint16_t calculateFEDBufferCRC(const uint8_t* buffer, const size_t lengthInBytes);
147  //to make enums printable
148  std::ostream& operator<<(std::ostream& os, const FEDBufferFormat& value);
149  std::ostream& operator<<(std::ostream& os, const FEDHeaderType& value);
150  std::ostream& operator<<(std::ostream& os, const FEDLegacyReadoutMode& value);
151  std::ostream& operator<<(std::ostream& os, const FEDReadoutMode& value);
152  std::ostream& operator<<(std::ostream& os, const FEDDAQEventType& value);
153  std::ostream& operator<<(std::ostream& os, const FEDTTSBits& value);
154  std::ostream& operator<<(std::ostream& os, const FEDBufferState& value);
155  std::ostream& operator<<(std::ostream& os, const FEDChannelStatus& value);
156  //convert name of an element of enum to enum value (useful for getting values from config)
157  FEDBufferFormat fedBufferFormatFromString(const std::string& bufferFormatString);
158  FEDHeaderType fedHeaderTypeFromString(const std::string& headerTypeString);
159  FEDReadoutMode fedReadoutModeFromString(const std::string& readoutModeString);
160  uint8_t packetCodeFromString(const std::string& packetCodeString, FEDReadoutMode mode);
161  FEDDAQEventType fedDAQEventTypeFromString(const std::string& daqEventTypeString);
162 
163  //
164  // Class definitions
165  //
166 
167  //handles conversion between order of data in buffer in VR/PR modes (readout order) and strip order (physical order)
169  public:
170  //convert strip/sample index in channel (ie 0-255) between physical and readout order
171  static uint8_t physicalOrderForStripInChannel(const uint8_t readoutOrderStripIndexInChannel);
172  static uint8_t readoutOrderForStripInChannel(const uint8_t physicalOrderStripIndexInChannel);
173  //convert strip/sample index in APV (ie 0-127) between physical and readout order
174  static uint8_t physicalOrderForStripInAPV(const uint8_t readoutOrderStripIndexInAPV);
175  static uint8_t readoutOrderForStripInAPV(const uint8_t physicalOrderStripIndexInAPV);
176  };
177 
178  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
179  class FEDDAQHeader {
180  public:
182  explicit FEDDAQHeader(const uint8_t* header);
183  //0x5 in first fragment
184  uint8_t boeNibble() const;
185  uint8_t eventTypeNibble() const;
186  FEDDAQEventType eventType() const;
187  uint32_t l1ID() const;
188  uint16_t bxID() const;
189  uint16_t sourceID() const;
190  uint8_t version() const;
191  //0 if current header word is last, 1 otherwise
192  bool hBit() const;
193  bool lastHeader() const;
194  void print(std::ostream& os) const;
195  //used by digi2Raw
196  const uint8_t* data() const;
197  FEDDAQHeader& setEventType(const FEDDAQEventType evtType);
198  FEDDAQHeader& setL1ID(const uint32_t l1ID);
199  FEDDAQHeader& setBXID(const uint16_t bxID);
200  FEDDAQHeader& setSourceID(const uint16_t sourceID);
201  FEDDAQHeader(const uint32_t l1ID,
202  const uint16_t bxID,
203  const uint16_t sourceID,
204  const FEDDAQEventType evtType = DAQ_EVENT_TYPE_PHYSICS);
205 
206  private:
207  uint8_t header_[8];
208  };
209 
210  //see http://cmsdoc.cern.ch/cms/TRIDAS/horizontal/RUWG/DAQ_IF_guide/DAQ_IF_guide.html
212  public:
214  explicit FEDDAQTrailer(const uint8_t* trailer);
215  //0xA in first fragment
216  uint8_t eoeNibble() const;
217  uint32_t eventLengthIn64BitWords() const;
218  uint32_t eventLengthInBytes() const;
219  uint16_t crc() const;
220  //set to 1 if FRL detects a transmission error over S-link
221  bool cBit() const;
222  bool slinkTransmissionError() const { return cBit(); }
223  //set to 1 if the FED ID is not the one expected by the FRL
224  bool fBit() const;
225  bool badSourceID() const { return fBit(); }
226  uint8_t eventStatusNibble() const;
227  uint8_t ttsNibble() const;
228  FEDTTSBits ttsBits() const;
229  //0 if the current trailer is the last, 1 otherwise
230  bool tBit() const;
231  bool lastTrailer() const { return !tBit(); }
232  //set to 1 if the S-link sender card detects a CRC error (the CRC it computes is put in the CRC field)
233  bool rBit() const;
234  bool slinkCRCError() const { return rBit(); }
235  void print(std::ostream& os) const;
236  //used by digi2Raw
237  const uint8_t* data() const;
238  FEDDAQTrailer& setEventLengthIn64BitWords(const uint32_t eventLengthIn64BitWords);
239  FEDDAQTrailer& setCRC(const uint16_t crc);
240  FEDDAQTrailer& setSLinkTransmissionErrorBit(const bool bitSet);
241  FEDDAQTrailer& setBadSourceIDBit(const bool bitSet);
242  FEDDAQTrailer& setSLinkCRCErrorBit(const bool bitSet);
243  FEDDAQTrailer& setEventStatusNibble(const uint8_t eventStatusNibble);
244  FEDDAQTrailer& setTTSBits(const FEDTTSBits ttsBits);
245  FEDDAQTrailer(const uint32_t eventLengthIn64BitWords,
246  const uint16_t crc = 0,
247  const FEDTTSBits ttsBits = TTS_READY,
248  const bool slinkTransmissionError = false,
249  const bool badFEDID = false,
250  const bool slinkCRCError = false,
251  const uint8_t eventStatusNibble = 0);
252 
253  private:
254  uint8_t trailer_[8];
255  };
256 
258  public:
259  FEDStatusRegister(const uint16_t fedStatusRegister);
260  bool slinkFullFlag() const;
261  bool trackerHeaderMonitorDataReadyFlag() const;
262  bool qdrMemoryFullFlag() const;
263  bool qdrMemoryPartialFullFlag() const;
264  bool qdrMemoryEmptyFlag() const;
265  bool l1aBxFIFOFullFlag() const;
266  bool l1aBxFIFOPartialFullFlag() const;
267  bool l1aBxFIFOEmptyFlag() const;
268  FEDBufferState qdrMemoryState() const;
269  FEDBufferState l1aBxFIFOState() const;
270  bool feDataMissingFlag(const uint8_t internalFEUnitNum) const;
271  void print(std::ostream& os) const;
272  void printFlags(std::ostream& os) const;
273  operator uint16_t() const;
274  //used by digi2Raw
275  FEDStatusRegister& setSLinkFullFlag(const bool bitSet);
276  FEDStatusRegister& setTrackerHeaderMonitorDataReadyFlag(const bool bitSet);
277  FEDStatusRegister& setQDRMemoryBufferState(const FEDBufferState state);
278  FEDStatusRegister& setL1ABXFIFOBufferState(const FEDBufferState state);
279  FEDStatusRegister(const FEDBufferState qdrMemoryBufferState = BUFFER_STATE_UNSET,
280  const FEDBufferState l1aBxFIFOBufferState = BUFFER_STATE_UNSET,
281  const bool trackerHeaderMonitorDataReadyFlagSet = false,
282  const bool slinkFullFlagSet = false);
283 
284  private:
285  bool getBit(const uint8_t num) const;
286  void setBit(const uint8_t num, const bool bitSet);
287  void setQDRMemoryFullFlag(const bool bitSet);
288  void setQDRMemoryPartialFullFlag(const bool bitSet);
289  void setQDRMemoryEmptyFlag(const bool bitSet);
290  void setL1ABXFIFOFullFlag(const bool bitSet);
291  void setL1ABXFIFOPartialFullFlag(const bool bitSet);
292  void setL1ABXFIFOEmptyFlag(const bool bitSet);
293  uint16_t data_;
294  };
295 
297  public:
299  //construct with a pointer to the data. The data will be coppied and swapped if necessary.
300  explicit TrackerSpecialHeader(const uint8_t* headerPointer);
301  uint8_t bufferFormatByte() const;
302  FEDBufferFormat bufferFormat() const;
303  uint8_t headerTypeNibble() const;
304  FEDHeaderType headerType() const;
305  uint8_t trackerEventTypeNibble() const;
306  FEDReadoutMode readoutMode() const;
307  FEDLegacyReadoutMode legacyReadoutMode() const;
308  uint8_t apveAddress() const;
309  uint8_t apvAddressErrorRegister() const;
310  bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const;
311  uint8_t feEnableRegister() const;
312  bool feEnabled(const uint8_t internalFEUnitNum) const;
313  uint8_t feOverflowRegister() const;
314  bool feOverflow(const uint8_t internalFEUnitNum) const;
315  uint16_t fedStatusRegisterWord() const;
316  FEDStatusRegister fedStatusRegister() const;
317  void print(std::ostream& os) const;
318  //used by digi2Raw
319  //returns ordered buffer (ie this may need to be swapped to get original order)
320  const uint8_t* data() const;
321  bool wasSwapped() const;
322  TrackerSpecialHeader& setBufferFormat(const FEDBufferFormat newBufferFormat);
323  TrackerSpecialHeader& setHeaderType(const FEDHeaderType headerType);
324  TrackerSpecialHeader& setReadoutMode(const FEDReadoutMode readoutMode);
325  TrackerSpecialHeader& setAPVEAddress(const uint8_t address);
326  TrackerSpecialHeader& setAPVEAddressErrorRegister(const uint8_t addressErrorRegister);
327  TrackerSpecialHeader& setAPVAddressErrorForFEUnit(const uint8_t internalFEUnitNum, const bool error);
328  TrackerSpecialHeader& setFEEnableRegister(const uint8_t feEnableRegister);
329  TrackerSpecialHeader& setFEEnableForFEUnit(const uint8_t internalFEUnitNum, const bool enabled);
330  TrackerSpecialHeader& setFEOverflowRegister(const uint8_t feOverflowRegister);
331  TrackerSpecialHeader& setFEOverflowForFEUnit(const uint8_t internalFEUnitNum, const bool overflow);
332  TrackerSpecialHeader& setFEDStatusRegister(const FEDStatusRegister fedStatusRegister);
333  TrackerSpecialHeader(const FEDBufferFormat bufferFormat,
334  const FEDReadoutMode readoutMode,
335  const FEDHeaderType headerType,
336  const uint8_t address = 0x00,
337  const uint8_t addressErrorRegister = 0x00,
338  const uint8_t feEnableRegister = 0xFF,
339  const uint8_t feOverflowRegister = 0x00,
340  const FEDStatusRegister fedStatusRegister = FEDStatusRegister());
341 
342  private:
343  void setBufferFormatByte(const FEDBufferFormat newBufferFormat);
344  void setHeaderTypeNibble(const uint8_t value);
345  void setReadoutModeBits(const uint8_t value);
347  FEDSTATUS = 0,
348  FEOVERFLOW = 2,
349  FEENABLE = 3,
350  ADDRESSERROR = 4,
351  APVEADDRESS = 5,
352  BUFFERTYPE = 6,
353  BUFFERFORMAT = 7
354  };
355  //copy of header, 32 bit word swapped if needed
356  uint8_t specialHeader_[8];
357  //was the header word swapped wrt order in buffer?
359  };
360 
362  public:
363  FEDBackendStatusRegister(const uint32_t backendStatusRegister);
364  bool internalFreezeFlag() const;
365  bool slinkDownFlag() const;
366  bool slinkFullFlag() const;
367  bool backpressureFlag() const;
368  bool ttcReadyFlag() const;
369  bool trackerHeaderMonitorDataReadyFlag() const;
370  FEDBufferState qdrMemoryState() const;
371  FEDBufferState frameAddressFIFOState() const;
372  FEDBufferState totalLengthFIFOState() const;
373  FEDBufferState trackerHeaderFIFOState() const;
374  FEDBufferState l1aBxFIFOState() const;
375  FEDBufferState feEventLengthFIFOState() const;
376  FEDBufferState feFPGABufferState() const;
377  void print(std::ostream& os) const;
378  void printFlags(std::ostream& os) const;
379  operator uint32_t() const;
380  //used by digi2Raw
381  FEDBackendStatusRegister& setInternalFreezeFlag(const bool bitSet);
382  FEDBackendStatusRegister& setSLinkDownFlag(const bool bitSet);
383  FEDBackendStatusRegister& setSLinkFullFlag(const bool bitSet);
384  FEDBackendStatusRegister& setBackpressureFlag(const bool bitSet);
385  FEDBackendStatusRegister& setTTCReadyFlag(const bool bitSet);
386  FEDBackendStatusRegister& setTrackerHeaderMonitorDataReadyFlag(const bool bitSet);
387  FEDBackendStatusRegister& setQDRMemoryState(const FEDBufferState state);
388  FEDBackendStatusRegister& setFrameAddressFIFOState(const FEDBufferState state);
389  FEDBackendStatusRegister& setTotalLengthFIFOState(const FEDBufferState state);
390  FEDBackendStatusRegister& setTrackerHeaderFIFOState(const FEDBufferState state);
391  FEDBackendStatusRegister& setL1ABXFIFOState(const FEDBufferState state);
392  FEDBackendStatusRegister& setFEEventLengthFIFOState(const FEDBufferState state);
393  FEDBackendStatusRegister& setFEFPGABufferState(const FEDBufferState state);
394  FEDBackendStatusRegister(const FEDBufferState qdrMemoryBufferState = BUFFER_STATE_UNSET,
395  const FEDBufferState frameAddressFIFOBufferState = BUFFER_STATE_UNSET,
396  const FEDBufferState totalLengthFIFOBufferState = BUFFER_STATE_UNSET,
397  const FEDBufferState trackerHeaderFIFOBufferState = BUFFER_STATE_UNSET,
398  const FEDBufferState l1aBxFIFOBufferState = BUFFER_STATE_UNSET,
399  const FEDBufferState feEventLengthFIFOBufferState = BUFFER_STATE_UNSET,
400  const FEDBufferState feFPGABufferState = BUFFER_STATE_UNSET,
401  const bool backpressure = false,
402  const bool slinkFull = false,
403  const bool slinkDown = false,
404  const bool internalFreeze = false,
405  const bool trackerHeaderMonitorDataReady = false,
406  const bool ttcReady = true);
407 
408  private:
409  bool getBit(const uint8_t num) const;
410  void setBit(const uint8_t num, const bool bitSet);
411  //get the state of the buffer in position 'bufferPosition'
412  FEDBufferState getBufferState(const uint8_t bufferPosition) const;
413  //set the state of the buffer in position 'bufferPosition' to state 'state'
414  void setBufferSate(const uint8_t bufferPosition, const FEDBufferState state);
415  void printFlagsForBuffer(const FEDBufferState bufferState, const std::string name, std::ostream& os) const;
416  //constants marking order of flags in buffer
417  //eg. bit offset for L1A/BX FIFO Partial full flag is STATE_OFFSET_PARTIAL_FULL+BUFFER_POSITION_L1ABX_FIFO
418  // bit offset for total length FIFO empty flag is STATE_OFFSET_EMPTY+BUFFER_POSITION_TOTAL_LENGTH_FIFO
419  //see BE FPGA technical description
421  BUFFER_POSITION_QDR_MEMORY = 0,
422  BUFFER_POSITION_FRAME_ADDRESS_FIFO = 1,
423  BUFFER_POSITION_TOTAL_LENGTH_FIFO = 2,
424  BUFFER_POSITION_TRACKER_HEADER_FIFO = 3,
425  BUFFER_POSITION_L1ABX_FIFO = 4,
426  BUFFER_POSITION_FE_EVENT_LENGTH_FIFO = 5,
427  BUFFER_POSITION_FE_FPGA_BUFFER = 6
428  };
429  enum stateOffsets { STATE_OFFSET_FULL = 8, STATE_OFFSET_PARTIAL_FULL = 16, STATE_OFFSET_EMPTY = 24 };
430  uint32_t data_;
431  };
432 
433  class FEDFEHeader {
434  public:
435  //factory function: allocates new FEDFEHeader derrivative of appropriate type
436  static std::unique_ptr<FEDFEHeader> newFEHeader(const FEDHeaderType headerType, const uint8_t* headerBuffer);
437  //used by digi2Raw
438  static std::unique_ptr<FEDFEHeader> newFEHeader(const FEDHeaderType headerType);
439  //create a buffer to use with digi2Raw
440  static std::unique_ptr<FEDFEHeader> newFEFakeHeader(const FEDHeaderType headerType);
441  virtual ~FEDFEHeader();
442  //the length of the header
443  virtual size_t lengthInBytes() const = 0;
444  //check that there are no errors indicated in which ever error bits are available in the header
445  //check bits for both APVs on a channel
446  bool checkChannelStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
447  virtual bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const = 0;
448  //check bits for one APV
449  bool checkStatusBits(const uint8_t internalFEUnitNum,
450  const uint8_t internalFEUnitChannelNum,
451  const uint8_t apvNum) const;
452  virtual bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const = 0;
453  virtual void print(std::ostream& os) const = 0;
454  virtual FEDFEHeader* clone() const = 0;
455  //used by digi2Raw
456  virtual const uint8_t* data() const = 0;
457  virtual void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status) = 0;
458  virtual void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address) = 0;
459  virtual void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister) = 0;
460  virtual void setDAQRegister(const uint32_t daqRegister) = 0;
461  virtual void setDAQRegister2(const uint32_t daqRegister2) = 0;
462  virtual void set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister) = 0;
463  virtual void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length) = 0;
464  void setChannelStatus(const uint8_t internalFEUnitNum,
465  const uint8_t internalFEUnitChannelNum,
466  const FEDChannelStatus status);
467  };
468 
469  class FEDAPVErrorHeader final : public FEDFEHeader {
470  public:
471  explicit FEDAPVErrorHeader(const uint8_t* headerBuffer);
472  ~FEDAPVErrorHeader() override;
473  size_t lengthInBytes() const override;
474  bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const override;
475  bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const override;
476  void print(std::ostream& os) const override;
477  FEDAPVErrorHeader* clone() const override;
478  //used by digi2Raw
479  const uint8_t* data() const override;
480  FEDAPVErrorHeader& setAPVStatusBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool apvGood);
481  FEDAPVErrorHeader& setAPVStatusBit(const uint8_t internalFEUnitNum,
482  const uint8_t internalFEUnitChannelNum,
483  const uint8_t apvNum,
484  const bool apvGood);
485  FEDAPVErrorHeader(const std::vector<bool>& apvsGood = std::vector<bool>(APVS_PER_FED, true));
486  //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
487  //if the values need to be set.
488  void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status) override;
489  void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address) override;
490  void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister) override;
491  void setDAQRegister(const uint32_t daqRegister) override;
492  void setDAQRegister2(const uint32_t daqRegister2) override;
493  void set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister) override;
494  void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length) override;
495 
496  private:
497  static const size_t APV_ERROR_HEADER_SIZE_IN_64BIT_WORDS = 3;
498  static const size_t APV_ERROR_HEADER_SIZE_IN_BYTES = APV_ERROR_HEADER_SIZE_IN_64BIT_WORDS * 8;
499  uint8_t header_[APV_ERROR_HEADER_SIZE_IN_BYTES];
500  };
501 
502  class FEDFullDebugHeader final : public FEDFEHeader {
503  public:
504  explicit FEDFullDebugHeader(const uint8_t* headerBuffer);
505  ~FEDFullDebugHeader() override;
506  size_t lengthInBytes() const override;
507  bool checkChannelStatusBits(const uint8_t internalFEDChannelNum) const override;
508  bool checkStatusBits(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const override;
509  void print(std::ostream& os) const override;
510  FEDFullDebugHeader* clone() const override;
511 
512  uint8_t feUnitMajorityAddress(const uint8_t internalFEUnitNum) const;
513  FEDBackendStatusRegister beStatusRegister() const;
514  uint32_t daqRegister() const;
515  uint32_t daqRegister2() const;
516  uint16_t feUnitLength(const uint8_t internalFEUnitNum) const;
517  bool fePresent(const uint8_t internalFEUnitNum) const;
518 
519  FEDChannelStatus getChannelStatus(const uint8_t internalFEDChannelNum) const;
520  FEDChannelStatus getChannelStatus(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
521 
522  //These methods return true if there was an error of the appropriate type (ie if the error bit is 0).
523  //They return false if the error could not occur due to a more general error.
524  //was channel unlocked
525  bool unlocked(const uint8_t internalFEDChannelNum) const;
526  bool unlocked(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
527  //was channel out of sync if it was unlocked
528  bool outOfSync(const uint8_t internalFEDChannelNum) const;
529  bool outOfSync(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const;
530  //was there an internal APV error if it was in sync
531  bool apvError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
532  bool apvError(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum, const uint8_t apvNum) const;
533  //was the APV address wrong if it was in sync (does not depend on APV internal error bit)
534  bool apvAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
535  bool apvAddressError(const uint8_t internalFEUnitNum,
536  const uint8_t internalFEUnitChannelNum,
537  const uint8_t apvNum) const;
538 
539  //used by digi2Raw
540  const uint8_t* data() const override;
541  void setChannelStatus(const uint8_t internalFEDChannelNum, const FEDChannelStatus status) override;
542  void setFEUnitMajorityAddress(const uint8_t internalFEUnitNum, const uint8_t address) override;
543  void setBEStatusRegister(const FEDBackendStatusRegister beStatusRegister) override;
544  void setDAQRegister(const uint32_t daqRegister) override;
545  void setDAQRegister2(const uint32_t daqRegister2) override;
546  void set32BitReservedRegister(const uint8_t internalFEUnitNum, const uint32_t reservedRegister) override;
547  void setFEUnitLength(const uint8_t internalFEUnitNum, const uint16_t length) override;
548  static uint32_t get32BitWordFrom(const uint8_t* startOfWord);
549  const uint8_t* feWord(const uint8_t internalFEUnitNum) const;
550  uint8_t* feWord(const uint8_t internalFEUnitNum);
551  FEDFullDebugHeader(const std::vector<uint16_t>& feUnitLengths = std::vector<uint16_t>(FEUNITS_PER_FED, 0),
552  const std::vector<uint8_t>& feMajorityAddresses = std::vector<uint8_t>(FEUNITS_PER_FED, 0),
553  const std::vector<FEDChannelStatus>& channelStatus =
554  std::vector<FEDChannelStatus>(FEDCH_PER_FED, CHANNEL_STATUS_NO_PROBLEMS),
555  const FEDBackendStatusRegister beStatusRegister = FEDBackendStatusRegister(),
556  const uint32_t daqRegister = 0,
557  const uint32_t daqRegister2 = 0);
558 
559  private:
560  bool getBit(const uint8_t internalFEDChannelNum, const uint8_t bit) const;
561  static void set32BitWordAt(uint8_t* startOfWord, const uint32_t value);
562  void setBit(const uint8_t internalFEDChannelNum, const uint8_t bit, const bool value);
563 
564  //These methods return true if there was an error of the appropriate type (ie if the error bit is 0).
565  //They ignore any previous errors which make the status bits meaningless and return the value of the bit anyway.
566  //In general, the methods above which only return an error for the likely cause are more useful.
567  bool unlockedFromBit(const uint8_t internalFEDChannelNum) const;
568  bool outOfSyncFromBit(const uint8_t internalFEDChannelNum) const;
569  bool apvErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
570  bool apvAddressErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const;
571 
572  //following methods set the bits to 1 (no error) if value is false
573  void setUnlocked(const uint8_t internalFEDChannelNum, const bool value);
574  void setOutOfSync(const uint8_t internalFEDChannelNum, const bool value);
575  void setAPVAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value);
576  void setAPVError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value);
577  static const size_t FULL_DEBUG_HEADER_SIZE_IN_64BIT_WORDS = FEUNITS_PER_FED * 2;
578  static const size_t FULL_DEBUG_HEADER_SIZE_IN_BYTES = FULL_DEBUG_HEADER_SIZE_IN_64BIT_WORDS * 8;
579  uint8_t header_[FULL_DEBUG_HEADER_SIZE_IN_BYTES];
580  };
581 
582  //holds information about position of a channel in the buffer for use by unpacker
583  class FEDChannel {
584  public:
585  FEDChannel(const uint8_t* const data, const size_t offset, const uint16_t length);
586  //gets length from first 2 bytes (assuming normal FED channel)
587  FEDChannel(const uint8_t* const data, const size_t offset);
588  uint16_t length() const;
589  const uint8_t* data() const;
590  size_t offset() const;
591  uint16_t cmMedian(const uint8_t apvIndex) const;
592  //third byte of channel data for normal FED channels
593  uint8_t packetCode() const;
594 
595  private:
596  friend class FEDBuffer;
597  const uint8_t* data_;
598  size_t offset_;
599  uint16_t length_;
600  };
601 
602  //base class for sistrip FED buffers which have a DAQ header/trailer and tracker special header
604  public:
605  FEDBufferBase(const uint8_t* fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat = false);
606  virtual ~FEDBufferBase();
607  //dump buffer to stream
608  void dump(std::ostream& os) const;
609  //dump original buffer before word swapping
610  void dumpOriginalBuffer(std::ostream& os) const;
611  virtual void print(std::ostream& os) const;
612  //calculate the CRC from the buffer
613  uint16_t calcCRC() const;
614 
615  //methods to get parts of the buffer
616  FEDDAQHeader daqHeader() const;
617  FEDDAQTrailer daqTrailer() const;
618  size_t bufferSize() const;
619  TrackerSpecialHeader trackerSpecialHeader() const;
620  //methods to get info from DAQ header
621  FEDDAQEventType daqEventType() const;
622  uint32_t daqLvl1ID() const;
623  uint16_t daqBXID() const;
624  uint16_t daqSourceID() const;
625  uint16_t sourceID() const;
626  //methods to get info from DAQ trailer
627  uint32_t daqEventLengthIn64bitWords() const;
628  uint32_t daqEventLengthInBytes() const;
629  uint16_t daqCRC() const;
630  FEDTTSBits daqTTSState() const;
631  //methods to get info from the tracker special header
632  FEDBufferFormat bufferFormat() const;
633  FEDHeaderType headerType() const;
634  FEDLegacyReadoutMode legacyReadoutMode() const;
635  FEDReadoutMode readoutMode() const;
636  uint8_t packetCode(bool legacy = false, const uint8_t internalFEDChannelNum = 0) const;
637  uint8_t apveAddress() const;
638  bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const;
639  bool feEnabled(const uint8_t internalFEUnitNum) const;
640  uint8_t nFEUnitsEnabled() const;
641  bool feOverflow(const uint8_t internalFEUnitNum) const;
642  FEDStatusRegister fedStatusRegister() const;
643 
644  //check that channel has no errors
645  virtual bool channelGood(const uint8_t internalFEDChannelNum) const;
646  bool channelGood(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const;
647  //return channel object for channel
648  const FEDChannel& channel(const uint8_t internalFEDChannelNum) const;
649  const FEDChannel& channel(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const;
650 
651  //summary checks
652  //check that tracker special header is valid (does not check for FE unit errors indicated in special header)
653  bool doTrackerSpecialHeaderChecks() const;
654  //check for errors in DAQ heaqder and trailer (not including bad CRC)
655  bool doDAQHeaderAndTrailerChecks() const;
656  //do both
657  virtual bool doChecks() const;
658  //print the result of all detailed checks
659  virtual std::string checkSummary() const;
660 
661  //detailed checks
662  bool checkCRC() const;
663  bool checkMajorityAddresses() const;
664  //methods to check tracker special header
665  bool checkBufferFormat() const;
666  bool checkHeaderType() const;
667  bool checkReadoutMode() const;
668  bool checkAPVEAddressValid() const;
669  bool checkNoFEOverflows() const;
670  //methods to check daq header and trailer
671  bool checkNoSlinkCRCError() const;
672  bool checkNoSLinkTransmissionError() const;
673  bool checkSourceIDs() const;
674  bool checkNoUnexpectedSourceID() const;
675  bool checkNoExtraHeadersOrTrailers() const;
676  bool checkLengthFromTrailer() const;
677 
678  protected:
679  const uint8_t* getPointerToDataAfterTrackerSpecialHeader() const;
680  const uint8_t* getPointerToByteAfterEndOfPayload() const;
681  FEDBufferBase(const uint8_t* fedBuffer,
682  const size_t fedBufferSize,
683  const bool allowUnrecognizedFormat,
684  const bool fillChannelVector);
685  std::vector<FEDChannel> channels_;
686 
687  private:
688  void init(const uint8_t* fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat);
689  const uint8_t* originalBuffer_;
690  const uint8_t* orderedBuffer_;
691  const size_t bufferSize_;
695  };
696 
697  //
698  // Inline function definitions
699  //
700 
701  inline std::ostream& operator<<(std::ostream& os, const FEDBufferBase& obj) {
702  obj.print(os);
703  os << obj.checkSummary();
704  return os;
705  }
706 
707  inline uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) {
708  return (internalFEUnitNum * FEDCH_PER_FEUNIT + internalFEUnitChannelNum);
709  }
710 
711  inline std::ostream& operator<<(std::ostream& os, const FEDDAQHeader& obj) {
712  obj.print(os);
713  return os;
714  }
715  inline std::ostream& operator<<(std::ostream& os, const FEDDAQTrailer& obj) {
716  obj.print(os);
717  return os;
718  }
719  inline std::ostream& operator<<(std::ostream& os, const TrackerSpecialHeader& obj) {
720  obj.print(os);
721  return os;
722  }
723  inline std::ostream& operator<<(std::ostream& os, const FEDStatusRegister& obj) {
724  obj.print(os);
725  return os;
726  }
727  inline std::ostream& operator<<(std::ostream& os, const FEDFEHeader& obj) {
728  obj.print(os);
729  return os;
730  }
731 
732  //FEDStripOrdering
733 
734  inline uint8_t FEDStripOrdering::physicalOrderForStripInChannel(const uint8_t readoutOrderStripIndexInChannel) {
735  return physicalOrderForStripInAPV(readoutOrderStripIndexInChannel / 2) +
736  (readoutOrderStripIndexInChannel % 2) * STRIPS_PER_APV;
737  }
738 
739  inline uint8_t FEDStripOrdering::readoutOrderForStripInChannel(const uint8_t physicalOrderStripIndexInChannel) {
740  return (readoutOrderForStripInAPV(physicalOrderStripIndexInChannel % 128) * 2 +
741  (physicalOrderStripIndexInChannel / 128));
742  }
743 
744  inline uint8_t FEDStripOrdering::physicalOrderForStripInAPV(const uint8_t readout_order) {
745  return ((32 * (readout_order % 4)) + (8 * static_cast<uint16_t>(static_cast<float>(readout_order) / 4.0)) -
746  (31 * static_cast<uint16_t>(static_cast<float>(readout_order) / 16.0)));
747  }
748 
749  inline uint8_t FEDStripOrdering::readoutOrderForStripInAPV(const uint8_t physical_order) {
750  return (4 * ((static_cast<uint16_t>((static_cast<float>(physical_order) / 8.0))) % 4) +
751  static_cast<uint16_t>(static_cast<float>(physical_order) / 32.0) + 16 * (physical_order % 8));
752  }
753 
754  //TrackerSpecialHeader
755 
757 
759 
760  inline uint8_t TrackerSpecialHeader::headerTypeNibble() const { return ((specialHeader_[BUFFERTYPE] & 0xF0) >> 4); }
761 
762  inline uint8_t TrackerSpecialHeader::trackerEventTypeNibble() const { return (specialHeader_[BUFFERTYPE] & 0x0F); }
763 
765 
767 
768  inline bool TrackerSpecialHeader::majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const {
769  return (!(readoutMode() == READOUT_MODE_SCOPE) && !((0x1 << internalFEUnitNum) & apvAddressErrorRegister()));
770  }
771 
773 
774  inline bool TrackerSpecialHeader::feEnabled(const uint8_t internalFEUnitNum) const {
775  return ((0x1 << internalFEUnitNum) & feEnableRegister());
776  }
777 
779 
780  inline bool TrackerSpecialHeader::feOverflow(const uint8_t internalFEUnitNum) const {
781  return ((0x1 << internalFEUnitNum) & feOverflowRegister());
782  }
783 
785  //get 16 bits
786  uint16_t statusRegister = ((specialHeader_[(FEDSTATUS + 1)] << 8) | specialHeader_[FEDSTATUS]);
787  return statusRegister;
788  }
789 
792  }
793 
794  inline void TrackerSpecialHeader::print(std::ostream& os) const { printHex(specialHeader_, 8, os); }
795 
796  inline const uint8_t* TrackerSpecialHeader::data() const { return specialHeader_; }
797 
798  inline bool TrackerSpecialHeader::wasSwapped() const { return wordSwapped_; }
799 
801  specialHeader_[BUFFERTYPE] = ((specialHeader_[BUFFERTYPE] & 0x0F) | ((value << 4) & 0xF0));
802  }
803 
804  inline void TrackerSpecialHeader::setReadoutModeBits(const uint8_t value) {
805  specialHeader_[BUFFERTYPE] = ((specialHeader_[BUFFERTYPE] & (~0x0F)) | (value & 0x0F));
806  }
807 
809  specialHeader_[APVEADDRESS] = address;
810  return *this;
811  }
812 
813  inline TrackerSpecialHeader& TrackerSpecialHeader::setAPVEAddressErrorRegister(const uint8_t addressErrorRegister) {
814  specialHeader_[ADDRESSERROR] = addressErrorRegister;
815  return *this;
816  }
817 
820  return *this;
821  }
822 
825  return *this;
826  }
827 
829  specialHeader_[FEDSTATUS] = (static_cast<uint16_t>(fedStatusRegister) & 0x00FF);
830  specialHeader_[FEDSTATUS + 1] = ((static_cast<uint16_t>(fedStatusRegister) & 0xFF00) >> 8);
831  return *this;
832  }
833 
834  //FEDStatusRegister
835 
836  inline FEDStatusRegister::FEDStatusRegister(const uint16_t fedStatusRegister) : data_(fedStatusRegister) {}
837 
838  inline FEDStatusRegister::operator uint16_t() const { return data_; }
839 
840  inline bool FEDStatusRegister::getBit(const uint8_t num) const { return ((0x1 << num) & (data_)); }
841 
842  inline bool FEDStatusRegister::slinkFullFlag() const { return getBit(0); }
843 
845 
846  inline bool FEDStatusRegister::qdrMemoryFullFlag() const { return getBit(2); }
847 
848  inline bool FEDStatusRegister::qdrMemoryPartialFullFlag() const { return getBit(3); }
849 
850  inline bool FEDStatusRegister::qdrMemoryEmptyFlag() const { return getBit(4); }
851 
852  inline bool FEDStatusRegister::l1aBxFIFOFullFlag() const { return getBit(5); }
853 
854  inline bool FEDStatusRegister::l1aBxFIFOPartialFullFlag() const { return getBit(6); }
855 
856  inline bool FEDStatusRegister::l1aBxFIFOEmptyFlag() const { return getBit(7); }
857 
858  inline bool FEDStatusRegister::feDataMissingFlag(const uint8_t internalFEUnitNum) const {
859  return getBit(8 + internalFEUnitNum);
860  }
861 
862  inline void FEDStatusRegister::print(std::ostream& os) const { printHex(&data_, 2, os); }
863 
865  setBit(0, bitSet);
866  return *this;
867  }
868 
870  setBit(1, bitSet);
871  return *this;
872  }
873 
874  inline void FEDStatusRegister::setQDRMemoryFullFlag(const bool bitSet) { setBit(2, bitSet); }
875 
876  inline void FEDStatusRegister::setQDRMemoryPartialFullFlag(const bool bitSet) { setBit(3, bitSet); }
877 
878  inline void FEDStatusRegister::setQDRMemoryEmptyFlag(const bool bitSet) { setBit(4, bitSet); }
879 
880  inline void FEDStatusRegister::setL1ABXFIFOFullFlag(const bool bitSet) { setBit(5, bitSet); }
881 
882  inline void FEDStatusRegister::setL1ABXFIFOPartialFullFlag(const bool bitSet) { setBit(6, bitSet); }
883 
884  inline void FEDStatusRegister::setL1ABXFIFOEmptyFlag(const bool bitSet) { setBit(7, bitSet); }
885 
886  inline FEDStatusRegister::FEDStatusRegister(const FEDBufferState qdrMemoryBufferState,
887  const FEDBufferState l1aBxFIFOBufferState,
888  const bool trackerHeaderMonitorDataReadyFlagSet,
889  const bool slinkFullFlagSet)
890  : data_(0x0000) {
891  setSLinkFullFlag(slinkFullFlagSet);
892  setTrackerHeaderMonitorDataReadyFlag(trackerHeaderMonitorDataReadyFlagSet);
893  setQDRMemoryBufferState(qdrMemoryBufferState);
894  setL1ABXFIFOBufferState(l1aBxFIFOBufferState);
895  }
896 
897  //FEDBackendStatusRegister
898 
899  inline FEDBackendStatusRegister::FEDBackendStatusRegister(const uint32_t backendStatusRegister)
900  : data_(backendStatusRegister) {}
901 
902  inline FEDBackendStatusRegister::operator uint32_t() const { return data_; }
903 
904  inline void FEDBackendStatusRegister::print(std::ostream& os) const { printHex(&data_, 4, os); }
905 
906  inline bool FEDBackendStatusRegister::getBit(const uint8_t num) const { return ((0x1 << num) & (data_)); }
907 
908  inline bool FEDBackendStatusRegister::internalFreezeFlag() const { return getBit(1); }
909 
910  inline bool FEDBackendStatusRegister::slinkDownFlag() const { return getBit(2); }
911 
912  inline bool FEDBackendStatusRegister::slinkFullFlag() const { return getBit(3); }
913 
914  inline bool FEDBackendStatusRegister::backpressureFlag() const { return getBit(4); }
915 
916  inline bool FEDBackendStatusRegister::ttcReadyFlag() const { return getBit(6); }
917 
919 
921  setBit(1, bitSet);
922  return *this;
923  }
924 
926  setBit(2, bitSet);
927  return *this;
928  }
929 
931  setBit(3, bitSet);
932  return *this;
933  }
934 
936  setBit(4, bitSet);
937  return *this;
938  }
939 
941  setBit(6, bitSet);
942  return *this;
943  }
944 
946  setBit(7, bitSet);
947  return *this;
948  }
949 
952  }
953 
956  }
957 
960  }
961 
964  }
965 
968  }
969 
972  }
973 
976  }
977 
980  return *this;
981  }
982 
985  return *this;
986  }
987 
990  return *this;
991  }
992 
995  return *this;
996  }
997 
1000  return *this;
1001  }
1002 
1005  return *this;
1006  }
1007 
1010  return *this;
1011  }
1012 
1013  //FEDFEHeader
1014 
1015  inline std::unique_ptr<FEDFEHeader> FEDFEHeader::newFEHeader(const FEDHeaderType headerType,
1016  const uint8_t* headerBuffer) {
1017  switch (headerType) {
1019  return std::unique_ptr<FEDFEHeader>(new FEDFullDebugHeader(headerBuffer));
1020  case HEADER_TYPE_APV_ERROR:
1021  return std::unique_ptr<FEDFEHeader>(new FEDAPVErrorHeader(headerBuffer));
1022  default:
1023  return std::unique_ptr<FEDFEHeader>();
1024  }
1025  }
1026 
1027  inline std::unique_ptr<FEDFEHeader> FEDFEHeader::newFEHeader(const FEDHeaderType headerType) {
1028  switch (headerType) {
1030  return std::unique_ptr<FEDFEHeader>(new FEDFullDebugHeader());
1031  case HEADER_TYPE_APV_ERROR:
1032  return std::unique_ptr<FEDFEHeader>(new FEDAPVErrorHeader());
1033  default:
1034  return std::unique_ptr<FEDFEHeader>();
1035  }
1036  }
1037 
1038  inline std::unique_ptr<FEDFEHeader> FEDFEHeader::newFEFakeHeader(const FEDHeaderType headerType) {
1039  switch (headerType) {
1041  return std::unique_ptr<FEDFEHeader>(new FEDFullDebugHeader);
1042  case HEADER_TYPE_APV_ERROR:
1043  return std::unique_ptr<FEDFEHeader>(new FEDAPVErrorHeader);
1044  default:
1045  return std::unique_ptr<FEDFEHeader>();
1046  }
1047  }
1048 
1049  inline bool FEDFEHeader::checkChannelStatusBits(const uint8_t internalFEUnitNum,
1050  const uint8_t internalFEUnitChannelNum) const {
1051  return checkChannelStatusBits(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum));
1052  }
1053 
1054  inline bool FEDFEHeader::checkStatusBits(const uint8_t internalFEUnitNum,
1055  const uint8_t internalFEUnitChannelNum,
1056  const uint8_t apvNum) const {
1057  return checkStatusBits(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum), apvNum);
1058  }
1059 
1060  inline void FEDFEHeader::setChannelStatus(const uint8_t internalFEUnitNum,
1061  const uint8_t internalFEUnitChannelNum,
1062  const FEDChannelStatus status) {
1063  this->setChannelStatus(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum), status);
1064  }
1065 
1066  inline FEDAPVErrorHeader::FEDAPVErrorHeader(const uint8_t* headerBuffer) {
1067  memcpy(header_, headerBuffer, APV_ERROR_HEADER_SIZE_IN_BYTES);
1068  }
1069 
1070  inline FEDAPVErrorHeader& FEDAPVErrorHeader::setAPVStatusBit(const uint8_t internalFEUnitNum,
1071  const uint8_t internalFEUnitChannelNum,
1072  const uint8_t apvNum,
1073  const bool apvGood) {
1074  return setAPVStatusBit(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum), apvNum, apvGood);
1075  }
1076 
1077  inline FEDFullDebugHeader::FEDFullDebugHeader(const uint8_t* headerBuffer) {
1078  memcpy(header_, headerBuffer, FULL_DEBUG_HEADER_SIZE_IN_BYTES);
1079  }
1080 
1081  inline uint8_t FEDFullDebugHeader::feUnitMajorityAddress(const uint8_t internalFEUnitNum) const {
1082  return feWord(internalFEUnitNum)[9];
1083  }
1084 
1086  return FEDBackendStatusRegister(get32BitWordFrom(feWord(0) + 10));
1087  }
1088 
1089  inline uint32_t FEDFullDebugHeader::daqRegister() const { return get32BitWordFrom(feWord(7) + 10); }
1090 
1091  inline uint32_t FEDFullDebugHeader::daqRegister2() const { return get32BitWordFrom(feWord(6) + 10); }
1092 
1093  inline uint16_t FEDFullDebugHeader::feUnitLength(const uint8_t internalFEUnitNum) const {
1094  return ((feWord(internalFEUnitNum)[15] << 8) | (feWord(internalFEUnitNum)[14]));
1095  }
1096 
1097  inline bool FEDFullDebugHeader::fePresent(const uint8_t internalFEUnitNum) const {
1098  return (feUnitLength(internalFEUnitNum) != 0);
1099  }
1100 
1101  inline bool FEDFullDebugHeader::unlocked(const uint8_t internalFEDChannelNum) const {
1102  return unlockedFromBit(internalFEDChannelNum);
1103  }
1104 
1105  inline bool FEDFullDebugHeader::unlocked(const uint8_t internalFEUnitNum,
1106  const uint8_t internalFEUnitChannelNum) const {
1107  return unlocked(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum));
1108  }
1109 
1110  inline bool FEDFullDebugHeader::outOfSync(const uint8_t internalFEDChannelNum) const {
1111  return (!unlocked(internalFEDChannelNum) && outOfSyncFromBit(internalFEDChannelNum));
1112  }
1113 
1114  inline bool FEDFullDebugHeader::outOfSync(const uint8_t internalFEUnitNum,
1115  const uint8_t internalFEUnitChannelNum) const {
1116  return outOfSync(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum));
1117  }
1118 
1119  inline bool FEDFullDebugHeader::apvError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const {
1120  return (!unlockedFromBit(internalFEDChannelNum) && !outOfSyncFromBit(internalFEDChannelNum) &&
1121  apvErrorFromBit(internalFEDChannelNum, apvNum));
1122  }
1123 
1124  inline bool FEDFullDebugHeader::apvError(const uint8_t internalFEUnitNum,
1125  const uint8_t internalFEUnitChannelNum,
1126  const uint8_t apvNum) const {
1127  return apvError(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum), apvNum);
1128  }
1129 
1130  inline bool FEDFullDebugHeader::apvAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const {
1131  return (!unlockedFromBit(internalFEDChannelNum) && !outOfSyncFromBit(internalFEDChannelNum) &&
1132  apvAddressErrorFromBit(internalFEDChannelNum, apvNum));
1133  }
1134 
1135  inline bool FEDFullDebugHeader::apvAddressError(const uint8_t internalFEUnitNum,
1136  const uint8_t internalFEUnitChannelNum,
1137  const uint8_t apvNum) const {
1138  return apvAddressError(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum), apvNum);
1139  }
1140 
1141  inline FEDChannelStatus FEDFullDebugHeader::getChannelStatus(const uint8_t internalFEUnitNum,
1142  const uint8_t internalFEUnitChannelNum) const {
1143  return getChannelStatus(internalFEDChannelNum(internalFEUnitNum, internalFEUnitChannelNum));
1144  }
1145 
1147  return !getBit(internalFEDChannelNum, 5);
1148  }
1149 
1151  return !getBit(internalFEDChannelNum, 4);
1152  }
1153 
1154  inline bool FEDFullDebugHeader::apvErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const {
1155  //Discovered March 2012: two bits inverted in firmware. Decided
1156  //to update documentation but keep firmware identical for
1157  //backward compatibility. So status bit order is actually:
1158  //apvErr1 - apvAddrErr0 - apvErr0 - apvAddrErr1 - OOS - unlocked.
1159  //Before, it was: return !getBit(internalFEDChannelNum,0+2*apvNum);
1160 
1161  return !getBit(internalFEDChannelNum, 0 + 2 * (1 - apvNum));
1162  }
1163 
1165  const uint8_t apvNum) const {
1166  return !getBit(internalFEDChannelNum, 1 + 2 * apvNum);
1167  }
1168 
1169  inline bool FEDFullDebugHeader::getBit(const uint8_t internalFEDChannelNum, const uint8_t bit) const {
1170  const uint8_t* pFEWord = feWord(internalFEDChannelNum / FEDCH_PER_FEUNIT);
1171  const uint8_t bitInFeWord = ((FEDCH_PER_FEUNIT - 1) - (internalFEDChannelNum % FEDCH_PER_FEUNIT)) * 6 + bit;
1172  return (pFEWord[bitInFeWord / 8] & (0x1 << (bitInFeWord % 8)));
1173  }
1174 
1175  inline uint32_t FEDFullDebugHeader::get32BitWordFrom(const uint8_t* startOfWord) {
1176  return (startOfWord[0] | (startOfWord[1] << 8) | (startOfWord[2] << 16) | (startOfWord[3] << 24));
1177  }
1178 
1179  inline void FEDFullDebugHeader::set32BitWordAt(uint8_t* startOfWord, const uint32_t value) {
1180  memcpy(startOfWord, &value, 4);
1181  }
1182 
1183  inline const uint8_t* FEDFullDebugHeader::feWord(const uint8_t internalFEUnitNum) const {
1184  return header_ + internalFEUnitNum * 2 * 8;
1185  }
1186 
1187  //re-use const method
1188  inline uint8_t* FEDFullDebugHeader::feWord(const uint8_t internalFEUnitNum) {
1189  return const_cast<uint8_t*>(static_cast<const FEDFullDebugHeader*>(this)->feWord(internalFEUnitNum));
1190  }
1191 
1192  inline void FEDFullDebugHeader::setUnlocked(const uint8_t internalFEDChannelNum, const bool value) {
1193  setBit(internalFEDChannelNum, 5, !value);
1194  }
1195 
1196  inline void FEDFullDebugHeader::setOutOfSync(const uint8_t internalFEDChannelNum, const bool value) {
1197  setBit(internalFEDChannelNum, 4, !value);
1198  }
1199 
1201  const uint8_t apvNum,
1202  const bool value) {
1203  setBit(internalFEDChannelNum, 1 + 2 * apvNum, !value);
1204  }
1205 
1207  const uint8_t apvNum,
1208  const bool value) {
1209  //Discovered March 2012: two bits inverted in firmware. Decided
1210  //to update documentation but keep firmware identical for
1211  //backward compatibility. So status bit order is actually:
1212  //apvErr1 - apvAddrErr0 - apvErr0 - apvAddrErr1 - OOS - unlocked.
1213  //Before, it was: return !getBit(internalFEDChannelNum,0+2*apvNum);
1214 
1215  setBit(internalFEDChannelNum, 0 + 2 * (1 - apvNum), !value);
1216  }
1217 
1218  //FEDDAQHeader
1219 
1220  inline FEDDAQHeader::FEDDAQHeader(const uint8_t* header) { memcpy(header_, header, 8); }
1221 
1222  inline uint8_t FEDDAQHeader::boeNibble() const { return ((header_[7] & 0xF0) >> 4); }
1223 
1224  inline uint8_t FEDDAQHeader::eventTypeNibble() const { return (header_[7] & 0x0F); }
1225 
1226  inline uint32_t FEDDAQHeader::l1ID() const { return (header_[4] | (header_[5] << 8) | (header_[6] << 16)); }
1227 
1228  inline uint16_t FEDDAQHeader::bxID() const { return ((header_[3] << 4) | ((header_[2] & 0xF0) >> 4)); }
1229 
1230  inline uint16_t FEDDAQHeader::sourceID() const { return (((header_[2] & 0x0F) << 8) | header_[1]); }
1231 
1232  inline uint8_t FEDDAQHeader::version() const { return ((header_[0] & 0xF0) >> 4); }
1233 
1234  inline bool FEDDAQHeader::hBit() const { return (header_[0] & 0x8); }
1235 
1236  inline bool FEDDAQHeader::lastHeader() const { return !hBit(); }
1237 
1238  inline const uint8_t* FEDDAQHeader::data() const { return header_; }
1239 
1240  inline void FEDDAQHeader::print(std::ostream& os) const { printHex(header_, 8, os); }
1241 
1242  //FEDDAQTrailer
1243 
1244  inline FEDDAQTrailer::FEDDAQTrailer(const uint8_t* trailer) { memcpy(trailer_, trailer, 8); }
1245 
1246  inline uint8_t FEDDAQTrailer::eoeNibble() const { return ((trailer_[7] & 0xF0) >> 4); }
1247 
1248  inline uint32_t FEDDAQTrailer::eventLengthIn64BitWords() const {
1249  return (trailer_[4] | (trailer_[5] << 8) | (trailer_[6] << 16));
1250  }
1251 
1252  inline uint32_t FEDDAQTrailer::eventLengthInBytes() const { return eventLengthIn64BitWords() * 8; }
1253 
1254  inline uint16_t FEDDAQTrailer::crc() const { return (trailer_[2] | (trailer_[3] << 8)); }
1255 
1256  inline bool FEDDAQTrailer::cBit() const { return (trailer_[1] & 0x80); }
1257 
1258  inline bool FEDDAQTrailer::fBit() const { return (trailer_[1] & 0x40); }
1259 
1260  inline uint8_t FEDDAQTrailer::eventStatusNibble() const { return (trailer_[1] & 0x0F); }
1261 
1262  inline uint8_t FEDDAQTrailer::ttsNibble() const { return ((trailer_[0] & 0xF0) >> 4); }
1263 
1264  inline bool FEDDAQTrailer::tBit() const { return (trailer_[0] & 0x08); }
1265 
1266  inline bool FEDDAQTrailer::rBit() const { return (trailer_[0] & 0x04); }
1267 
1268  inline void FEDDAQTrailer::print(std::ostream& os) const { printHex(trailer_, 8, os); }
1269 
1270  inline const uint8_t* FEDDAQTrailer::data() const { return trailer_; }
1271 
1272  //FEDBufferBase
1273 
1274  inline void FEDBufferBase::dump(std::ostream& os) const { printHex(orderedBuffer_, bufferSize_, os); }
1275 
1276  inline void FEDBufferBase::dumpOriginalBuffer(std::ostream& os) const { printHex(originalBuffer_, bufferSize_, os); }
1277 
1278  inline uint16_t FEDBufferBase::calcCRC() const { return calculateFEDBufferCRC(orderedBuffer_, bufferSize_); }
1279 
1280  inline FEDDAQHeader FEDBufferBase::daqHeader() const { return daqHeader_; }
1281 
1282  inline FEDDAQTrailer FEDBufferBase::daqTrailer() const { return daqTrailer_; }
1283 
1284  inline size_t FEDBufferBase::bufferSize() const { return bufferSize_; }
1285 
1286  inline TrackerSpecialHeader FEDBufferBase::trackerSpecialHeader() const { return specialHeader_; }
1287 
1288  inline FEDDAQEventType FEDBufferBase::daqEventType() const { return daqHeader_.eventType(); }
1289 
1290  inline uint32_t FEDBufferBase::daqLvl1ID() const { return daqHeader_.l1ID(); }
1291 
1292  inline uint16_t FEDBufferBase::daqBXID() const { return daqHeader_.bxID(); }
1293 
1294  inline uint16_t FEDBufferBase::daqSourceID() const { return daqHeader_.sourceID(); }
1295 
1296  inline uint32_t FEDBufferBase::daqEventLengthIn64bitWords() const { return daqTrailer_.eventLengthIn64BitWords(); }
1297 
1298  inline uint32_t FEDBufferBase::daqEventLengthInBytes() const { return daqTrailer_.eventLengthInBytes(); }
1299 
1300  inline uint16_t FEDBufferBase::daqCRC() const { return daqTrailer_.crc(); }
1301 
1302  inline FEDTTSBits FEDBufferBase::daqTTSState() const { return daqTrailer_.ttsBits(); }
1303 
1304  inline FEDBufferFormat FEDBufferBase::bufferFormat() const { return specialHeader_.bufferFormat(); }
1305 
1306  inline FEDHeaderType FEDBufferBase::headerType() const { return specialHeader_.headerType(); }
1307 
1308  inline FEDLegacyReadoutMode FEDBufferBase::legacyReadoutMode() const { return specialHeader_.legacyReadoutMode(); }
1309 
1310  inline FEDReadoutMode FEDBufferBase::readoutMode() const { return specialHeader_.readoutMode(); }
1311 
1312  inline uint8_t FEDBufferBase::packetCode(bool legacy, const uint8_t internalFEDChannelNum) const {
1313  if (legacy) {
1314  FEDLegacyReadoutMode mode = legacyReadoutMode();
1315  switch (mode) {
1317  return PACKET_CODE_SCOPE;
1320  return PACKET_CODE_VIRGIN_RAW;
1323  return PACKET_CODE_PROC_RAW;
1332  default:
1333  return 0;
1334  }
1335  } else {
1336  FEDReadoutMode mode = readoutMode();
1337  switch (mode) {
1338  case READOUT_MODE_SCOPE:
1339  return PACKET_CODE_SCOPE;
1341  return channel(internalFEDChannelNum).packetCode();
1342  case READOUT_MODE_PROC_RAW:
1343  return PACKET_CODE_PROC_RAW;
1345  return channel(internalFEDChannelNum).packetCode();
1355  case READOUT_MODE_SPY:
1356  case READOUT_MODE_INVALID:
1357  default:
1358  return 0;
1359  }
1360  }
1361  }
1362 
1363  inline uint8_t FEDBufferBase::apveAddress() const { return specialHeader_.apveAddress(); }
1364 
1365  inline bool FEDBufferBase::majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const {
1366  return (specialHeader_.majorityAddressErrorForFEUnit(internalFEUnitNum) && (specialHeader_.apveAddress() != 0x00));
1367  }
1368 
1369  inline bool FEDBufferBase::feEnabled(const uint8_t internalFEUnitNum) const {
1370  return specialHeader_.feEnabled(internalFEUnitNum);
1371  }
1372 
1373  inline bool FEDBufferBase::feOverflow(const uint8_t internalFEUnitNum) const {
1374  return specialHeader_.feOverflow(internalFEUnitNum);
1375  }
1376 
1377  inline FEDStatusRegister FEDBufferBase::fedStatusRegister() const { return specialHeader_.fedStatusRegister(); }
1378 
1379  inline bool FEDBufferBase::channelGood(const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const {
1380  return channelGood(internalFEDChannelNum(internalFEUnitNum, internalChannelNum));
1381  }
1382 
1383  inline const FEDChannel& FEDBufferBase::channel(const uint8_t internalFEDChannelNum) const {
1384  return channels_[internalFEDChannelNum];
1385  }
1386 
1387  inline const FEDChannel& FEDBufferBase::channel(const uint8_t internalFEUnitNum,
1388  const uint8_t internalChannelNum) const {
1389  return channel(internalFEDChannelNum(internalFEUnitNum, internalChannelNum));
1390  }
1391 
1393  return (checkBufferFormat() && checkHeaderType() && checkReadoutMode() &&
1394  //checkAPVEAddressValid() &&
1395  checkNoFEOverflows());
1396  }
1397 
1399  return (checkNoSLinkTransmissionError() && checkSourceIDs() && checkNoUnexpectedSourceID() &&
1400  checkNoExtraHeadersOrTrailers() && checkLengthFromTrailer());
1401  }
1402 
1403  inline bool FEDBufferBase::checkCRC() const { return (checkNoSlinkCRCError() && (calcCRC() == daqCRC())); }
1404 
1405  inline bool FEDBufferBase::checkBufferFormat() const { return (bufferFormat() != BUFFER_FORMAT_INVALID); }
1406 
1407  inline bool FEDBufferBase::checkHeaderType() const { return (headerType() != HEADER_TYPE_INVALID); }
1408 
1409  inline bool FEDBufferBase::checkReadoutMode() const { return (readoutMode() != READOUT_MODE_INVALID); }
1410 
1411  inline bool FEDBufferBase::checkAPVEAddressValid() const { return (apveAddress() <= APV_MAX_ADDRESS); }
1412 
1413  inline bool FEDBufferBase::checkNoFEOverflows() const { return !specialHeader_.feOverflowRegister(); }
1414 
1415  inline bool FEDBufferBase::checkNoSlinkCRCError() const { return !daqTrailer_.slinkCRCError(); }
1416 
1417  inline bool FEDBufferBase::checkNoSLinkTransmissionError() const { return !daqTrailer_.slinkTransmissionError(); }
1418 
1419  inline bool FEDBufferBase::checkNoUnexpectedSourceID() const { return !daqTrailer_.badSourceID(); }
1420 
1422  return ((daqHeader_.boeNibble() == 0x5) && (daqTrailer_.eoeNibble() == 0xA));
1423  }
1424 
1425  inline bool FEDBufferBase::checkLengthFromTrailer() const { return (bufferSize() == daqEventLengthInBytes()); }
1426 
1427  inline const uint8_t* FEDBufferBase::getPointerToDataAfterTrackerSpecialHeader() const { return orderedBuffer_ + 16; }
1428 
1430  return orderedBuffer_ + bufferSize_ - 8;
1431  }
1432 
1433  //FEDChannel
1434 
1435  inline FEDChannel::FEDChannel(const uint8_t* const data, const size_t offset) : data_(data), offset_(offset) {
1436  length_ = (data_[(offset_) ^ 7] + (data_[(offset_ + 1) ^ 7] << 8));
1437  }
1438 
1439  inline FEDChannel::FEDChannel(const uint8_t* const data, const size_t offset, const uint16_t length)
1440  : data_(data), offset_(offset), length_(length) {}
1441 
1442  inline uint16_t FEDChannel::length() const { return length_; }
1443 
1444  inline uint8_t FEDChannel::packetCode() const { return data_[(offset_ + 2) ^ 7]; }
1445 
1446  inline const uint8_t* FEDChannel::data() const { return data_; }
1447 
1448  inline size_t FEDChannel::offset() const { return offset_; }
1449 
1450 } // namespace sistrip
1451 
1452 #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
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_BOTBOT
bool feDataMissingFlag(const uint8_t internalFEUnitNum) 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)
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
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)
void print(std::ostream &os) const
static std::unique_ptr< FEDFEHeader > newFEHeader(const FEDHeaderType headerType, const uint8_t *headerBuffer)
static const uint8_t PACKET_CODE_PROC_RAW10
const uint8_t * feWord(const uint8_t internalFEUnitNum) const
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)
int init
Definition: HydjetWrapper.h:64
void setAPVError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value)
FEDStatusRegister & setSLinkFullFlag(const bool bitSet)
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
FEDStatusRegister fedStatusRegister() const
virtual void print(std::ostream &os) const =0
void print(std::ostream &os) const
TrackerSpecialHeader & setAPVEAddress(const uint8_t address)
const uint8_t * getPointerToDataAfterTrackerSpecialHeader() const
FEDHeaderType fedHeaderTypeFromString(const std::string &headerTypeString)
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)
uint8_t packetCodeFromString(const std::string &packetCodeString, FEDReadoutMode mode)
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
std::ostream & operator<<(std::ostream &os, const FEDBufferFormat &value)
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)
sistrip classes
FEDDAQEventType daqEventType() const
void dumpOriginalBuffer(std::ostream &os) const
FEDReadoutMode fedReadoutModeFromString(const std::string &readoutModeString)
bool feOverflow(const uint8_t internalFEUnitNum) const
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_TOPBOT
static uint8_t readoutOrderForStripInChannel(const uint8_t physicalOrderStripIndexInChannel)
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED10
FEDBackendStatusRegister(const uint32_t backendStatusRegister)
static const uint8_t PACKET_CODE_VIRGIN_RAW10
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
FEDBackendStatusRegister & setTotalLengthFIFOState(const FEDBufferState state)
bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
void setUnlocked(const uint8_t internalFEDChannelNum, const bool value)
FEDBackendStatusRegister & setTTCReadyFlag(const bool bitSet)
TrackerSpecialHeader & setAPVEAddressErrorRegister(const uint8_t addressErrorRegister)
TrackerSpecialHeader & setFEDStatusRegister(const FEDStatusRegister fedStatusRegister)
bool apvErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
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
FEDLegacyReadoutMode legacyReadoutMode() const
void setQDRMemoryFullFlag(const bool bitSet)
bool feEnabled(const uint8_t internalFEUnitNum) const
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
FEDHeaderType headerType() const
void setAPVAddressError(const uint8_t internalFEDChannelNum, const uint8_t apvNum, const bool value)
static const uint8_t APV_MAX_ADDRESS
uint8_t packetCode(bool legacy=false, const uint8_t internalFEDChannelNum=0) const
Definition: value.py:1
void setL1ABXFIFOPartialFullFlag(const bool bitSet)
void setHeaderTypeNibble(const uint8_t value)
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 setBit(int &_bitArray, unsigned _iBit)
FEDBufferState getBufferState(const uint8_t bufferPosition) const
bool checkChannelStatusBits(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum) const
void print(std::ostream &os) const
static const uint8_t PACKET_CODE_PROC_RAW
static const uint16_t APVS_PER_FED
static const uint8_t PACKET_CODE_VIRGIN_RAW8_BOTBOT
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
const uint8_t * data() const
TrackerSpecialHeader trackerSpecialHeader() const
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
FEDBackendStatusRegister & setSLinkFullFlag(const bool bitSet)
void print(std::ostream &os) const
uint16_t feUnitLength(const uint8_t internalFEUnitNum) const
void setBufferSate(const uint8_t bufferPosition, const FEDBufferState state)
uint8_t feUnitMajorityAddress(const uint8_t internalFEUnitNum) const
static std::unique_ptr< FEDFEHeader > newFEFakeHeader(const FEDHeaderType headerType)
TrackerSpecialHeader specialHeader_
void calcCRC(long, int &)
Definition: DTCRC.cc:3
FEDChannelStatus getChannelStatus(const uint8_t internalFEDChannelNum) const
virtual void print(std::ostream &os) const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
static const uint16_t FEDCH_PER_FED
static const uint16_t STRIPS_PER_APV
virtual bool channelGood(const uint8_t internalFEDChannelNum) const
FEDBackendStatusRegister & setFEEventLengthFIFOState(const FEDBufferState state)
static const uint8_t PACKET_CODE_PROC_RAW8_BOTBOT
bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
bool apvAddressErrorFromBit(const uint8_t internalFEDChannelNum, const uint8_t apvNum) const
static const uint8_t BUFFER_FORMAT_CODE_OLD
static const uint16_t SCOPE_MODE_MAX_SCOPE_LENGTH
static uint8_t readoutOrderForStripInAPV(const uint8_t physicalOrderStripIndexInAPV)
FEDStatusRegister & setQDRMemoryBufferState(const FEDBufferState state)
static void set32BitWordAt(uint8_t *startOfWord, const uint32_t value)
FEDBackendStatusRegister & setInternalFreezeFlag(const bool bitSet)
static const uint8_t PACKET_CODE_PROC_RAW8_TOPBOT
void setL1ABXFIFOEmptyFlag(const bool bitSet)
bool getBit(int &_bitArray, unsigned _iBit)
FEDBackendStatusRegister & setBackpressureFlag(const bool bitSet)
static const uint8_t PACKET_CODE_VIRGIN_RAW
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)