Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-03 00:12:21

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/Utilities/interface/EDGetToken.h"
0007 #include "FWCore/Utilities/interface/EDPutToken.h"
0008 #include "FWCore/Utilities/interface/ESGetToken.h"
0009 #include "FWCore/Utilities/interface/InputTag.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "DataFormats/Common/interface/Handle.h"
0012 
0013 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0014 #include "L1Trigger/TrackFindingTracklet/interface/ChannelAssignment.h"
0015 #include "L1Trigger/TrackFindingTracklet/interface/DataFormats.h"
0016 #include "L1Trigger/TrackFindingTracklet/interface/Settings.h"
0017 #include "L1Trigger/TrackFindingTracklet/interface/TrackMultiplexer.h"
0018 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0019 
0020 #include <string>
0021 #include <vector>
0022 #include <deque>
0023 #include <iterator>
0024 #include <cmath>
0025 #include <numeric>
0026 
0027 namespace trklet {
0028 
0029   /*! \class  trklet::ProducerTM
0030    *  \brief  Transforms format of Track Builder into that expected by DR input and muxes all channels to 1.
0031               Since DR keeps first tracks the mux ordering (currently from low seed id to high seed id) is important.
0032    *  \author Thomas Schuh
0033    *  \date   2023, Jan
0034    */
0035   class ProducerTM : public edm::stream::EDProducer<> {
0036   public:
0037     explicit ProducerTM(const edm::ParameterSet&);
0038     ~ProducerTM() override = default;
0039 
0040   private:
0041     void produce(edm::Event&, const edm::EventSetup&) override;
0042 
0043     // ED input token of Tracks
0044     edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0045     // ED input token of Stubs
0046     edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0047     // ED output token for stubs
0048     edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0049     // ED output token for tracks
0050     edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0051     // Setup token
0052     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0053     // DataFormats token
0054     edm::ESGetToken<DataFormats, ChannelAssignmentRcd> esGetTokenDataFormats_;
0055     // ChannelAssignment token
0056     edm::ESGetToken<ChannelAssignment, ChannelAssignmentRcd> esGetTokenChannelAssignment_;
0057     // helper class to store tracklet configurations
0058     trklet::Settings settings_;
0059   };
0060 
0061   ProducerTM::ProducerTM(const edm::ParameterSet& iConfig) {
0062     const std::string& label = iConfig.getParameter<std::string>("InputLabelTM");
0063     const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0064     const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0065     // book in- and output ED products
0066     edGetTokenTracks_ = consumes<tt::StreamsTrack>(edm::InputTag(label, branchTracks));
0067     edGetTokenStubs_ = consumes<tt::StreamsStub>(edm::InputTag(label, branchStubs));
0068     edPutTokenStubs_ = produces<tt::StreamsStub>(branchStubs);
0069     edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0070     // book ES products
0071     esGetTokenSetup_ = esConsumes();
0072     esGetTokenDataFormats_ = esConsumes();
0073     esGetTokenChannelAssignment_ = esConsumes();
0074   }
0075 
0076   void ProducerTM::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0077     // helper class to store configurations
0078     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0079     // helper class to extract structured data from tt::Frames
0080     const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0081     // helper class to assign tracks to channel
0082     const ChannelAssignment* channelAssignment = &iSetup.getData(esGetTokenChannelAssignment_);
0083     // empty TM products
0084     tt::StreamsStub streamsStub(setup->numRegions() * channelAssignment->tmNumLayers());
0085     tt::StreamsTrack streamsTrack(setup->numRegions());
0086     // read in TBout Product and produce TM product
0087     const tt::StreamsStub& stubs = iEvent.get(edGetTokenStubs_);
0088     const tt::StreamsTrack& tracks = iEvent.get(edGetTokenTracks_);
0089     for (int region = 0; region < setup->numRegions(); region++) {
0090       // object to reformat tracks from tracklet fromat to TMTT format in a processing region
0091       TrackMultiplexer tm(setup, dataFormats, channelAssignment, &settings_, region);
0092       // read in and organize input tracks and stubs
0093       tm.consume(tracks, stubs);
0094       // fill output products
0095       tm.produce(streamsTrack, streamsStub);
0096     }
0097     // store products
0098     iEvent.emplace(edPutTokenTracks_, std::move(streamsTrack));
0099     iEvent.emplace(edPutTokenStubs_, std::move(streamsStub));
0100   }
0101 
0102 }  // namespace trklet
0103 
0104 DEFINE_FWK_MODULE(trklet::ProducerTM);