EMTFHit

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 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
// Class for input trigger primitives to EMTF - AWB 04.01.16
// Based on L1Trigger/L1TMuon/interface/MuonTriggerPrimitive.h
// In particular, see struct CSCData

#ifndef DataFormats_L1TMuon_EMTFHit_h
#define DataFormats_L1TMuon_EMTFHit_h

#include <cstdint>
#include <vector>

#include "DataFormats/MuonDetId/interface/CSCDetId.h"
#include "DataFormats/MuonDetId/interface/RPCDetId.h"
#include "DataFormats/MuonDetId/interface/GEMDetId.h"
#include "DataFormats/MuonDetId/interface/ME0DetId.h"
#include "DataFormats/MuonDetId/interface/DTChamberId.h"
#include "DataFormats/CSCDigi/interface/CSCCorrelatedLCTDigi.h"
#include "DataFormats/CSCDigi/interface/CSCShowerDigi.h"
#include "DataFormats/GEMDigi/interface/GEMPadDigiCluster.h"
#include "DataFormats/L1TMuon/interface/CPPFDigi.h"
#include "DataFormats/L1TMuon/interface/L1TMuonSubsystems.h"

namespace l1t {

  namespace l1tmu = L1TMuon;

  class EMTFHit {
  public:
    EMTFHit()
        : rawDetId(0),
          subsystem(-99),
          endcap(-99),
          station(-99),
          ring(-99),
          sector(-99),
          sector_RPC(-99),
          sector_idx(-99),
          subsector(-99),
          subsector_RPC(-99),
          chamber(-99),
          csc_ID(-99),
          csc_nID(-99),
          roll(-99),
          neighbor(-99),
          mpc_link(-99),
          pc_sector(-99),
          pc_station(-99),
          pc_chamber(-99),
          pc_segment(-99),
          wire(-99),
          strip(-99),
          strip_hi(-99),
          strip_low(-99),
          strip_quart(-99),            // Run 3
          strip_eighth(-99),           // Run 3
          strip_quart_bit(-99),        // Run 3
          strip_eighth_bit(-99),       // Run 3
          muon_shower_valid(-99),      // Run 3 muon shower
          muon_shower_inTime(-99),     // Run 3 muon shower
          muon_shower_outOfTime(-99),  // Run 3 muon shower
          track_num(-99),
          quality(-99),
          pattern(-99),
          pattern_run3(-99),  // Run 3
          bend(-99),
          slope(-99),  // Run 3
          valid(-99),
          sync_err(-99),
          layer(-99),  // TODO: verify inclusion for GEM, or better to generalize this class... - JS 06.07.20
          bc0(-99),
          bx(-99),
          stub_num(-99),
          phi_fp(-99),
          theta_fp(-99),
          zone_hit(-99),
          zone_code(-99),
          fs_segment(-99),
          fs_zone_code(-99),
          bt_station(-99),
          bt_segment(-99),
          phi_loc(-99),
          phi_glob(-999),
          theta(-99),
          eta(-99),
          time(-99),
          phi_sim(-999),
          theta_sim(-99),
          eta_sim(-99),
          rho_sim(-99),
          z_sim(-99),
          alct_quality(-99),
          clct_quality(-99) {}

    virtual ~EMTFHit() {}

    CSCDetId CreateCSCDetId() const;
    RPCDetId CreateRPCDetId() const;
    GEMDetId CreateGEMDetId() const;
    ME0DetId CreateME0DetId() const;

    // void ImportCSCCorrelatedLCTDigi (const CSCCorrelatedLCTDigi& _digi);
    CSCCorrelatedLCTDigi CreateCSCCorrelatedLCTDigi(const bool isRun3) const;
    // Run 3 muon shower
    CSCShowerDigi CreateCSCShowerDigi() const;
    // void ImportRPCDigi (const RPCDigi& _digi);
    // RPCDigi CreateRPCDigi() const;
    // void ImportCPPFDigi (const CPPFDigi& _digi);
    CPPFDigi CreateCPPFDigi() const;
    // void ImportGEMPadDigiCluster (const GEMPadDigiCluster& _digi);  // TODO: implement placeholder when others are implemented
    GEMPadDigiCluster CreateGEMPadDigiCluster() const;

    // void PrintSimulatorHeader() const;
    // void PrintForSimulator() const;

