Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // Package:    L1Trigger/Phase2L1GMT
0004 // Class:      Phase2L1TGMTSAMuonProducer
0005 // Original Author:  Michalis Bachtis
0006 
0007 #ifndef PHASE2GMT_KMTFPRODUCER
0008 #define PHASE2GMT_KMTFPRODUCER
0009 
0010 // system include files
0011 #include <memory>
0012 #include <sstream>
0013 
0014 // user include files
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 // class declaration
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   // ----------member data ---------------------------
0047   edm::EDGetTokenT<l1t::MuonStubCollection> stubToken_;
0048   std::unique_ptr<KMTF> kmtf_;
0049   unsigned int Nprompt;
0050   unsigned int Ndisplaced;
0051 };
0052 
0053 //
0054 // constants, enums and typedefs
0055 //
0056 
0057 //
0058 // static data member definitions
0059 //
0060 
0061 //
0062 // constructors and destructor
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 // member functions
0076 //
0077 
0078 // ------------ method called to produce the data  ------------
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   // KMTF
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 //define this as a plug-in
0160 DEFINE_FWK_MODULE(Phase2L1TGMTKMTFProducer);
0161 #endif