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
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
0062
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
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,
0081 stub.coord2() / 256,
0082 stub.id(),
0083 stub.bxNum(),
0084 0x3,
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
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
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
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
0130 void Phase2L1TGMTStubProducer::beginStream(edm::StreamID) {}
0131
0132
0133 void Phase2L1TGMTStubProducer::endStream() {}
0134
0135 void Phase2L1TGMTStubProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0136
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
0221 DEFINE_FWK_MODULE(Phase2L1TGMTStubProducer);