    //void SetCSCDetId   (const CSCDetId& id)                 { csc_DetId         = id;        }
    //void SetRPCDetId   (const RPCDetId& id)                 { rpc_DetId         = id;        }
    //void SetGEMDetId   (const GEMDetId& id)                 { gem_DetId         = id;        }
    //void SetCSCLCTDigi (const CSCCorrelatedLCTDigi& digi)   { csc_LCTDigi       = digi;      }
    //void SetRPCDigi    (const RPCDigi& digi)                { rpc_Digi          = digi;      }
    //void SetCPPFDigi   (const CPPFDigi& digi)               { cppf_Digi         = digi;      }
    //void SetGEMPadDigiCluster (const GEMPadDigiCluster& digi)             { gem_PadClusterDigi       = digi;      }
    void SetCSCDetId(const CSCDetId& id) { rawDetId = id.rawId(); }
    void SetRPCDetId(const RPCDetId& id) { rawDetId = id.rawId(); }
    void SetGEMDetId(const GEMDetId& id) { rawDetId = id.rawId(); }
    void SetME0DetId(const ME0DetId& id) { rawDetId = id.rawId(); }
    void SetDTDetId(const DTChamberId& id) { rawDetId = id.rawId(); }

    //CSCDetId CSC_DetId                          () const { return csc_DetId;    }
    //RPCDetId RPC_DetId                          () const { return rpc_DetId;    }
    //GEMDetId GEM_DetId                          () const { return gem_DetId;    }
    //CSCCorrelatedLCTDigi CSC_LCTDigi            () const { return csc_LCTDigi;  }
    //RPCDigi RPC_Digi                            () const { return rpc_Digi;     }
    //CPPFDigi CPPF_Digi                          () const { return cppf_Digi;    }
    //GEMPadDigiCluster GEM_PadClusterDigi        () const { return gem_PadClusterDigi;  }
    CSCDetId CSC_DetId() const { return CSCDetId(rawDetId); }
    RPCDetId RPC_DetId() const { return RPCDetId(rawDetId); }
    GEMDetId GEM_DetId() const { return GEMDetId(rawDetId); }
    ME0DetId ME0_DetId() const { return ME0DetId(rawDetId); }
    DTChamberId DT_DetId() const { return DTChamberId(rawDetId); }

