ConsistentWithKey

SiStripFecKey

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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245

#ifndef DataFormats_SiStripCommon_SiStripFecKey_H
#define DataFormats_SiStripCommon_SiStripFecKey_H

#include "DataFormats/SiStripCommon/interface/ConstantsForGranularity.h"
#include "DataFormats/SiStripCommon/interface/SiStripKey.h"

/**
   @class SiStripFecKey
   @author R.Bainbridge
   
   @brief Utility class that identifies a position within the strip
   tracker control structure, down to the level of an APV25.
   
   The class allows to encode the position within a 32-bit "key" and,
   conversely, unpack a 32-bit key to provide the position.

   The class provides the following member data: 
   - FEC key (32 bits),
   - VME crate,
   - FEC (using VME slot), 
   - FEC control ring,
   - CCU module,
   - Front-End module,
   - LLD channel,
   - APV25 chip,
   - directory path,
   - "granularity".
   
   Member data (integer in type only) with values of 0xFFFF signifies
   "invalid" (ie, FecSlot = 0xFFFF means "invalid FEC slot"). Data
   with null values signifies "all" (ie, FecSlot = 0 means "all FEC
   slots").

   The class generates a "directory path" string according to the
   member data. This can be used to organise histograms / other data
   types when using DQM / root. Conversely, the member data can also
   be built using the directory path when provided as a constructor
   argument.

   The class also provides the "granularity" to which the FEC key is
   unambiguous (ie, not "invalid" or "null") in defining a position
   within the control system.
*/
class SiStripFecKey : public SiStripKey {
public:
  // ---------- Constructors ----------

  /** Constructor using crate, FEC, ring, CCU, module and channel. */
  SiStripFecKey(const uint16_t& fec_crate,
                const uint16_t& fec_slot = 0,
                const uint16_t& fec_ring = 0,
                const uint16_t& ccu_addr = 0,
                const uint16_t& ccu_chan = 0,
                const uint16_t& lld_chan = 0,
                const uint16_t& i2c_addr = 0);

  /** Constructor using 32-bit "FEC key". */
  SiStripFecKey(const uint32_t& fec_key);

  /** Constructor using directory path. */
  SiStripFecKey(const std::string& directory_path);

  /** Copy constructor. */
  SiStripFecKey(const SiStripFecKey&);

  /** Copy constructor using base class. */
  SiStripFecKey(const SiStripKey&);

  /** Copy to level specified by granularity. */
  SiStripFecKey(const SiStripKey&, const sistrip::Granularity&);

  /** Default constructor */
  SiStripFecKey();

  /** Assignment operator */
  SiStripFecKey& operator=(const SiStripFecKey&) = default;

  // ---------- Control structure ----------

  /** Returns VME crate. */
  inline const uint16_t& fecCrate() const;

  /** Returns FEC identifier (VME slot). */
  inline const uint16_t& fecSlot() const;

  /** Returns FEC control ring. */
  inline const uint16_t& fecRing() const;

  /** Returns CCU module. */
  inline const uint16_t& ccuAddr() const;

  /** Returns Front-End module. */
  inline const uint16_t& ccuChan() const;

  /** Returns LLD channel. */
  inline const uint16_t& lldChan() const;

  /** Returns I2C address ("invalid" if inconsistent with LLD chan. */
  inline const uint16_t& i2cAddr() const;

  // ---------- Hybrid APV/LLD numbering scheme ----------

  /** Returns hybrid position (1-6) for a given I2C addr (32-37). */
  static uint16_t hybridPos(const uint16_t& i2c_addr);

  /** Returns I2C addr (32-37) for a given hybrid position (1-6). */
  static uint16_t i2cAddr(const uint16_t& hybrid_pos);

  /** Returns LLD channel (1-3) for a given APV I2C addr (32-37). */
  static uint16_t lldChan(const uint16_t& i2c_addr);

  /** Identifies if first APV of pair for given I2C addr (32-37). */
  static bool firstApvOfPair(const uint16_t& i2c_addr);

  /** Returns I2C addr (32-37) for LLD chan (1-3) and APV pos. */
  static uint16_t i2cAddr(const uint16_t& lld_chan, const bool& first_apv_of_pair);

  // ---------- Utility methods ----------

  /** Identifies key objects with identical member data. */
  bool isEqual(const SiStripKey&) const override;

  /** "Consistent" means identical and/or null (ie, "all") data. */
  bool isConsistent(const SiStripKey&) const override;

  /** Identifies all member data as being "valid" or "all" (null). */
  bool isValid() const override;

  /** All member data to level of "Granularity" are "valid". If
      sistrip::Granularity is "undefined", returns false. */
  bool isValid(const sistrip::Granularity&) const override;

  /** Identifies all member data as being "invalid". */
  bool isInvalid() const override;

  /** All member data to level of "Granularity" are invalid. If
      sistrip::Granularity is "undefined", returns true.  */
  bool isInvalid(const sistrip::Granularity&) const override;

  // ---------- Print methods ----------

  /** A terse summary of the key  */
  void print(std::stringstream& ss) const override;

  /** A terse summary of the key  */
  void terse(std::stringstream& ss) const override;

private:
  // ---------- Private methods ----------

