Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-07-18 23:17:51

0001 #include <memory>
0002 #include "FWCore/Framework/interface/Frameworkfwd.h"
0003 #include "FWCore/Framework/interface/stream/EDProducer.h"
0004 
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/Utilities/interface/StreamID.h"
0010 
0011 #include "L1Trigger/Phase2L1GMT/interface/L1TPhase2GMTEndcapStubProcessor.h"
0012 #include "L1Trigger/Phase2L1GMT/interface/L1TPhase2GMTBarrelStubProcessor.h"
0013 
0014 #include "FWCore/Framework/interface/EventSetup.h"
0015 #include "FWCore/Framework/interface/ConsumesCollector.h"
0016 #include "FWCore/Framework/interface/ESProducts.h"
0017 #include "FWCore/Utilities/interface/ESGetToken.h"
0018 //
0019 // class declaration
0020 //
0021 
0022 class Phase2L1TGMTStubProducer : public edm::stream::EDProducer<> {
0023 public:
0024   explicit Phase2L1TGMTStubProducer(const edm::ParameterSet&);
0025   ~Phase2L1TGMTStubProducer() override;
0026 
0027   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0028 
0029 private:
0030   void beginStream(edm::StreamID) override;
0031   void produce(edm::Event&, const edm::EventSetup&) override;
0032   void endStream() override;
0033   l1t::MuonStub convertToHybrid(const l1t::MuonStub& stub);
0034   edm::EDGetTokenT<MuonDigiCollection<CSCDetId, CSCCorrelatedLCTDigi>> srcCSC_;
0035   edm::EDGetTokenT<L1Phase2MuDTPhContainer> srcDT_;
0036   edm::EDGetTokenT<L1MuDTChambThContainer> srcDTTheta_;
0037   edm::EDGetTokenT<RPCDigiCollection> srcRPC_;
0038 
0039   L1TPhase2GMTEndcapStubProcessor* procEndcap_;
0040   L1TPhase2GMTBarrelStubProcessor* procBarrel_;
0041   L1TMuon::GeometryTranslator* translator_;
0042   int verbose_;
0043 };
0044 
0045 Phase2L1TGMTStubProducer::Phase2L1TGMTStubProducer(const edm::ParameterSet& iConfig)
0046     : srcCSC_(
0047           consumes<MuonDigiCollection<CSCDetId, CSCCorrelatedLCTDigi>>(iConfig.getParameter<edm::InputTag>("srcCSC"))),
0048       srcDT_(consumes<L1Phase2MuDTPhContainer>(iConfig.getParameter<edm::InputTag>("srcDT"))),
0049       srcDTTheta_(consumes<L1MuDTChambThContainer>(iConfig.getParameter<edm::InputTag>("srcDTTheta"))),
0050       srcRPC_(consumes<RPCDigiCollection>(iConfig.getParameter<edm::InputTag>("srcRPC"))),
0051       procEndcap_(new L1TPhase2GMTEndcapStubProcessor(iConfig.getParameter<edm::ParameterSet>("Endcap"))),
0052       procBarrel_(new L1TPhase2GMTBarrelStubProcessor(iConfig.getParameter<edm::ParameterSet>("Barrel"))),
0053       verbose_(iConfig.getParameter<int>("verbose")) {
0054   produces<l1t::MuonStubCollection>("kmtf");
0055   produces<l1t::MuonStubCollection>("tps");
0056   edm::ConsumesCollector consumesColl(consumesCollector());
0057   translator_ = new L1TMuon::GeometryTranslator(consumesColl);
0058 }
0059 
0060 Phase2L1TGMTStubProducer::~Phase2L1TGMTStubProducer() {
0061   // do anything here that needs to be done at destruction time
0062   // (e.g. close files, deallocate resources etc.)
0063   if (procEndcap_ != nullptr)
0064     delete procEndcap_;
0065   if (procBarrel_ != nullptr)
0066     delete procBarrel_;
0067   if (translator_ != nullptr)
0068     delete translator_;
0069 }
0070 
0071 //
0072 // member functions
0073 //
0074 
0075 l1t::MuonStub Phase2L1TGMTStubProducer::convertToHybrid(const l1t::MuonStub& stub) {
0076   l1t::MuonStub hybrid(stub.etaRegion(),
0077                        stub.phiRegion(),
0078                        stub.depthRegion(),
0079                        stub.tfLayer(),
0080                        stub.coord1() / 256,  //for track matching was 1024
0081                        stub.coord2() / 256,  //for track matching was 1024
0082                        stub.id(),
0083                        stub.bxNum(),
0084                        0x3,  //for track matching
0085                        stub.eta1(),
0086                        stub.eta2(),
0087                        stub.etaQuality(),
0088                        stub.type());
0089   hybrid.setOfflineQuantities(stub.offline_coord1(), stub.offline_coord2(), stub.offline_eta1(), stub.offline_eta2());
0090   return hybrid;
0091 }
0092 
0093 // ------------ method called to produce the data  ------------
0094 void Phase2L1TGMTStubProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0095   using namespace edm;
0096   translator_->checkAndUpdateGeometry(iSetup);
0097 
0098   Handle<MuonDigiCollection<CSCDetId, CSCCorrelatedLCTDigi>> cscDigis;
0099   iEvent.getByToken(srcCSC_, cscDigis);
0100 
0101   Handle<RPCDigiCollection> rpcDigis;
0102   iEvent.getByToken(srcRPC_, rpcDigis);
0103 
0104   Handle<L1Phase2MuDTPhContainer> dtDigis;
0105   iEvent.getByToken(srcDT_, dtDigis);
0106 
0107   Handle<L1MuDTChambThContainer> dtThetaDigis;
0108   iEvent.getByToken(srcDTTheta_, dtThetaDigis);
0109 
0110   //Generate a unique stub ID
0111   l1t::MuonStubCollection stubs;
0112   l1t::MuonStubCollection stubsKMTF;
0113 
0114   l1t::MuonStubCollection stubsEndcap = procEndcap_->makeStubs(*cscDigis, *rpcDigis, translator_, iSetup);
0115   for (auto& stub : stubsEndcap) {
0116     stubs.push_back(stub);
0117   }
0118   l1t::MuonStubCollection stubsBarrel = procBarrel_->makeStubs(dtDigis.product(), dtThetaDigis.product());
0119   for (auto& stub : stubsBarrel) {
0120     //convert to Hybrid
0121     stubs.push_back(convertToHybrid(stub));
0122     stubsKMTF.push_back(stub);
0123   }
0124 
0125   iEvent.put(std::make_unique<l1t::MuonStubCollection>(stubs), "tps");
0126   iEvent.put(std::make_unique<l1t::MuonStubCollection>(stubsKMTF), "kmtf");
0127 }
0128 
0129 // ------------ method called once each stream before processing any runs, lumis or events  ------------
0130 void Phase2L1TGMTStubProducer::beginStream(edm::StreamID) {}
0131 
0132 // ------------ method called once each stream after processing all runs, lumis and events  ------------
0133 void Phase2L1TGMTStubProducer::endStream() {}
0134 
0135 void Phase2L1TGMTStubProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0136   // gmtStubs
0137   edm::ParameterSetDescription desc;
0138   desc.add<int>("verbose", 0);
0139   desc.add<edm::InputTag>("srcCSC", edm::InputTag("simCscTriggerPrimitiveDigis"));
0140   desc.add<edm::InputTag>("srcDT", edm::InputTag("dtTriggerPhase2PrimitiveDigis"));
0141   desc.add<edm::InputTag>("srcDTTheta", edm::InputTag("simDtTriggerPrimitiveDigis"));
0142   desc.add<edm::InputTag>("srcRPC", edm::InputTag("simMuonRPCDigis"));
0143   {
0144     edm::ParameterSetDescription psd0;
0145     psd0.add<unsigned int>("verbose", 0);
0146     psd0.add<int>("minBX", 0);
0147     psd0.add<int>("maxBX", 0);
0148     psd0.add<double>("coord1LSB", 0.02453124992);
0149     psd0.add<double>("eta1LSB", 0.024586688);
0150     psd0.add<double>("coord2LSB", 0.02453124992);
0151     psd0.add<double>("eta2LSB", 0.024586688);
0152     psd0.add<double>("phiMatch", 0.05);
0153     psd0.add<double>("etaMatch", 0.1);
0154     desc.add<edm::ParameterSetDescription>("Endcap", psd0);
0155   }
0156   {
0157     edm::ParameterSetDescription psd0;
0158     psd0.add<int>("verbose", 0);
0159     psd0.add<int>("minPhiQuality", 0);
0160     psd0.add<int>("minThetaQuality", 0);
0161     psd0.add<int>("minBX", 0);
0162     psd0.add<int>("maxBX", 0);
0163     psd0.add<double>("phiLSB", 0.02453124992);
0164     psd0.add<int>("phiBDivider", 16);
0165     psd0.add<double>("etaLSB", 0.024586688);
0166     psd0.add<std::vector<int>>(
0167         "eta_1",
0168         {
0169             -46, -45, -43, -41, -39, -37, -35, -30, -28, -26, -23, -20, -18, -15, -9, -6, -3, -1,
0170             1,   3,   6,   9,   15,  18,  20,  23,  26,  28,  30,  35,  37,  39,  41, 43, 45, 1503,
0171         });
0172     psd0.add<std::vector<int>>(
0173         "eta_2",
0174         {
0175             -41, -39, -38, -36, -34, -32, -30, -26, -24, -22, -20, -18, -15, -13, -8, -5, -3, -1,
0176             1,   3,   5,   8,   13,  15,  18,  20,  22,  24,  26,  30,  32,  34,  36, 38, 39, 1334,
0177         });
0178     psd0.add<std::vector<int>>(
0179         "eta_3",
0180         {
0181             -35, -34, -32, -31, -29, -27, -26, -22, -20, -19, -17, -15, -13, -11, -6, -4, -2, -1,
0182             1,   2,   4,   6,   11,  13,  15,  17,  19,  20,  22,  26,  27,  29,  31, 32, 34, 1148,
0183         });
0184     psd0.add<std::vector<int>>("coarseEta_1",
0185                                {
0186                                    0,
0187                                    23,
0188                                    41,
0189                                });
0190     psd0.add<std::vector<int>>("coarseEta_2",
0191                                {
0192                                    0,
0193                                    20,
0194                                    36,
0195                                });
0196     psd0.add<std::vector<int>>("coarseEta_3",
0197                                {
0198                                    0,
0199                                    17,
0200                                    31,
0201                                });
0202     psd0.add<std::vector<int>>("coarseEta_4",
0203                                {
0204                                    0,
0205                                    14,
0206                                    27,
0207                                });
0208     psd0.add<std::vector<int>>("phiOffset",
0209                                {
0210                                    1,
0211                                    0,
0212                                    0,
0213                                    0,
0214                                });
0215     desc.add<edm::ParameterSetDescription>("Barrel", psd0);
0216   }
0217   descriptions.add("gmtStubs", desc);
0218 }
0219 
0220 //define this as a plug-in
0221 DEFINE_FWK_MODULE(Phase2L1TGMTStubProducer);