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/TrackerTFP/interface/LayerEncoding.h"
0015 #include "L1Trigger/TrackFindingTracklet/interface/DataFormats.h"
0016 #include "L1Trigger/TrackFindingTracklet/interface/ChannelAssignment.h"
0017 #include "L1Trigger/TrackFindingTracklet/interface/DuplicateRemoval.h"
0018 #include "SimDataFormats/Associations/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::ProducerDR
0030    *  \brief  Emulates removal of duplicated TTTracks f/w.
0031    *          Track order determined by TrackMultiplexer affects performance
0032    *  \author Thomas Schuh
0033    *  \date   2023, Feb
0034    */
0035   class ProducerDR : public edm::stream::EDProducer<> {
0036   public:
0037     explicit ProducerDR(const edm::ParameterSet&);
0038     ~ProducerDR() override = default;
0039 
0040   private:
0041     void produce(edm::Event&, const edm::EventSetup&) override;
0042     // ED input token of Tracks
0043     edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0044     // ED input token of Stubs
0045     edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0046     // ED output token for stubs
0047     edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0048     // ED output token for tracks
0049     edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0050     // Setup token
0051     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0052     // LayerEncoding token
0053     edm::ESGetToken<trackerTFP::LayerEncoding, trackerTFP::DataFormatsRcd> esGetTokenLayerEncoding_;
0054     // DataFormats token
0055     edm::ESGetToken<DataFormats, ChannelAssignmentRcd> esGetTokenDataFormats_;
0056     // ChannelAssignment token
0057     edm::ESGetToken<ChannelAssignment, ChannelAssignmentRcd> esGetTokenChannelAssignment_;
0058   };
0059 
0060   ProducerDR::ProducerDR(const edm::ParameterSet& iConfig) {
0061     const std::string& label = iConfig.getParameter<std::string>("InputLabelDR");
0062     const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0063     const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0064     // book in- and output ED products
0065     edGetTokenTracks_ = consumes<tt::StreamsTrack>(edm::InputTag(label, branchTracks));
0066     edGetTokenStubs_ = consumes<tt::StreamsStub>(edm::InputTag(label, branchStubs));
0067     edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0068     edPutTokenStubs_ = produces<tt::StreamsStub>(branchStubs);
0069     // book ES products
0070     esGetTokenSetup_ = esConsumes();
0071     esGetTokenLayerEncoding_ = esConsumes();
0072     esGetTokenDataFormats_ = esConsumes();
0073     esGetTokenChannelAssignment_ = esConsumes();
0074   }
0075 
0076   void ProducerDR::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 encode layer
0080     const trackerTFP::LayerEncoding* layerEncoding = &iSetup.getData(esGetTokenLayerEncoding_);
0081     // helper class to extract structured data from tt::Frames
0082     const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0083     // helper class to assign tracks to channel
0084     const ChannelAssignment* channelAssignment = &iSetup.getData(esGetTokenChannelAssignment_);
0085     // empty DR products
0086     tt::StreamsStub streamsStub(setup->numRegions() * setup->numLayers());
0087     tt::StreamsTrack streamsTrack(setup->numRegions());
0088     // read in TBout Product and produce KFin product
0089     const tt::StreamsStub& stubs = iEvent.get(edGetTokenStubs_);
0090     const tt::StreamsTrack& tracks = iEvent.get(edGetTokenTracks_);
0091     for (int region = 0; region < setup->numRegions(); region++) {
0092       // object to remove duplicated tracks in a processing region
0093       DuplicateRemoval dr(setup, layerEncoding, dataFormats, channelAssignment, region);
0094       // read in and organize input tracks and stubs
0095       dr.consume(tracks, stubs);
0096       // fill output products
0097       dr.produce(streamsTrack, streamsStub);
0098     }
0099     // store products
0100     iEvent.emplace(edPutTokenStubs_, std::move(streamsStub));
0101     iEvent.emplace(edPutTokenTracks_, std::move(streamsTrack));
0102   }
0103 
0104 }  // namespace trklet
0105 
0106 DEFINE_FWK_MODULE(trklet::ProducerDR);