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 #include "DataFormats/Common/interface/OrphanHandle.h"
0013 
0014 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0015 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0016 #include "L1Trigger/TrackFindingTracklet/interface/DataFormats.h"
0017 #include "L1Trigger/TrackerTFP/interface/TrackQuality.h"
0018 #include "L1Trigger/TrackFindingTracklet/interface/TrackFindingProcessor.h"
0019 
0020 #include <string>
0021 #include <numeric>
0022 #include <vector>
0023 #include <deque>
0024 
0025 namespace trklet {
0026 
0027   /*! \class  trklet::ProducerTFP
0028    *  \brief  L1TrackTrigger final TFP output formatter
0029    *  \author Thomas Schuh
0030    *  \date   2023, June
0031    */
0032   class ProducerTFP : public edm::stream::EDProducer<> {
0033   public:
0034     explicit ProducerTFP(const edm::ParameterSet&);
0035     ~ProducerTFP() override = default;
0036 
0037   private:
0038     void produce(edm::Event&, const edm::EventSetup&) override;
0039     // ED input token of stubs and tracks
0040     edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0041     edm::EDGetTokenT<tt::Streams> edGetTokenTracksAdd_;
0042     edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0043     // ED output token for accepted stubs and tracks
0044     edm::EDPutTokenT<tt::TTTracks> edPutTokenTTTracks_;
0045     edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0046     // Setup token
0047     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0048     // DataFormats token
0049     edm::ESGetToken<DataFormats, ChannelAssignmentRcd> esGetTokenDataFormats_;
0050     // TrackQuality token
0051     edm::ESGetToken<trackerTFP::TrackQuality, trackerTFP::DataFormatsRcd> esGetTokenTrackQuality_;
0052   };
0053 
0054   ProducerTFP::ProducerTFP(const edm::ParameterSet& iConfig) {
0055     const std::string& labelTracks = iConfig.getParameter<std::string>("InputLabelTFP");
0056     const std::string& labelStubs = iConfig.getParameter<std::string>("InputLabelTQ");
0057     const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0058     const std::string& branchTTTracks = iConfig.getParameter<std::string>("BranchTTTracks");
0059     const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0060     // book in- and output ED products
0061     edGetTokenTracks_ = consumes<tt::StreamsTrack>(edm::InputTag(labelTracks, branchTracks));
0062     edGetTokenTracksAdd_ = consumes<tt::Streams>(edm::InputTag(labelTracks, branchTracks));
0063     edGetTokenStubs_ = consumes<tt::StreamsStub>(edm::InputTag(labelStubs, branchStubs));
0064     edPutTokenTTTracks_ = produces<tt::TTTracks>(branchTTTracks);
0065     edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0066     // book ES products
0067     esGetTokenSetup_ = esConsumes();
0068     esGetTokenDataFormats_ = esConsumes();
0069     esGetTokenTrackQuality_ = esConsumes();
0070   }
0071 
0072   void ProducerTFP::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0073     // helper class to store configurations
0074     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0075     // helper class to extract structured data from tt::Frames
0076     const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0077     // helper class to determine track quality
0078     const trackerTFP::TrackQuality* trackQuality = &iSetup.getData(esGetTokenTrackQuality_);
0079     // empty TFP products
0080     tt::TTTracks ttTracks;
0081     tt::StreamsTrack streamsTrack(setup->numRegions() * setup->tfpNumChannel());
0082     // read in TQ Products
0083     const tt::StreamsTrack& tracks = iEvent.get(edGetTokenTracks_);
0084     const tt::Streams& tracksAdd = iEvent.get(edGetTokenTracksAdd_);
0085     const tt::StreamsStub& stubs = iEvent.get(edGetTokenStubs_);
0086     // produce TTTracks
0087     TrackFindingProcessor tfp(setup, dataFormats, trackQuality);
0088     tfp.produce(tracks, tracksAdd, stubs, ttTracks, streamsTrack);
0089     // put TTTRacks and produce TTTRackRefs
0090     const int nTrks = ttTracks.size();
0091     const edm::OrphanHandle<tt::TTTracks> oh = iEvent.emplace(edPutTokenTTTracks_, std::move(ttTracks));
0092     std::vector<TTTrackRef> ttTrackRefs;
0093     ttTrackRefs.reserve(nTrks);
0094     for (int iTrk = 0; iTrk < nTrks; iTrk++)
0095       ttTrackRefs.emplace_back(oh, iTrk);
0096     // replace old TTTrackRefs in streamsTrack with new TTTrackRefs
0097     tfp.produce(ttTrackRefs, streamsTrack);
0098     // put StreamsTrack
0099     iEvent.emplace(edPutTokenTracks_, std::move(streamsTrack));
0100   }
0101 
0102 }  // namespace trklet
0103 
0104 DEFINE_FWK_MODULE(trklet::ProducerTFP);