File indexing completed on 2025-04-02 23:19:45
0001 #ifndef L1Trigger_Phase2GMT_TPSAlgorithm_h
0002 #define L1Trigger_Phase2GMT_TPSAlgorithm_h
0003
0004 #include "DataFormats/L1TrackTrigger/interface/TTTrack.h"
0005 #include "DataFormats/L1TrackTrigger/interface/TTTrack_TrackWord.h"
0006 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0007 #include "DataFormats/L1TMuonPhase2/interface/MuonStub.h"
0008 #include "DataFormats/L1TMuonPhase2/interface/TrackerMuon.h"
0009 #include "DataFormats/L1TMuonPhase2/interface/SAMuon.h"
0010 #include "DataFormats/L1Trigger/interface/L1TObjComparison.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "L1Trigger/Phase2L1GMT/interface/ConvertedTTTrack.h"
0013 #include "L1Trigger/Phase2L1GMT/interface/PreTrackMatchedMuon.h"
0014 #include "L1Trigger/Phase2L1GMT/interface/TPSLUTs.h"
0015 #include <iostream>
0016
0017 namespace Phase2L1GMT {
0018
0019 const unsigned int PHISHIFT = BITSPHI - BITSSTUBCOORD;
0020 const unsigned int ETADIVIDER = 1 << (BITSETA - BITSSTUBETA);
0021 const unsigned int BITSHIFTPROP1C1 = 9;
0022 const unsigned int BITSHIFTPROP2C1 = 23;
0023 const unsigned int BITSHIFTPROP3C1 = 22;
0024 const unsigned int BITSHIFTPROP1C2 = 9;
0025 const unsigned int BITSHIFTPROP2C2 = 24;
0026 const unsigned int BITSHIFTPROP3C2 = 19;
0027 const unsigned int BITSHIFTRES1 = 11;
0028
0029
0030
0031 const unsigned int BITSHIFTCURVSCALEC1 = 12;
0032 const unsigned int BITSHIFTCURVSCALEC2LEADS[5] = {10, 13, 12, 11, 12};
0033 const unsigned int BITSHIFTCURVSCALEC2CORRS[5] = {0, 10, 0, 0, 0};
0034
0035 const unsigned int BITSPROP = BITSPHI - 2;
0036 const ap_uint<BITSPROP> PROPMAX = ~ap_uint<BITSPROP>(0);
0037 const ap_uint<BITSSIGMACOORD> SIGMAMAX = ~ap_uint<BITSSIGMACOORD>(0);
0038 const ap_uint<BITSSIGMACOORD> SIGMAMIN = 2;
0039
0040 struct propagation_t {
0041 ap_int<BITSSTUBCOORD> coord1;
0042 ap_uint<BITSSIGMACOORD> sigma_coord1;
0043 ap_int<BITSSTUBCOORD> coord2;
0044 ap_uint<BITSSIGMACOORD> sigma_coord2;
0045 ap_int<BITSSTUBETA> eta;
0046 ap_uint<BITSSIGMAETA> sigma_eta1;
0047 ap_uint<BITSSIGMAETA> sigma_eta2;
0048 ap_uint<1> valid;
0049 ap_uint<1> is_barrel;
0050 };
0051
0052 struct match_t {
0053 ap_uint<BITSMATCHQUALITY - 2> quality;
0054 ap_uint<BITSSTUBID> id;
0055 ap_uint<2> valid;
0056 bool isGlobal = false;
0057 l1t::SAMuonRef muRef;
0058 l1t::MuonStubRef stubRef;
0059 };
0060
0061 class TPSAlgorithm {
0062 public:
0063 explicit TPSAlgorithm(const edm::ParameterSet& iConfig);
0064 TPSAlgorithm() = delete;
0065 ~TPSAlgorithm() = default;
0066
0067 std::vector<PreTrackMatchedMuon> processNonant(const std::vector<ConvertedTTTrack>& convertedTracks,
0068 const l1t::MuonStubRefVector& stubs) const;
0069
0070 std::vector<PreTrackMatchedMuon> cleanNeighbor(const std::vector<PreTrackMatchedMuon>& muons,
0071 const std::vector<PreTrackMatchedMuon>& muonsPrevious,
0072 const std::vector<PreTrackMatchedMuon>& muonsNext,
0073 bool equality) const;
0074 std::vector<l1t::TrackerMuon> convert(const std::vector<PreTrackMatchedMuon>& muons, uint maximum) const;
0075 bool outputGT(std::vector<l1t::TrackerMuon>& muons) const;
0076 void SetQualityBits(std::vector<l1t::TrackerMuon>& muons) const;
0077 std::vector<l1t::TrackerMuon> sort(std::vector<l1t::TrackerMuon>& muons, uint maximum) const;
0078
0079 private:
0080 int verbose_;
0081 propagation_t propagate(const ConvertedTTTrack& track, uint layer) const;
0082 ap_uint<BITSSIGMAETA + 1> deltaEta(const ap_int<BITSSTUBETA>& eta1, const ap_int<BITSSTUBETA>& eta2) const;
0083 ap_uint<BITSSIGMACOORD + 1> deltaCoord(const ap_int<BITSSTUBCOORD>& phi1, const ap_int<BITSSTUBCOORD>& phi2) const;
0084 match_t match(const propagation_t prop, const l1t::MuonStubRef& stub, uint trackID) const;
0085 match_t propagateAndMatch(const ConvertedTTTrack& track, const l1t::MuonStubRef& stub, uint trackID) const;
0086 match_t getBest(const std::vector<match_t>& matches) const;
0087 PreTrackMatchedMuon processTrack(const ConvertedTTTrack&, const l1t::MuonStubRefVector&) const;
0088 ap_uint<5> cleanMuon(const PreTrackMatchedMuon& mu, const PreTrackMatchedMuon& other, bool eq) const;
0089 void matchingInfos(const std::vector<match_t>& matchInfo,
0090 PreTrackMatchedMuon& muon,
0091 ap_uint<BITSMATCHQUALITY>& quality) const;
0092 std::vector<PreTrackMatchedMuon> clean(const std::vector<PreTrackMatchedMuon>& muons) const;
0093 };
0094 }
0095
0096 #endif