DTROChainCoding

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
#ifndef DTRawToDigi_DTROChainCoding_h
#define DTRawToDigi_DTROChainCoding_h

/** \class DTROChainCoding
 *  A class for handling the DT Read-out chain.
 *
 *  \author M. Zanetti - INFN Padova
 */

#include <DataFormats/DTDigi/interface/DTDDUWords.h>

#include <vector>
#include <cstdint>

/// FIXEME:
/*
  A major problem is the numbering of the
  RO componenets: do they all start from 0?
  I think yes but mapping and coding (THIS class)
  must be arranged accordingly.

  So far TDC channels and ID are bound to start from 0
  whereas ROB, ROS and DDU are free to start from 0 
  or from 1. This has to be coded into the map

*/

class DTROChainCoding {
public:
  /// Constructors

  DTROChainCoding() : code(0) {}

  DTROChainCoding(const int& ddu, const int& ros, const int& rob, const int& tdc, const int& channel) {
    code = ddu << DDU_SHIFT | ros << ROS_SHIFT | rob << ROB_SHIFT | tdc << TDC_SHIFT | channel << CHANNEL_SHIFT;
  }

  DTROChainCoding(uint32_t code_) : code(code_) {}

  /// Destructor
  virtual ~DTROChainCoding() {}

  /// Setters  ///////////////////////
  inline void setCode(const uint32_t& code_) { code = code_; }
  inline void setChain(const int& ddu, const int& ros, const int& rob, const int& tdc, const int& channel) {
    code = ddu << DDU_SHIFT | ros << ROS_SHIFT | rob << ROB_SHIFT | tdc << TDC_SHIFT | channel << CHANNEL_SHIFT;
  }

  /// need to reset the bits before setting
  inline void setDDU(const int& ID) { code = (code & (~(DDU_MASK << DDU_SHIFT))) | (ID << DDU_SHIFT); }
  inline void setROS(const int& ID) { code = (code & (~(ROS_MASK << ROS_SHIFT))) | (ID << ROS_SHIFT); }
  inline void setROB(const int& ID) { code = (code & (~(ROB_MASK << ROB_SHIFT))) | (ID << ROB_SHIFT); }
  inline void setTDC(const int& ID) { code = (code & (~(TDC_MASK << TDC_SHIFT))) | (ID << TDC_SHIFT); }
  inline void setChannel(const int& ID) { code = (code & (~(CHANNEL_MASK << CHANNEL_SHIFT))) | (ID << CHANNEL_SHIFT); }

  /// Getters ///////////////////////
  inline uint32_t getCode() const { return code; }
  inline int getDDU() const { return (code >> DDU_SHIFT) & DDU_MASK; }
  inline int getDDUID() const { return (code >> DDU_SHIFT); }
  inline int getROS() const { return (code >> ROS_SHIFT) & ROS_MASK; }
  inline int getROSID() const { return (code >> ROS_SHIFT); }
  inline int getROB() const { return (code >> ROB_SHIFT) & ROB_MASK; }
  inline int getROBID() const { return (code >> ROB_SHIFT); }
  inline int getTDC() const { return (code >> TDC_SHIFT) & TDC_MASK; }
  inline int getTDCID() const { return (code >> TDC_SHIFT); }
  inline int getChannel() const { return (code >> CHANNEL_SHIFT) & CHANNEL_MASK; }
  inline int getChannelID() const { return (code >> CHANNEL_SHIFT); }

  /// SC getters: same as ROS getters (SC data goes in the corresponding ROS)
  inline int getSC() const { return (code >> ROS_SHIFT) & ROS_MASK; }
  inline int getSCID() const { return (code >> ROS_SHIFT); }

private:
  uint32_t code;

  // First shift the bits then apply the mask

  // ddu bit are the last ones. I DONT CARE if the ID is > than 730 (I always get the lsb)
  static const int DDU_SHIFT = 16;
  static const int DDU_MASK = 0x3FF;

  static const int ROS_SHIFT = 12;
  static const int ROS_MASK = 0xF;

  static const int ROB_SHIFT = 7;
  static const int ROB_MASK = 0x1F;

  static const int TDC_SHIFT = 5;
  static const int TDC_MASK = 0x3;

  static const int CHANNEL_SHIFT = 0;
  static const int CHANNEL_MASK = 0x1F;
};

#endif