File indexing completed on 2024-10-08 05:11:50
0001
0002
0003
0004
0005
0006
0007 #ifndef PHASE2GMT_KMTFPRODUCER
0008 #define PHASE2GMT_KMTFPRODUCER
0009
0010
0011 #include <memory>
0012 #include <sstream>
0013
0014
0015 #include "FWCore/Framework/interface/Frameworkfwd.h"
0016 #include "FWCore/Framework/interface/stream/EDProducer.h"
0017
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/Framework/interface/MakerMacros.h"
0020
0021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0022 #include "FWCore/Utilities/interface/StreamID.h"
0023
0024 #include "DataFormats/L1Trigger/interface/Muon.h"
0025 #include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
0026 #include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
0027
0028 #include "DataFormats/L1TMuonPhase2/interface/Constants.h"
0029 #include "L1Trigger/Phase2L1GMT/interface/KMTF.h"
0030 #include "DataFormats/L1TMuonPhase2/interface/SAMuon.h"
0031
0032
0033
0034
0035 using namespace Phase2L1GMT;
0036 using namespace l1t;
0037
0038 class Phase2L1TGMTKMTFProducer : public edm::stream::EDProducer<> {
0039 public:
0040 explicit Phase2L1TGMTKMTFProducer(const edm::ParameterSet&);
0041 ~Phase2L1TGMTKMTFProducer() override = default;
0042
0043 private:
0044 void produce(edm::Event&, const edm::EventSetup&) override;
0045
0046
0047 edm::EDGetTokenT<l1t::MuonStubCollection> stubToken_;
0048 std::unique_ptr<KMTF> kmtf_;
0049 unsigned int Nprompt;
0050 unsigned int Ndisplaced;
0051 };
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 Phase2L1TGMTKMTFProducer::Phase2L1TGMTKMTFProducer(const edm::ParameterSet& iConfig)
0065 : stubToken_(consumes<l1t::MuonStubCollection>(iConfig.getParameter<edm::InputTag>("stubs"))),
0066 kmtf_(new KMTF(iConfig.getParameter<int>("verbose"), iConfig.getParameter<edm::ParameterSet>("algo"))),
0067 Nprompt(iConfig.getParameter<uint>("Nprompt")),
0068 Ndisplaced(iConfig.getParameter<uint>("Ndisplaced")) {
0069 produces<std::vector<l1t::SAMuon> >("prompt").setBranchAlias("prompt");
0070 produces<std::vector<l1t::SAMuon> >("displaced").setBranchAlias("displaced");
0071 produces<std::vector<l1t::KMTFTrack> >("kmtfTracks");
0072 }
0073
0074
0075
0076
0077
0078
0079 void Phase2L1TGMTKMTFProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0080 using namespace edm;
0081 edm::Handle<l1t::MuonStubCollection> stubHandle;
0082 iEvent.getByToken(stubToken_, stubHandle);
0083
0084 l1t::MuonStubRefVector stubs;
0085 for (uint i = 0; i < stubHandle->size(); ++i) {
0086 l1t::MuonStubRef stub(stubHandle, i);
0087 if (stub->bxNum() == 0)
0088 stubs.push_back(stub);
0089 }
0090
0091
0092 std::vector<SAMuon> prompt;
0093 std::vector<SAMuon> displaced;
0094 std::pair<std::vector<l1t::KMTFTrack>, std::vector<l1t::KMTFTrack> > kmtfOutput = kmtf_->process(stubs, 0, 32);
0095 std::vector<l1t::KMTFTrack> kmtfTracks;
0096 for (const auto& track : kmtfOutput.first) {
0097 kmtfTracks.push_back(track);
0098 l1t::SAMuon p(track.p4(),
0099 (track.curvatureAtVertex() < 0),
0100 track.ptPrompt(),
0101 track.coarseEta(),
0102 track.phiAtMuon() / (1 << 5),
0103 0,
0104 0,
0105 track.stubs().size() - 1);
0106 p.setTF(l1t::tftype::bmtf);
0107 int bstart = 0;
0108 wordtype word(0);
0109 bstart = wordconcat<wordtype>(word, bstart, 1, 1);
0110 bstart = wordconcat<wordtype>(word, bstart, p.hwCharge(), 1);
0111 bstart = wordconcat<wordtype>(word, bstart, p.hwPt(), BITSPT);
0112 bstart = wordconcat<wordtype>(word, bstart, p.hwPhi(), BITSPHI);
0113 bstart = wordconcat<wordtype>(word, bstart, p.hwEta(), BITSETA);
0114 bstart = wordconcat<wordtype>(word, bstart, p.hwD0(), BITSSAD0);
0115 wordconcat<wordtype>(word, bstart, track.rankPrompt(), 8);
0116
0117 for (const auto& stub : track.stubs())
0118 p.addStub(stub);
0119 p.setWord(word);
0120 prompt.push_back(p);
0121 }
0122
0123 for (const auto& track : kmtfOutput.second) {
0124 kmtfTracks.push_back(track);
0125 ap_int<7> dxy = track.dxy() * ap_ufixed<8, 1>(1.606);
0126 l1t::SAMuon p(track.displacedP4(),
0127 (track.curvatureAtMuon() < 0),
0128 track.ptDisplaced(),
0129 track.coarseEta(),
0130 track.phiAtMuon() / (1 << 5),
0131 0,
0132 dxy,
0133 track.approxDispChi2());
0134 p.setTF(l1t::tftype::bmtf);
0135 int bstart = 0;
0136 wordtype word(0);
0137 bstart = wordconcat<wordtype>(word, bstart, 1, 1);
0138 bstart = wordconcat<wordtype>(word, bstart, p.hwCharge(), 1);
0139 bstart = wordconcat<wordtype>(word, bstart, p.hwPt(), BITSPT);
0140 bstart = wordconcat<wordtype>(word, bstart, p.hwPhi(), BITSPHI);
0141 bstart = wordconcat<wordtype>(word, bstart, p.hwEta(), BITSETA);
0142 bstart = wordconcat<wordtype>(word, bstart, p.hwD0(), BITSSAD0);
0143 wordconcat<wordtype>(word, bstart, track.rankDisp(), 8);
0144
0145 for (const auto& stub : track.stubs()) {
0146 p.addStub(stub);
0147 }
0148 p.setWord(word);
0149 displaced.push_back(p);
0150 }
0151 std::unique_ptr<std::vector<l1t::SAMuon> > prompt_ptr = std::make_unique<std::vector<l1t::SAMuon> >(prompt);
0152 std::unique_ptr<std::vector<l1t::SAMuon> > displaced_ptr = std::make_unique<std::vector<l1t::SAMuon> >(displaced);
0153 std::unique_ptr<std::vector<l1t::KMTFTrack> > kmtf_ptr = std::make_unique<std::vector<l1t::KMTFTrack> >(kmtfTracks);
0154 iEvent.put(std::move(prompt_ptr), "prompt");
0155 iEvent.put(std::move(displaced_ptr), "displaced");
0156 iEvent.put(std::move(kmtf_ptr), "kmtfTracks");
0157 }
0158
0159
0160 DEFINE_FWK_MODULE(Phase2L1TGMTKMTFProducer);
0161 #endif