File indexing completed on 2025-06-03 00:12:13
0001 #include "FWCore/Framework/interface/stream/EDProducer.h"
0002 #include "FWCore/Framework/interface/Run.h"
0003 #include "FWCore/Framework/interface/EventSetup.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007 #include "FWCore/Utilities/interface/EDGetToken.h"
0008 #include "FWCore/Utilities/interface/EDPutToken.h"
0009 #include "FWCore/Utilities/interface/ESGetToken.h"
0010 #include "DataFormats/Common/interface/Handle.h"
0011 #include "DataFormats/DetId/interface/DetId.h"
0012
0013 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0014 #include "DataFormats/L1TrackTrigger/interface/TTDTC.h"
0015 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0016 #include "L1Trigger/TrackTrigger/interface/SensorModule.h"
0017 #include "L1Trigger/TrackerDTC/interface/LayerEncoding.h"
0018 #include "L1Trigger/TrackerDTC/interface/DTC.h"
0019 #include "L1Trigger/TrackerTFP/interface/DataFormats.h"
0020
0021 #include <numeric>
0022 #include <algorithm>
0023 #include <vector>
0024 #include <string>
0025 #include <memory>
0026
0027 namespace trackerDTC {
0028
0029
0030
0031
0032
0033
0034 class ProducerDTC : public edm::stream::EDProducer<> {
0035 public:
0036 explicit ProducerDTC(const edm::ParameterSet&);
0037 ~ProducerDTC() override = default;
0038
0039 private:
0040 void produce(edm::Event&, const edm::EventSetup&) override;
0041
0042 edm::EDGetTokenT<TTStubDetSetVec> edGetToken_;
0043
0044 edm::EDPutTokenT<TTDTC> edPutTokenAccepted_;
0045
0046 edm::EDPutTokenT<TTDTC> edPutTokenLost_;
0047
0048 edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0049
0050 edm::ESGetToken<trackerTFP::DataFormats, trackerTFP::DataFormatsRcd> esGetTokenDataFormats_;
0051
0052 edm::ESGetToken<LayerEncoding, tt::SetupRcd> esGetTokenLayerEncoding_;
0053 };
0054
0055 ProducerDTC::ProducerDTC(const edm::ParameterSet& iConfig) {
0056
0057 const auto& inputTag = iConfig.getParameter<edm::InputTag>("InputTag");
0058 const auto& branchAccepted = iConfig.getParameter<std::string>("BranchAccepted");
0059 const auto& branchLost = iConfig.getParameter<std::string>("BranchLost");
0060 edGetToken_ = consumes<TTStubDetSetVec>(inputTag);
0061 edPutTokenAccepted_ = produces<TTDTC>(branchAccepted);
0062 edPutTokenLost_ = produces<TTDTC>(branchLost);
0063
0064 esGetTokenSetup_ = esConsumes();
0065 esGetTokenDataFormats_ = esConsumes();
0066 esGetTokenLayerEncoding_ = esConsumes();
0067 }
0068
0069 void ProducerDTC::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0070
0071 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0072
0073 const trackerTFP::DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0074
0075 const LayerEncoding* layerEncoding = &iSetup.getData(esGetTokenLayerEncoding_);
0076
0077 TTDTC productAccepted = setup->ttDTC();
0078 TTDTC productLost = setup->ttDTC();
0079
0080 edm::Handle<TTStubDetSetVec> handle;
0081 iEvent.getByToken(edGetToken_, handle);
0082
0083 std::vector<std::vector<std::vector<TTStubRef>>> stubsDTCs(
0084 setup->numDTCs(), std::vector<std::vector<TTStubRef>>(setup->numModulesPerDTC()));
0085 for (auto module = handle->begin(); module != handle->end(); module++) {
0086
0087 const DetId detId = module->detId() + setup->offsetDetIdDSV();
0088
0089 tt::SensorModule* sm = setup->sensorModule(detId);
0090
0091 std::vector<TTStubRef>& stubsModule = stubsDTCs[sm->dtcId()][sm->modId()];
0092 stubsModule.reserve(module->size());
0093 for (TTStubDetSet::const_iterator ttStub = module->begin(); ttStub != module->end(); ttStub++)
0094 stubsModule.emplace_back(makeRefTo(handle, ttStub));
0095 }
0096
0097 for (int dtcId = 0; dtcId < setup->numDTCs(); dtcId++) {
0098
0099 DTC dtc(setup, dataFormats, layerEncoding, dtcId, stubsDTCs.at(dtcId));
0100
0101 dtc.produce(productAccepted, productLost);
0102 }
0103
0104 iEvent.emplace(edPutTokenAccepted_, std::move(productAccepted));
0105 iEvent.emplace(edPutTokenLost_, std::move(productLost));
0106 }
0107
0108 }
0109
0110 DEFINE_FWK_MODULE(trackerDTC::ProducerDTC);