RegionalMuonCand

bmtfAddress

emtfAddress

omtfAddress

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

#include "RegionalMuonCandFwd.h"
#include <map>

namespace l1t {
  class RegionalMuonCand {
  public:
    /// Enum to identify the individual parts of the BMTF track address
    /// Update kNumBmtfSubAddr if you add additional enums
    enum bmtfAddress {
      kWheelSide = 0,
      kWheelNum = 1,
      kStat1 = 2,
      kStat2 = 3,
      kStat3 = 4,
      kStat4 = 5,
      kSegSelStat1 = 6,
      kSegSelStat2 = 7,
      kSegSelStat3 = 8,
      kSegSelStat4 = 9,
      kNumBmtfSubAddr = 10
    };
    /// Enum to identify the individual parts of the OMTF track address
    /// Update kNumOmtfSubAddr if you add additional enums
    enum omtfAddress { kLayers = 0, kZero = 1, kWeight = 2, kNumOmtfSubAddr = 3 };
    /// Enum to identify the individual parts of the EMTF track address
    /// Update kNumEmtfSubAddr if you add additional enums
    enum emtfAddress {
      kME1Seg = 0,
      kME1Ch = 1,
      kME2Seg = 2,
      kME2Ch = 3,
      kME3Seg = 4,
      kME3Ch = 5,
      kME4Seg = 6,
      kME4Ch = 7,
      kTrkNum = 8,
      kBX = 9,
      kNumEmtfSubAddr = 10
    };

    explicit RegionalMuonCand(uint64_t dataword);

    RegionalMuonCand()
        : m_hwPt(0),
          m_hwPtUnconstrained(0),
          m_hwDXY(0),
          m_hwPhi(0),
          m_hwEta(0),
          m_hwHF(false),
          m_hwSign(0),
          m_hwSignValid(0),
          m_hwQuality(0),
          m_dataword(0) {
      setTFIdentifiers(0, bmtf);
    };

    RegionalMuonCand(int pt, int phi, int eta, int sign, int signvalid, int quality, int processor, tftype trackFinder)
        : m_hwPt(pt),
          m_hwPtUnconstrained(0),
          m_hwDXY(0),
          m_hwPhi(phi),
          m_hwEta(eta),
          m_hwHF(false),
          m_hwSign(sign),
          m_hwSignValid(signvalid),
          m_hwQuality(quality),
          m_dataword(0) {
      setTFIdentifiers(processor, trackFinder);
      // set default track addresses
      if (trackFinder == tftype::bmtf) {
        m_trackAddress = {{kWheelSide, 0},
                          {kWheelNum, 0},
                          {kStat1, 0},
                          {kStat2, 0},
                          {kStat3, 0},
                          {kStat4, 0},
                          {kSegSelStat1, 0},
                          {kSegSelStat2, 0},
                          {kSegSelStat3, 0},
                          {kSegSelStat4, 0}};
      } else if (trackFinder == tftype::omtf_pos || trackFinder == tftype::omtf_neg) {
        m_trackAddress = {{kLayers, 0}, {kZero, 0}, {kWeight, 0}};
      } else if (trackFinder == tftype::emtf_pos || trackFinder == tftype::emtf_neg) {
        m_trackAddress = {{kME1Seg, 0},
                          {kME1Ch, 0},
                          {kME2Seg, 0},
                          {kME2Ch, 0},
                          {kME3Seg, 0},
                          {kME3Ch, 0},
                          {kME4Seg, 0},
                          {kME4Ch, 0},
                          {kTrkNum, 0},
                          {kBX, 0}};
      }
    };

    RegionalMuonCand(int pt,
                     int phi,
                     int eta,
                     int sign,
                     int signvalid,
                     int quality,
                     int processor,
                     tftype trackFinder,
                     std::map<int, int> trackAddress)
        : m_hwPt(pt),
          m_hwPtUnconstrained(0),
          m_hwDXY(0),
          m_hwPhi(phi),
          m_hwEta(eta),
          m_hwHF(false),
          m_hwSign(sign),
          m_hwSignValid(signvalid),
          m_hwQuality(quality),
          m_trackAddress(trackAddress),
          m_dataword(0) {
      setTFIdentifiers(processor, trackFinder);
    };

    virtual ~RegionalMuonCand() {}

