Back to home page

Project CMSSW displayed by LXR

 
 

    


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   /*! \class  trackerDTC::ProducerDTC
0030    *  \brief  Class to produce hardware like structured TTStub Collection used by Track Trigger emulators
0031    *  \author Thomas Schuh
0032    *  \date   2020, Jan
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     // ED input token of TTStubs
0042     edm::EDGetTokenT<TTStubDetSetVec> edGetToken_;
0043     // ED output token for accepted stubs
0044     edm::EDPutTokenT<TTDTC> edPutTokenAccepted_;
0045     // ED output token for lost stubs
0046     edm::EDPutTokenT<TTDTC> edPutTokenLost_;
0047     // Setup token
0048     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0049     // DataFormats token
0050     edm::ESGetToken<trackerTFP::DataFormats, trackerTFP::DataFormatsRcd> esGetTokenDataFormats_;
0051     // LayerEncoding token
0052     edm::ESGetToken<LayerEncoding, tt::SetupRcd> esGetTokenLayerEncoding_;
0053   };
0054 
0055   ProducerDTC::ProducerDTC(const edm::ParameterSet& iConfig) {
0056     // book in- and output ED products
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     // book ES products
0064     esGetTokenSetup_ = esConsumes();
0065     esGetTokenDataFormats_ = esConsumes();
0066     esGetTokenLayerEncoding_ = esConsumes();
0067   }
0068 
0069   void ProducerDTC::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0070     // helper class to store configurations
0071     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0072     // helper class to extract structured data from tt::Frames
0073     const trackerTFP::DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0074     // class to encode layer ids used between DTC and TFP in Hybrid
0075     const LayerEncoding* layerEncoding = &iSetup.getData(esGetTokenLayerEncoding_);
0076     // empty DTC products
0077     TTDTC productAccepted = setup->ttDTC();
0078     TTDTC productLost = setup->ttDTC();
0079     // read in stub collection
0080     edm::Handle<TTStubDetSetVec> handle;
0081     iEvent.getByToken(edGetToken_, handle);
0082     // apply cabling map, reorganise stub collections
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       // DetSetVec->detId + 1 = tk layout det id
0087       const DetId detId = module->detId() + setup->offsetDetIdDSV();
0088       // corresponding sensor module
0089       tt::SensorModule* sm = setup->sensorModule(detId);
0090       // empty stub collection
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     // board level processing
0097     for (int dtcId = 0; dtcId < setup->numDTCs(); dtcId++) {
0098       // create single outer tracker DTC board
0099       DTC dtc(setup, dataFormats, layerEncoding, dtcId, stubsDTCs.at(dtcId));
0100       // route stubs and fill products
0101       dtc.produce(productAccepted, productLost);
0102     }
0103     // store ED products
0104     iEvent.emplace(edPutTokenAccepted_, std::move(productAccepted));
0105     iEvent.emplace(edPutTokenLost_, std::move(productLost));
0106   }
0107 
0108 }  // namespace trackerDTC
0109 
0110 DEFINE_FWK_MODULE(trackerDTC::ProducerDTC);