TotemTimingEventInfo

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 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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
#ifndef CTPPSDigi_TotemTimingEventInfo_h
#define CTPPSDigi_TotemTimingEventInfo_h

/** \class TotemTimingEventInfo
 *
 * Event Info Class for CTPPS Timing Detector
 *
 * \author Mirko Berretti
 * \author Nicola Minafra
 * \author Laurent Forthomme
 * \date March 2018
 */

#include <cstdint>
#include <bitset>

class TotemTimingEventInfo {
public:
  TotemTimingEventInfo(const uint8_t hwId,
                       const uint64_t l1ATimestamp,
                       const uint16_t bunchNumber,
                       const uint32_t orbitNumber,
                       const uint32_t eventNumber,
                       const uint16_t channelMap,
                       const uint16_t l1ALatency,
                       const uint8_t numberOfSamples,
                       const uint8_t offsetOfSamples,
                       const uint8_t pllInfo);
  TotemTimingEventInfo();

  /// Digis are equal if they have all the same values, NOT checking the samples!
  bool operator==(const TotemTimingEventInfo& eventInfo) const;

  /// Return digi values number

  /// Hardware Id formatted as: bits 0-3 Channel Id, bit 4 Sampic Id, bits 5-7 Digitizer Board Id
  inline unsigned int hardwareId() const { return hwId_; }

  inline unsigned int hardwareBoardId() const { return (hwId_ & 0xE0) >> 5; }

  inline unsigned int hardwareSampicId() const { return (hwId_ & 0x10) >> 4; }

  inline unsigned int hardwareChannelId() const { return (hwId_ & 0x0F); }

  inline unsigned int l1ATimestamp() const { return l1ATimestamp_; }

  inline unsigned int bunchNumber() const { return bunchNumber_; }

  inline unsigned int orbitNumber() const { return orbitNumber_; }

  inline unsigned int eventNumber() const { return eventNumber_; }

  inline uint16_t channelMap() const { return channelMap_; }

  inline unsigned int l1ALatency() const { return l1ALatency_; }

  inline unsigned int numberOfSamples() const { return numberOfSamples_; }

  inline unsigned int offsetOfSamples() const { return offsetOfSamples_; }

  inline uint8_t pllInfo() const { return pllInfo_; }

  /// Set digi values
  /// Hardware Id formatted as: bits 0-3 Channel Id, bit 4 Sampic Id, bits 5-7 Digitizer Board Id
  inline void setHardwareId(const uint8_t hwId) { hwId_ = hwId; }

  inline void setHardwareBoardId(const unsigned int boardId) {
    hwId_ &= 0x1F;  // Set board bits to 0
    hwId_ |= ((boardId & 0x07) << 5) & 0xE0;
  }

  inline void setHardwareSampicId(const unsigned int sampicId) {
    hwId_ &= 0xEF;  // set Sampic bit to 0
    hwId_ |= ((sampicId & 0x01) << 4) & 0x10;
  }

  inline void setHardwareChannelId(const unsigned int channelId) {
    hwId_ &= 0xF0;  // set Sampic bit to 0
    hwId_ |= (channelId & 0x0F) & 0x0F;
  }

  inline void setL1ATimestamp(const uint64_t l1ATimestamp) { l1ATimestamp_ = l1ATimestamp; }

  inline void setBunchNumber(const uint16_t bunchNumber) { bunchNumber_ = bunchNumber; }

  inline void setOrbitNumber(const uint32_t orbitNumber) { orbitNumber_ = orbitNumber; }

  inline void setEventNumber(const uint32_t eventNumber) { eventNumber_ = eventNumber; }

  inline void setChannelMap(const uint16_t channelMap) { channelMap_ = channelMap; }

  inline void setL1ALatency(const uint16_t l1ALatency) { l1ALatency_ = l1ALatency; }

  inline void setNumberOfSamples(const uint8_t numberOfSamples) { numberOfSamples_ = numberOfSamples; }

  inline void setOffsetOfSamples(const uint8_t offsetOfSamples) { offsetOfSamples_ = offsetOfSamples; }

  inline void setPLLInfo(const uint8_t pllInfo) { pllInfo_ = pllInfo; }

private:
  uint8_t hwId_;
  uint64_t l1ATimestamp_;
  uint16_t bunchNumber_;
  uint32_t orbitNumber_;
  uint32_t eventNumber_;
  uint16_t channelMap_;
  uint16_t l1ALatency_;
  uint8_t numberOfSamples_;
  uint8_t offsetOfSamples_;
  uint8_t pllInfo_;
};

#include <iostream>

inline bool operator<(const TotemTimingEventInfo& one, const TotemTimingEventInfo& other) {
  if (one.eventNumber() < other.eventNumber())
    return true;
  if (one.l1ATimestamp() < other.l1ATimestamp())
    return true;
  if (one.hardwareId() < other.hardwareId())
    return true;
  return false;
}

inline std::ostream& operator<<(std::ostream& o, const TotemTimingEventInfo& digi) {
  std::bitset<16> bitsPLLInfo(digi.pllInfo());
  return o << "TotemTimingEventInfo:"
           << "\nHardwareId:\t" << std::hex << digi.hardwareId() << "\nDB: " << std::dec << digi.hardwareBoardId()
           << "\tSampic: " << digi.hardwareSampicId() << "\tChannel: " << digi.hardwareChannelId()
           << "\nL1A Timestamp:\t" << std::dec << digi.l1ATimestamp() << "\nL1A Latency:\t" << std::dec
           << digi.l1ALatency() << "\nBunch Number:\t" << std::dec << digi.bunchNumber() << "\nOrbit Number:\t"
           << std::dec << digi.orbitNumber() << "\nEvent Number:\t" << std::dec << digi.eventNumber()
           << "\nChannels fired:\t" << std::hex << digi.channelMap() << "\nNumber of Samples:\t" << std::dec
           << digi.numberOfSamples() << "\nOffset of Samples:\t" << std::dec << digi.offsetOfSamples()
           << "\nPLL Info:\t" << bitsPLLInfo.to_string() << std::endl;
}

#endif