    void set_subsystem(int bits) { subsystem = bits; }
    void set_endcap(int bits) { endcap = bits; }
    void set_station(int bits) { station = bits; }
    void set_ring(int bits) { ring = bits; }
    void set_sector(int bits) { sector = bits; }
    void set_sector_RPC(int bits) { sector_RPC = bits; }
    void set_sector_idx(int bits) { sector_idx = bits; }
    void set_subsector(int bits) { subsector = bits; }
    void set_subsector_RPC(int bits) { subsector_RPC = bits; }
    void set_chamber(int bits) { chamber = bits; }
    void set_csc_ID(int bits) { csc_ID = bits; }
    void set_csc_nID(int bits) { csc_nID = bits; }
    void set_roll(int bits) { roll = bits; }
    void set_neighbor(int bits) { neighbor = bits; }
    void set_mpc_link(int bits) { mpc_link = bits; }
    void set_pc_sector(int bits) { pc_sector = bits; }
    void set_pc_station(int bits) { pc_station = bits; }
    void set_pc_chamber(int bits) { pc_chamber = bits; }
    void set_pc_segment(int bits) { pc_segment = bits; }
    void set_wire(int bits) { wire = bits; }
    void set_strip(int bits) { strip = bits; }
    void set_strip_hi(int bits) { strip_hi = bits; }
    void set_strip_low(int bits) { strip_low = bits; }
    void set_strip_quart(int bits) { strip_quart = bits; }                      // Run 3
    void set_strip_eighth(int bits) { strip_eighth = bits; }                    // Run 3
    void set_strip_quart_bit(int bits) { strip_quart_bit = bits; }              // Run 3
    void set_strip_eighth_bit(int bits) { strip_eighth_bit = bits; }            // Run 3
    void set_muon_shower_valid(int bits) { muon_shower_valid = bits; }          // Run 3 muon shower
    void set_muon_shower_inTime(int bits) { muon_shower_inTime = bits; }        // Run 3 muon shower
    void set_muon_shower_outOfTime(int bits) { muon_shower_outOfTime = bits; }  // Run 3 muon shower
    void set_track_num(int bits) { track_num = bits; }
    void set_quality(int bits) { quality = bits; }
    void set_pattern(int bits) { pattern = bits; }
    void set_pattern_run3(int bits) { pattern_run3 = bits; }  // Run 3
    void set_bend(int bits) { bend = bits; }
    void set_slope(int bits) { slope = bits; }  // Run 3
    void set_valid(int bits) { valid = bits; }
    void set_sync_err(int bits) { sync_err = bits; }
    // GEM specific aliases
    void set_pad(int bits) { set_strip(bits); }
    void set_pad_hi(int bits) { set_strip_hi(bits); }
    void set_pad_low(int bits) { set_strip_low(bits); }
    void set_partition(int bits) { set_roll(bits); }
    void set_layer(int bits) { layer = bits; }
    void set_cluster_size(int bits) { set_quality(bits); }
    void set_cluster_id(int bits) { set_track_num(bits); }
    // END GEM specific
    void set_bc0(int bits) { bc0 = bits; }
    void set_bx(int bits) { bx = bits; }
    void set_stub_num(int bits) { stub_num = bits; }
    void set_phi_fp(int bits) { phi_fp = bits; }
    void set_theta_fp(int bits) { theta_fp = bits; }
    void set_zone_hit(int bits) { zone_hit = bits; }
    void set_zone_code(int bits) { zone_code = bits; }
    void set_fs_segment(int bits) { fs_segment = bits; }
    void set_fs_zone_code(int bits) { fs_zone_code = bits; }
    void set_bt_station(int bits) { bt_station = bits; }
    void set_bt_segment(int bits) { bt_segment = bits; }
    void set_phi_loc(float val) { phi_loc = val; }
    void set_phi_glob(float val) { phi_glob = val; }
    void set_theta(float val) { theta = val; }
    void set_eta(float val) { eta = val; }
    void set_time(float val) { time = val; }
    void set_phi_sim(float val) { phi_sim = val; }
    void set_theta_sim(float val) { theta_sim = val; }
    void set_eta_sim(float val) { eta_sim = val; }
    void set_rho_sim(float val) { rho_sim = val; }
    void set_z_sim(float val) { z_sim = val; }
    void set_alct_quality(int bits) { alct_quality = bits; }
    void set_clct_quality(int bits) { clct_quality = bits; }

