CSCALCTDigi

Version

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 139 140 141 142 143 144
#ifndef CSCDigi_CSCALCTDigi_h
#define CSCDigi_CSCALCTDigi_h

/**\class CSCALCTDigi
 *
 * Digi for ALCT trigger primitives.
 *
 *
 * \author N. Terentiev, CMU
 */

#include <cstdint>
#include <iosfwd>
#include <limits>
#include <vector>

class CSCALCTDigi {
public:
  enum class Version { Legacy = 0, Run3 };

  typedef std::vector<std::vector<uint16_t>> WireContainer;

  /// Constructors
  CSCALCTDigi(const uint16_t valid,
              const uint16_t quality,
              const uint16_t accel,
              const uint16_t patternb,
              const uint16_t keywire,
              const uint16_t bx,
              const uint16_t trknmb = 0,
              const uint16_t hmt = 0,
              const Version version = Version::Legacy);
  /// default
  CSCALCTDigi();

  /// clear this ALCT
  void clear();

  /// check ALCT validity (1 - valid ALCT)
  bool isValid() const { return valid_; }

  /// set valid
  void setValid(const uint16_t valid) { valid_ = valid; }

  /// return quality of a pattern
  uint16_t getQuality() const { return quality_; }

  /// set quality
  void setQuality(const uint16_t quality) { quality_ = quality; }

  /// return Accelerator bit
  /// 1-Accelerator pattern, 0-CollisionA or CollisionB pattern
  uint16_t getAccelerator() const { return accel_; }

  /// set accelerator bit
  void setAccelerator(const uint16_t accelerator) { accel_ = accelerator; }

  /// return Collision Pattern B bit
  /// 1-CollisionB pattern (accel_ = 0),
  /// 0-CollisionA pattern (accel_ = 0)
  uint16_t getCollisionB() const { return patternb_; }

  /// set Collision Pattern B bit
  void setCollisionB(const uint16_t collision) { patternb_ = collision; }

  /// return key wire group
  uint16_t getKeyWG() const { return keywire_; }

  /// set key wire group
  void setKeyWG(const uint16_t keyWG) { keywire_ = keyWG; }

  /// return BX - five low bits of BXN counter tagged by the ALCT
  uint16_t getBX() const { return bx_; }

  /// set BX
  void setBX(const uint16_t BX) { bx_ = BX; }

  /// return track number (1,2)
  uint16_t getTrknmb() const { return trknmb_; }

  /// Set track number (1,2) after sorting ALCTs.
  void setTrknmb(const uint16_t number) { trknmb_ = number; }

  /// return 12-bit full BX.
  uint16_t getFullBX() const { return fullbx_; }

  /// Set 12-bit full BX.
  void setFullBX(const uint16_t fullbx) { fullbx_ = fullbx; }

  /// return the high multiplicity bits
  uint16_t getHMT() const;

  /// set the high multiplicity bits
  void setHMT(const uint16_t hmt);

  /// True if the first ALCT has a larger quality, or if it has the same
  /// quality but a larger wire group.
  bool operator>(const CSCALCTDigi&) const;

  /// True if all members (except the number) of both ALCTs are equal.
  bool operator==(const CSCALCTDigi&) const;

  /// True if the preceding one is false.
  bool operator!=(const CSCALCTDigi&) const;

  /// Print content of digi.
  void print() const;

  /// set wiregroup number
  void setWireGroup(uint16_t wiregroup) { keywire_ = wiregroup; }

  /// Distinguish Run-1/2 from Run-3
  bool isRun3() const { return version_ == Version::Run3; }

  void setRun3(const bool isRun3);

  // wire hits in this ALCT
  const WireContainer& getHits() const { return hits_.empty() ? emptyContainer() : hits_; }

  void setHits(const WireContainer& hits) { hits_ = hits; }

private:
  static const WireContainer& emptyContainer();
  uint16_t valid_;
  uint16_t quality_;
  uint16_t accel_;
  uint16_t patternb_;  // not used since 2007
  uint16_t keywire_;
  uint16_t bx_;
  uint16_t trknmb_;
  uint16_t fullbx_;
  // In Run-3, CSC trigger data will include the high-multiplicity
  // bits for a chamber. These bits may indicate the observation of
  // "exotic" events. This data member was included in a prototype.
  // Later on, we developed a dedicated object: "CSCShowerDigi<Anode>"
  uint16_t hmt_;

  Version version_;
  // which hits are in this ALCT?
  WireContainer hits_;
};

std::ostream& operator<<(std::ostream& o, const CSCALCTDigi& digi);
#endif