  void initFromValue() override;
  void initFromKey() override;
  void initFromPath() override;
  void initGranularity() override;

  // ---------- Private member data ----------

  /** FEC crate [0,1-4,invalid]. */
  uint16_t fecCrate_;

  /** FEC slot [0,2-21,invalid]. */
  uint16_t fecSlot_;

  /** FEC ring [0,1-8,invalid]. */
  uint16_t fecRing_;

  /** CCU module [0,1-126,invalid]. */
  uint16_t ccuAddr_;

  /** FE module [0,16-31,invalid]. */
  uint16_t ccuChan_;

  /** LLD channel [0,1-3,invalid]. */
  uint16_t lldChan_;

  /** APV I2C address [0,32-37,invalid]. */
  uint16_t i2cAddr_;

  // Definition of bit field positions for 32-bit key
  static const uint16_t fecCrateOffset_ = 27;
  static const uint16_t fecSlotOffset_ = 22;
  static const uint16_t fecRingOffset_ = 18;
  static const uint16_t ccuAddrOffset_ = 10;
  static const uint16_t ccuChanOffset_ = 5;
  static const uint16_t lldChanOffset_ = 2;
  static const uint16_t i2cAddrOffset_ = 0;

  // Definition of bit field masks for 32-bit key
  static const uint16_t fecCrateMask_ = 0x07;  // (3 bits)
  static const uint16_t fecSlotMask_ = 0x1F;   // (5 bits)
  static const uint16_t fecRingMask_ = 0x0F;   // (4 bits)
  static const uint16_t ccuAddrMask_ = 0xFF;   // (8 bits)
  static const uint16_t ccuChanMask_ = 0x1F;   // (5 bits)
  static const uint16_t lldChanMask_ = 0x07;   // (3 bits)
  static const uint16_t i2cAddrMask_ = 0x03;   // (2 bits)
};

// ---------- Inline methods ----------

const uint16_t& SiStripFecKey::fecCrate() const { return fecCrate_; }
const uint16_t& SiStripFecKey::fecSlot() const { return fecSlot_; }
const uint16_t& SiStripFecKey::fecRing() const { return fecRing_; }
const uint16_t& SiStripFecKey::ccuAddr() const { return ccuAddr_; }
const uint16_t& SiStripFecKey::ccuChan() const { return ccuChan_; }
const uint16_t& SiStripFecKey::lldChan() const { return lldChan_; }
const uint16_t& SiStripFecKey::i2cAddr() const { return i2cAddr_; }

/* const uint16_t& SiStripFecKey::fecCrate() const {  */
/*   return ( key()>>fecCrateOffset_ ) & fecCrateMask_ != fecCrateMask_ ? ( key()>>fecCrateOffset_ ) & fecCrateMask_ : sistrip::invalid_;  */
/* } */
/* const uint16_t& SiStripFecKey::fecSlot() const {  */
/*   return ( key()>>fecSlotOffset_ ) & fecSlotMask_ != fecSlotMask_ ? ( key()>>fecSlotOffset_ ) & fecSlotMask_ : sistrip::invalid_;  */
/* } */
/* const uint16_t& SiStripFecKey::fecRing() const {  */
/*   return ( key()>>fecRingOffset_ ) & fecRingMask_ != fecRingMask_ ? ( key()>>fecRingOffset_ ) & fecRingMask_ : sistrip::invalid_;  */
/* } */
/* const uint16_t& SiStripFecKey::ccuAddr() const {  */
/*   return ( key()>>ccuAddrOffset_ ) & ccuAddrMask_ != ccuAddrMask_ ? ( key()>>ccuAddrOffset_ ) & ccuAddrMask_ : sistrip::invalid_;  */
/* } */
/* const uint16_t& SiStripFecKey::ccuChan() const {  */
/*   return ( key()>>ccuChanOffset_ ) & ccuChanMask_ != ccuChanMask_ ? ( key()>>ccuChanOffset_ ) & ccuChanMask_ : sistrip::invalid_;  */
/* } */
/* const uint16_t& SiStripFecKey::lldChan() const {  */
/*   return ( key()>>lldChanOffset_ ) & lldChanMask_ != lldChanMask_ ? ( key()>>lldChanOffset_ ) & lldChanMask_ : sistrip::invalid_;  */
/* } */
/* const uint16_t& SiStripFecKey::i2cAddr() const {  */
/*   return ( key()>>i2cAddrOffset_ ) & i2cAddrMask_ != i2cAddrMask_ ? ( key()>>i2cAddrOffset_ ) & i2cAddrMask_ : sistrip::invalid_;  */
/* } */

std::ostream& operator<<(std::ostream&, const SiStripFecKey&);

inline bool operator<(const SiStripFecKey& a, const SiStripFecKey& b) { return (a.key() < b.key()); }

class ConsistentWithKey {
public:
  explicit ConsistentWithKey(const SiStripFecKey& key);
  bool operator()(const uint32_t&, const uint32_t&) const;

private:
  explicit ConsistentWithKey();
  SiStripFecKey mask_;
};

#endif  // DataFormats_SiStripCommon_SiStripFecKey_H