    /// Set compressed pT as transmitted by hardware LSB = 0.5 (9 bits)
    void setHwPt(int bits) { m_hwPt = bits; };
    /// Set compressed second displaced  pT as transmitted by hardware LSB = 1.0 (8 bits)
    void setHwPtUnconstrained(int bits) { m_hwPtUnconstrained = bits; };
    /// Set compressed impact parameter with respect to beamspot (4 bits)
    void setHwDXY(int bits) { m_hwDXY = bits; };
    /// Set compressed relative phi as transmitted by hardware LSB = 2*pi/576 (8 bits)
    void setHwPhi(int bits) { m_hwPhi = bits; };
    /// Set compressed eta as transmitted by hardware LSB = 0.010875 (9 bits)
    void setHwEta(int bits) { m_hwEta = bits; };
    /// Set charge sign bit (charge = (-1)^(sign))
    void setHwSign(int bits) { m_hwSign = bits; };
    /// Set whether charge measurement is valid (0 for high pT muons)
    void setHwSignValid(int bits) { m_hwSignValid = bits; };
    /// Set compressed quality code as transmitted by hardware (4 bits)
    void setHwQual(int bits) { m_hwQuality = bits; };
    /// Set HF (halo / fine eta) bit (EMTF: halo -> 1; BMTF: fine eta -> 1)
    void setHwHF(bool bit) { m_hwHF = bit; };
    /// Set the processor ID, track-finder type. From these two, the link is set
    void setTFIdentifiers(int processor, tftype trackFinder);
    // this is left to still be compatible with OMTF
    void setLink(int link) { m_link = link; };
    // Set the muon index on the link (i.e., 0, 1, or 2)
    void setMuIdx(int muIdx) { m_muIdx = muIdx; };
    // Set the 64 bit word from two 32 words. bits 0-31->lsbs, bits 32-63->msbs
    void setDataword(uint32_t msbs, uint32_t lsbs) { m_dataword = (((uint64_t)msbs) << 32) + lsbs; };
    // Set the 64 bit word coming from HW directly
    void setDataword(uint64_t bits) { m_dataword = bits; };
    /// Set a part of the muon candidates track address; specialised for BMTF
    void setTrackSubAddress(bmtfAddress subAddress, int value) { m_trackAddress[subAddress] = value; }
    /// Set a part of the muon candidates track address; specialised for OMTF
    void setTrackSubAddress(omtfAddress subAddress, int value) { m_trackAddress[subAddress] = value; }
    /// Set a part of the muon candidates track address; specialised for EMTF
    void setTrackSubAddress(emtfAddress subAddress, int value) { m_trackAddress[subAddress] = value; }
    /// Set the whole track address
    void setTrackAddress(const std::map<int, int>& address) { m_trackAddress = address; }

    /// Get compressed pT (returned int * 0.5 = pT (GeV))
    const int hwPt() const { return m_hwPt; };
    /// Get second compressed pT (returned int * 1.0 = pT (GeV))
    const int hwPtUnconstrained() const { return m_hwPtUnconstrained; };
    /// Get compressed impact parameter (4 bits)
    const int hwDXY() const { return m_hwDXY; };
    /// Get compressed local phi (returned int * 2*pi/576 = local phi in rad)
    const int hwPhi() const { return m_hwPhi; };
    /// Get compressed eta (returned int * 0.010875 = eta)
    const int hwEta() const { return m_hwEta; };
    /// Get charge sign bit (charge = (-1)^(sign))
    const int hwSign() const { return m_hwSign; };
    /// Get charge sign valid bit (0 - not valid (high pT muon); 1 - valid)
    const int hwSignValid() const { return m_hwSignValid; };
    /// Get quality code
    const int hwQual() const { return m_hwQuality; };
    /// Get link on which the MicroGMT receives the candidate
    const int link() const { return m_link; };
    /// Get muon index (i.e., 0, 1, or 2)
    const int muIdx() const { return m_muIdx; };
    /// Get processor ID on which the candidate was found (0..5 for OMTF/EMTF; 0..11 for BMTF)
    const int processor() const { return m_processor; };
    /// Get track-finder which found the muon (bmtf, emtf_pos/emtf_neg or omtf_pos/omtf_neg)
    const tftype trackFinderType() const { return m_trackFinder; };
    /// Get HF (halo / fine eta) bit (EMTF: halo -> 1; BMTF: fine eta -> 1)
    const int hwHF() const { return m_hwHF; };
    /// Get 64 bit data word
    const uint64_t dataword() const { return m_dataword; };
    /// Get 32 MSBs of data word
    const uint32_t dataword32Msb() const { return (uint32_t)((m_dataword >> 32) & 0xFFFFFFFF); };
    /// Get 32 LSBs of data word
    const uint32_t dataword32Lsb() const { return (uint32_t)(m_dataword & 0xFFFFFFFF); };
    /// Get the track address (identifies track primitives used for reconstruction)
    const std::map<int, int>& trackAddress() const { return m_trackAddress; }
    /// Get part of track address (identifies track primitives used for reconstruction)
    int trackSubAddress(bmtfAddress subAddress) const { return m_trackAddress.at(subAddress); }
    /// Get part of track address (identifies track primitives used for reconstruction)
    int trackSubAddress(omtfAddress subAddress) const { return m_trackAddress.at(subAddress); }
    /// Get part of track address (identifies track primitives used for reconstruction)
    int trackSubAddress(emtfAddress subAddress) const { return m_trackAddress.at(subAddress); }

    bool operator==(const RegionalMuonCand& rhs) const;
    inline bool operator!=(const RegionalMuonCand& rhs) const { return !(operator==(rhs)); };

  private:
    int m_hwPt;
    int m_hwPtUnconstrained;
    int m_hwDXY;
    int m_hwPhi;
    int m_hwEta;
    bool m_hwHF;
    int m_hwSign;
    int m_hwSignValid;
    int m_hwQuality;
    int m_link;
    int m_processor;
    tftype m_trackFinder;
    std::map<int, int> m_trackAddress;

    /// This is the 64 bit word as transmitted in HW
    uint64_t m_dataword;
    int m_muIdx{-1};
  };

}  // namespace l1t

#endif /* define __l1t_regional_muon_candidate_h__ */