    int Subsystem() const { return subsystem; }
    int Endcap() const { return endcap; }
    int Station() const { return station; }
    int Ring() const { return ring; }
    int Sector() const { return sector; }
    int Sector_RPC() const { return sector_RPC; }
    int Sector_idx() const { return sector_idx; }
    int Subsector() const { return subsector; }
    int Subsector_RPC() const { return subsector_RPC; }
    int Chamber() const { return chamber; }
    int CSC_ID() const { return csc_ID; }
    int CSC_nID() const { return csc_nID; }
    int Roll() const { return roll; }
    int Neighbor() const { return neighbor; }
    int MPC_link() const { return mpc_link; }
    int PC_sector() const { return pc_sector; }
    int PC_station() const { return pc_station; }
    int PC_chamber() const { return pc_chamber; }
    int PC_segment() const { return pc_segment; }
    int Wire() const { return wire; }
    int Strip() const { return strip; }
    int Strip_hi() const { return strip_hi; }
    int Strip_low() const { return strip_low; }
    int Strip_quart() const { return strip_quart; }                      // Run 3
    int Strip_eighth() const { return strip_eighth; }                    // Run 3
    int Strip_quart_bit() const { return strip_quart_bit; }              // Run 3
    int Strip_eighth_bit() const { return strip_eighth_bit; }            // Run 3
    int Muon_shower_valid() const { return muon_shower_valid; }          // Run 3 muon shower
    int Muon_shower_inTime() const { return muon_shower_inTime; }        // Run 3 muon shower
    int Muon_shower_outOfTime() const { return muon_shower_outOfTime; }  // Run 3 muon shower
    int Track_num() const { return track_num; }
    int Quality() const { return quality; }
    int Pattern() const { return pattern; }
    int Pattern_run3() const { return pattern_run3; }  // Run 3
    int Bend() const { return bend; }
    int Slope() const { return slope; }  // Run 3
    int Valid() const { return valid; }
    int Sync_err() const { return sync_err; }
    // GEM specific aliases for member variables that don't match GEM nomenclature
    /*
     * Each GEM pad is the OR of two neighbouring strips in phi.
     * For GE1/1 (10 degree chambers) this results in a total of 192 pads per eta partition
       * 128 strips per phi sector
       * 3 phi sectors per eta partition
     * For GE2/1 (20 degree chambers) this results in a total of 384 pads per eta partition
       * 128 strips per phi sector
       * 6 phi sectors per eta partition
     */
    /// Repurpose "strip" as GEM pad for GEM sourced hits
    int Pad() const { return Strip(); }
    /// Repurpose "strip" as GEM pad for GEM sourced hits
    int Pad_hi() const { return Strip_hi(); }
    /// Repurpose "strip" as GEM pad for GEM sourced hits
    int Pad_low() const { return Strip_low(); }
    /// "roll" corresponds to the GEM eta partition
    int Partition() const { return Roll(); }
    int Layer() const { return layer; }
    /// Repurpose "quality" as the GEM cluster_size (number of pads in the cluster)
    int ClusterSize() const { return Quality(); }
    /// Repurpose "track_num" as the GEM cluster_id
    int ClusterID() const { return Track_num(); }
    // END GEM specific
    int BC0() const { return bc0; }
    int BX() const { return bx; }
    int Stub_num() const { return stub_num; }
    int Phi_fp() const { return phi_fp; }
    int Theta_fp() const { return theta_fp; }
    int Zone_hit() const { return zone_hit; }
    int Zone_code() const { return zone_code; }
    int FS_segment() const { return fs_segment; }
    int FS_zone_code() const { return fs_zone_code; }
    int BT_station() const { return bt_station; }
    int BT_segment() const { return bt_segment; }
    float Phi_loc() const { return phi_loc; }
    float Phi_glob() const { return phi_glob; }
    float Theta() const { return theta; }
    float Eta() const { return eta; }
    float Time() const { return time; }
    float Phi_sim() const { return phi_sim; }
    float Theta_sim() const { return theta_sim; }
    float Eta_sim() const { return eta_sim; }
    float Rho_sim() const { return rho_sim; }
    float Z_sim() const { return z_sim; }
    int ALCT_quality() const { return alct_quality; }
    int CLCT_quality() const { return clct_quality; }

    bool Is_DT() const { return subsystem == l1tmu::kDT; }
    bool Is_CSC() const { return subsystem == l1tmu::kCSC; }
    bool Is_RPC() const { return subsystem == l1tmu::kRPC; }
    bool Is_GEM() const { return subsystem == l1tmu::kGEM; }
    bool Is_ME0() const { return subsystem == l1tmu::kME0; }

  private:
    //CSCDetId csc_DetId;
    //RPCDetId rpc_DetId;
    //GEMDetId gem_DetId;
    //CSCCorrelatedLCTDigi csc_LCTDigi;
    //RPCDigi rpc_Digi;
    //CPPFDigi cppf_Digi;
    //GEMPadDigiCluster gem_PadClusterDigi;

