Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-08 05:11:50

0001 #ifndef PHASE2GMT_PRETRACKMATCHEDMUON
0002 #define PHASE2GMT_PRETRACKMATCHEDMUON
0003 
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #include "DataFormats/L1TMuonPhase2/interface/Constants.h"
0006 #include "DataFormats/L1TMuonPhase2/interface/MuonStub.h"
0007 #include "DataFormats/L1TMuonPhase2/interface/SAMuon.h"
0008 #include "DataFormats/Common/interface/Ptr.h"
0009 #include "DataFormats/L1TrackTrigger/interface/TTTrack.h"
0010 #include "DataFormats/L1TrackTrigger/interface/TTStub.h"
0011 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0012 #include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h"
0013 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0014 #include "DataFormats/L1Trigger/interface/Vertex.h"
0015 
0016 #include <vector>
0017 
0018 namespace Phase2L1GMT {
0019 
0020   class PreTrackMatchedMuon {
0021   public:
0022     PreTrackMatchedMuon(const uint& charge,
0023                         const uint& pt,
0024                         const int& eta,
0025                         const int& phi,
0026                         const int& z0,
0027                         const int& d0,
0028                         const uint& beta = 15)
0029         : charge_(charge),
0030           pt_(pt),
0031           eta_(eta),
0032           phi_(phi),
0033           z0_(z0),
0034           d0_(d0),
0035           beta_(beta),
0036           isGlobal_(false),
0037           quality_(0),
0038           stubID0_(4095),
0039           stubID1_(4095),
0040           stubID2_(4095),
0041           stubID3_(4095),
0042           stubID4_(4095),
0043           matchMask_(0),
0044           valid_(false) {}
0045 
0046     const uint charge() const { return charge_; }
0047     const uint pt() const { return pt_; }
0048     const int eta() const { return eta_; }
0049     const int phi() const { return phi_; }
0050     const int z0() const { return z0_; }
0051     const int d0() const { return d0_; }
0052     const uint beta() const { return beta_; }
0053 
0054     bool isGlobalMuon() const { return isGlobal_; }
0055     const int quality() const { return quality_; }
0056     const int offline_pt() const { return offline_pt_; }
0057     const float offline_eta() const { return offline_eta_; }
0058     const float offline_phi() const { return offline_phi_; }
0059 
0060     const uint stubID0() const { return stubID0_; }
0061     const uint stubID1() const { return stubID1_; }
0062     const uint stubID2() const { return stubID2_; }
0063     const uint stubID3() const { return stubID3_; }
0064     const uint stubID4() const { return stubID4_; }
0065     const uint matchMask() const { return matchMask_; }
0066 
0067     bool valid() const { return valid_; }
0068 
0069     void setQuality(uint quality) { quality_ = quality; }
0070     void setValid(bool v) { valid_ = v; }
0071 
0072     void setOfflineQuantities(float pt, float eta, float phi) {
0073       offline_pt_ = pt;
0074       offline_eta_ = eta;
0075       offline_phi_ = phi;
0076     }
0077 
0078     void addMuonRef(const l1t::SAMuonRef& ref) { muRef_.push_back(ref); }
0079 
0080     void resetGlobal() { isGlobal_ = false; }
0081 
0082     const l1t::SAMuonRefVector& muonRef() const { return muRef_; }
0083     void addStub(const l1t::MuonStubRef& stub, uint mask) {
0084       stubs_.push_back(stub);
0085       if (stub->tfLayer() == 0) {
0086         stubID0_ = stub->address();
0087         matchMask_ = matchMask_ | (mask);
0088       } else if (stub->tfLayer() == 1) {
0089         stubID1_ = stub->address();
0090         matchMask_ = matchMask_ | (mask << 2);
0091       } else if (stub->tfLayer() == 2) {
0092         stubID2_ = stub->address();
0093         matchMask_ = matchMask_ | (mask << 4);
0094       } else if (stub->tfLayer() == 3) {
0095         stubID3_ = stub->address();
0096         matchMask_ = matchMask_ | (mask << 6);
0097       } else if (stub->tfLayer() == 4) {
0098         stubID4_ = stub->address();
0099         matchMask_ = matchMask_ | (mask << 8);
0100       }
0101     }
0102 
0103     const l1t::MuonStubRefVector& stubs() const { return stubs_; }
0104 
0105     void setTrkPtr(const edm::Ptr<TTTrack<Ref_Phase2TrackerDigi_> >& trkPtr) { trkPtr_ = trkPtr; }
0106 
0107     const edm::Ptr<TTTrack<Ref_Phase2TrackerDigi_> > trkPtr() const { return trkPtr_; }
0108 
0109     void print() const {
0110       LogDebug("PreTrackMatchedMuon") << "preconstructed muon : charge=" << charge_ << " pt=" << offline_pt_ << ","
0111                                       << pt_ << " eta=" << offline_eta_ << "," << eta_ << " phi=" << offline_phi_ << ","
0112                                       << phi_ << " z0=" << z0_ << " d0=" << d0_ << " quality=" << quality_
0113                                       << " isGlobal=" << isGlobal_ << " valid=" << valid_ << " stubs: " << stubID0_
0114                                       << " " << stubID1_ << " " << stubID2_ << " " << stubID3_ << " " << stubID4_;
0115     }
0116 
0117     uint64_t lsb() const {
0118       wordtype w = 0;
0119       int bstart = 0;
0120       bstart = wordconcat<wordtype>(w, bstart, charge_ & 0x1, 1);
0121       bstart = wordconcat<wordtype>(w, bstart, pt_, BITSPT);
0122       bstart = wordconcat<wordtype>(w, bstart, phi_, BITSPHI);
0123       bstart = wordconcat<wordtype>(w, bstart, eta_, BITSETA);
0124       bstart = wordconcat<wordtype>(w, bstart, z0_, BITSZ0);
0125       wordconcat<wordtype>(w, bstart, d0_, BITSD0);
0126       return w.to_int();
0127     }
0128 
0129     uint64_t msb() const {
0130       wordtype w2 = 0;
0131       int bstart = 0;
0132       bstart = wordconcat<wordtype>(w2, bstart, stubID0_, BITSSTUBID);
0133       bstart = wordconcat<wordtype>(w2, bstart, stubID1_, BITSSTUBID);
0134       bstart = wordconcat<wordtype>(w2, bstart, stubID2_, BITSSTUBID);
0135       bstart = wordconcat<wordtype>(w2, bstart, stubID3_, BITSSTUBID);
0136       bstart = wordconcat<wordtype>(w2, bstart, stubID4_, BITSSTUBID);
0137       bstart = wordconcat<wordtype>(w2, bstart, isGlobal_, 1);
0138       bstart = wordconcat<wordtype>(w2, bstart, beta_, BITSMUONBETA);
0139       bstart = wordconcat<wordtype>(w2, bstart, quality_, BITSMATCHQUALITY);
0140       wordconcat<wordtype>(w2, bstart, valid_, 1);
0141 
0142       return w2.to_int();
0143     }
0144 
0145     void printWord() const {
0146       LogDebug("PreTrackMatchedMuon") << "PreTrackMatchedMuon : word=" << std::setfill('0') << std::setw(16) << std::hex
0147                                       << (long long unsigned int)(msb() >> 2) << std::setfill('0') << std::setw(16)
0148                                       << std::hex
0149                                       << (long long unsigned int)((lsb() | (msb() << 62)) & 0xffffffffffffffff);
0150     }
0151 
0152   private:
0153     uint charge_;
0154     uint pt_;
0155     int eta_;
0156     int phi_;
0157     int z0_;
0158     int d0_;
0159     uint beta_;
0160     bool isGlobal_;
0161     uint quality_;
0162     float offline_pt_;
0163     float offline_eta_;
0164     float offline_phi_;
0165     uint stubID0_;
0166     uint stubID1_;
0167     uint stubID2_;
0168     uint stubID3_;
0169     uint stubID4_;
0170     uint matchMask_;
0171 
0172     bool valid_;
0173     l1t::MuonStubRefVector stubs_;
0174     l1t::SAMuonRefVector muRef_;
0175     edm::Ptr<TTTrack<Ref_Phase2TrackerDigi_> > trkPtr_;
0176   };
0177 }  // namespace Phase2L1GMT
0178 
0179 #endif