Phase2TrackerFEDRawChannelUnpacker

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#ifndef EventFilter_Phase2TrackerRawToDigi_Phase2TrackerPhase2TrackerFEDRawChannelUnpacker_H  // {
#define EventFilter_Phase2TrackerRawToDigi_Phase2TrackerPhase2TrackerFEDRawChannelUnpacker_H

#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDDAQHeader.h"
#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDDAQTrailer.h"
#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDChannel.h"
#include <cstdint>

namespace Phase2Tracker {

  // unpacker for RAW CBC data
  // each bit of the channel is related to one strip
  class Phase2TrackerFEDRawChannelUnpacker {
  public:
    Phase2TrackerFEDRawChannelUnpacker(const Phase2TrackerFEDChannel& channel);
    uint8_t stripIndex() const { return currentStrip_; }
    bool stripOn() const { return bool((currentWord_ >> bitInWord_) & 0x1); }
    bool hasData() const { return valuesLeft_; }
    Phase2TrackerFEDRawChannelUnpacker& operator++();
    Phase2TrackerFEDRawChannelUnpacker& operator++(int);

  private:
    const uint8_t* data_;
    uint8_t currentOffset_;
    uint8_t currentStrip_;
    uint16_t valuesLeft_;
    uint8_t currentWord_;
    uint8_t bitInWord_;
  };  // end of Phase2TrackerFEDRawChannelUnpacker

  inline Phase2TrackerFEDRawChannelUnpacker::Phase2TrackerFEDRawChannelUnpacker(const Phase2TrackerFEDChannel& channel)
      : data_(channel.data()),
        currentOffset_(channel.offset()),
        currentStrip_(0),
        valuesLeft_((channel.length()) * 8 - STRIPS_PADDING),
        currentWord_(channel.data()[currentOffset_ ^ 7]),
        bitInWord_(0) {}

  inline Phase2TrackerFEDRawChannelUnpacker& Phase2TrackerFEDRawChannelUnpacker::operator++() {
    bitInWord_++;
    currentStrip_++;
    if (bitInWord_ > 7) {
      bitInWord_ = 0;
      currentOffset_++;
      currentWord_ = data_[currentOffset_ ^ 7];
    }
    valuesLeft_--;
    return (*this);
  }

  inline Phase2TrackerFEDRawChannelUnpacker& Phase2TrackerFEDRawChannelUnpacker::operator++(int) {
    ++(*this);
    return *this;
  }

}  // namespace Phase2Tracker

#endif  // } end def EventFilter_Phase2TrackerRawToDigi_Phase2TrackerPhase2TrackerFEDRawChannelUnpacker_H