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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
#include <iomanip>
#include <ostream>
#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDDAQHeader.h"

namespace Phase2Tracker {

  std::ostream& operator<<(std::ostream& os, const FEDDAQEventType& value) {
    switch (value) {
      case DAQ_EVENT_TYPE_PHYSICS:
        os << "Physics trigger";
        break;
      case DAQ_EVENT_TYPE_CALIBRATION:
        os << "Calibration trigger";
        break;
      case DAQ_EVENT_TYPE_TEST:
        os << "Test trigger";
        break;
      case DAQ_EVENT_TYPE_TECHNICAL:
        os << "Technical trigger";
        break;
      case DAQ_EVENT_TYPE_SIMULATED:
        os << "Simulated event";
        break;
      case DAQ_EVENT_TYPE_TRACED:
        os << "Traced event";
        break;
      case DAQ_EVENT_TYPE_ERROR:
        os << "Error";
        break;
      case DAQ_EVENT_TYPE_INVALID:
        os << "Unknown";
        break;
      default:
        os << "Unrecognized";
        os << " (";
        printHexValue(value, os);
        os << ")";
        break;
    }
    return os;
  }

  FEDDAQEventType FEDDAQHeader::eventType() const {
    switch (eventTypeNibble()) {
      case DAQ_EVENT_TYPE_PHYSICS:
      case DAQ_EVENT_TYPE_CALIBRATION:
      case DAQ_EVENT_TYPE_TEST:
      case DAQ_EVENT_TYPE_TECHNICAL:
      case DAQ_EVENT_TYPE_SIMULATED:
      case DAQ_EVENT_TYPE_TRACED:
      case DAQ_EVENT_TYPE_ERROR:
        return FEDDAQEventType(eventTypeNibble());
      default:
        return DAQ_EVENT_TYPE_INVALID;
    }
  }

  void FEDDAQHeader::setEventType(const FEDDAQEventType evtType) { header_[7] = ((header_[7] & 0xF0) | evtType); }

  void FEDDAQHeader::setL1ID(const uint32_t l1ID) {
    header_[4] = (l1ID & 0x000000FF);
    header_[5] = ((l1ID & 0x0000FF00) >> 8);
    header_[6] = ((l1ID & 0x00FF0000) >> 16);
  }

  void FEDDAQHeader::setBXID(const uint16_t bxID) {
    header_[3] = ((bxID & 0x0FF0) >> 4);
    header_[2] = ((header_[2] & 0x0F) | ((bxID & 0x000F) << 4));
  }

  void FEDDAQHeader::setSourceID(const uint16_t sourceID) {
    header_[2] = ((header_[2] & 0xF0) | ((sourceID & 0x0F00) >> 8));
    header_[1] = (sourceID & 0x00FF);
  }

  FEDDAQHeader::FEDDAQHeader(const uint32_t l1ID,
                             const uint16_t bxID,
                             const uint16_t sourceID,
                             const FEDDAQEventType evtType) {
    //clear everything (FOV,H,x,$ all set to 0)
    memset(header_, 0x0, 8);
    //set the BoE nibble to indicate this is the last fragment
    header_[7] = 0x50;
    //set variable fields vith values supplied
    setEventType(evtType);
    setL1ID(l1ID);
    setBXID(bxID);
    setSourceID(sourceID);
  }

}  // namespace Phase2Tracker