    uint32_t rawDetId;  ///< raw CMSSW DetId
    int subsystem;      ///<  0 -  4.  0 for DT, 1 for CSC, 2 for RPC, 3 for GEM, 4 for ME0
    int endcap;         ///<    +/-1.  For ME+ and ME-.
    int station;        ///<  1 -  4.
    int ring;  ///<  1 -  4.  ME1/1a is denoted as "Ring 4".  Should check dependence on input CSCDetId convention. - AWB 02.03.17
    int sector;      ///<  1 -  6.  CSC / GEM / EMTF sector convention: sector 1 starts at 15 degrees
    int sector_RPC;  ///<  1 -  6.  RPC sector convention (in CMSSW): sector 1 starts at -5 degrees
    int sector_idx;  ///<  0 - 11.  0 - 5 for ME+, 6 - 11 for ME-.  For neighbor hits, set by EMTF sector that received it.
    int subsector;  ///<  0 -  6.  In CSCs, 1 or 2 for ME1, 0 for ME2/3/4.
    int subsector_RPC;  ///<  0 -  6.  RPC sector convention (in CMSSW): subsector 3 is the first chamber in the EMTF sector.
    int chamber;        ///<  1 - 36.  Chamber 1 starts at -5 degrees.
    int csc_ID;         ///<  1 -  9.  For CSCs only.
    int csc_nID;        ///<  1 - 15.  For CSCs only.  Neighbors 10 - 15, 12 not filled.
    int roll;           ///<  1 -  3.  For RPCs only, sub-division of ring. (Range? - AWB 02.03.17)
    int neighbor;       ///<  0 or 1.  Filled in EMTFBlock(ME|GEM|RPC).cc
    int mpc_link;       ///<  1 -  3.  Filled in EMTFHit.cc from CSCCorrelatedLCTDigi
    int pc_sector;              ///<  1 -  6.  EMTF sector that received the LCT, even those sent from neighbor sectors.
    int pc_station;             ///<  0 -  5.  0 for ME1 subsector 1, 5 for neighbor hits.
    int pc_chamber;             ///<  0 -  8.
    int pc_segment;             ///<  0 -  3.
    int wire;                   ///<  0 - 111  For CSCs only.
    int strip;                  ///<  0 - 158  For CSCs only.
    int strip_hi;               ///<  ? -  ?.  For RPCs only, highest strip in a cluster.  (Range? - AWB 02.03.17)
    int strip_low;              ///<  ? -  ?.  For RPCs only, lowest strip in a cluster.  (Range? - AWB 02.03.17)
    int strip_quart;            ///< Run 3 CSC parameters
    int strip_eighth;           ///< Run 3 CSC parameters
    int strip_quart_bit;        ///< Run 3 CSC parameters
    int strip_eighth_bit;       ///< Run 3 CSC parameters
    int muon_shower_valid;      ///< Run 3 muon shower
    int muon_shower_inTime;     ///< Run 3 muon shower
    int muon_shower_outOfTime;  ///< Run 3 muon shower
    int track_num;              ///<  ? -  ?.  For CSCs only.  (Range? - AWB 02.03.17)
    int quality;                ///<  0 - 15.  For CSCs only.
    int pattern;                ///<  0 - 10.  For CSCs only.
    int pattern_run3;           ///< Run 3 For CSC only.
    int bend;                   ///<  0 or 1.  For CSCs only.
    int slope;                  ///<  Run 3 For CSC only.
    int valid;     ///<  0 or 1.  For CSCs only (for now; could use to flag failing clusters? - AWB 02.03.17)
    int sync_err;  ///<  0 or 1.  For CSCs only.
    // GEM specific
    int layer;  ///<  0 -   1.  For GEMs only, superchamber detector layer (1 or 2).
    // END GEM specific
    int bc0;           ///<  0 or 1.  Only from unpacked data? - AWB 02.03.17
    int bx;            ///< -3 - +3.
    int stub_num;      ///<  0 or 1.  Only from unpacked data? - AWB 02.03.17
    int phi_fp;        ///<  0 - 4920
    int theta_fp;      ///<  0 - 127
    int zone_hit;      ///<  4 - 156  (Range? - AWB 02.03.17)
    int zone_code;     ///<  0 - 12.  (Range? - AWB 02.03.17)
    int fs_segment;    ///<  0 - 13.  (Range? - AWB 02.03.17)
    int fs_zone_code;  ///<  1 - 14.  (Range? - AWB 02.03.17)
    int bt_station;    ///<  0 -  4.
    int bt_segment;    ///<  0 - 25.  (Range? - AWB 02.03.17)
    float phi_loc;     ///< -20 - 60  (Range? - AWB 02.03.17)
    float phi_glob;    ///< +/-180.
    float theta;       ///< 0 - 90.
    float eta;         ///< +/-2.5.
    float time;        ///<  ? -  ?.  RPC time information (ns)
    float phi_sim;     ///< +/-180.
    float theta_sim;   ///< 0 - 90.
    float eta_sim;     ///< +/-2.5.
    float rho_sim;     ///<  ? -  ?.
    float z_sim;       ///<  ? -  ?.
    int alct_quality;  ///<  1 -  3.  For emulated CSC LCTs only, maps to number of ALCT layers (4 - 6).
    int clct_quality;  ///<  4 -  6.  For emulated CSC LCTs only, maps to number of CLCT layers (4 - 6).

  };  // End of class EMTFHit

  // Define a vector of EMTFHit
  typedef std::vector<EMTFHit> EMTFHitCollection;

}  // End of namespace l1t

#endif /* define DataFormats_L1TMuon_EMTFHit_h */