File indexing completed on 2025-06-03 00:12:15
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/DataFormats.h"
0015 #include "L1Trigger/TrackerTFP/interface/TrackQuality.h"
0016
0017 #include <string>
0018 #include <numeric>
0019
0020 namespace trackerTFP {
0021
0022
0023
0024
0025
0026
0027 class ProducerTQ : public edm::stream::EDProducer<> {
0028 public:
0029 explicit ProducerTQ(const edm::ParameterSet&);
0030 ~ProducerTQ() override = default;
0031 void produce(edm::Event&, const edm::EventSetup&) override;
0032
0033 private:
0034 typedef TrackQuality::Track Track;
0035
0036 edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0037
0038 edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0039
0040 edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0041
0042 edm::EDPutTokenT<tt::Streams> edPutTokenTracksAdd_;
0043
0044 edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0045
0046 edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0047
0048 edm::ESGetToken<DataFormats, DataFormatsRcd> esGetTokenDataFormats_;
0049
0050 edm::ESGetToken<TrackQuality, DataFormatsRcd> esGetTokenTrackQuality_;
0051 };
0052
0053 ProducerTQ::ProducerTQ(const edm::ParameterSet& iConfig) {
0054 const std::string& label = iConfig.getParameter<std::string>("InputLabelTQ");
0055 const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0056 const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0057
0058 edGetTokenStubs_ = consumes<tt::StreamsStub>(edm::InputTag(label, branchStubs));
0059 edGetTokenTracks_ = consumes<tt::StreamsTrack>(edm::InputTag(label, branchTracks));
0060 edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0061 edPutTokenTracksAdd_ = produces<tt::Streams>(branchTracks);
0062 edPutTokenStubs_ = produces<tt::StreamsStub>(branchStubs);
0063
0064 esGetTokenSetup_ = esConsumes();
0065 esGetTokenTrackQuality_ = esConsumes();
0066 }
0067
0068 void ProducerTQ::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0069
0070 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0071
0072 const TrackQuality* trackQuality = &iSetup.getData(esGetTokenTrackQuality_);
0073 auto valid = [](int sum, const tt::FrameTrack& frame) { return sum + (frame.first.isNull() ? 0 : 1); };
0074
0075 tt::StreamsTrack outputTracks(setup->numRegions());
0076 tt::Streams outputTracksAdd(setup->numRegions());
0077 tt::StreamsStub outputStubs(setup->numRegions() * setup->numLayers());
0078
0079 const tt::StreamsStub& streamsStubs = iEvent.get(edGetTokenStubs_);
0080 const tt::StreamsTrack& streamsTracks = iEvent.get(edGetTokenTracks_);
0081 for (int region = 0; region < setup->numRegions(); region++) {
0082
0083 const int offsetLayer = region * setup->numLayers();
0084 const tt::StreamTrack& streamTrack = streamsTracks[region];
0085 const int nTracks = std::accumulate(streamTrack.begin(), streamTrack.end(), 0, valid);
0086 std::vector<Track> tracks;
0087 tracks.reserve(nTracks);
0088 std::vector<Track*> stream;
0089 stream.reserve(streamTrack.size());
0090 for (int frame = 0; frame < static_cast<int>(streamTrack.size()); frame++) {
0091 const tt::FrameTrack& frameTrack = streamTrack[frame];
0092 if (frameTrack.first.isNull()) {
0093 stream.push_back(nullptr);
0094 continue;
0095 }
0096 tt::StreamStub streamStub;
0097 streamStub.reserve(setup->numLayers());
0098 for (int layer = 0; layer < setup->numLayers(); layer++)
0099 streamStub.push_back(streamsStubs[offsetLayer + layer][frame]);
0100 tracks.emplace_back(frameTrack, streamStub, trackQuality);
0101 stream.push_back(&tracks.back());
0102 }
0103
0104 outputTracks[region].reserve(stream.size());
0105 outputTracksAdd[region].reserve(stream.size());
0106 for (int layer = 0; layer < setup->numLayers(); layer++)
0107 outputStubs[offsetLayer + layer].reserve(stream.size());
0108 for (Track* track : stream) {
0109 if (!track) {
0110 outputTracks[region].emplace_back(tt::FrameTrack());
0111 outputTracksAdd[region].emplace_back(tt::Frame());
0112 for (int layer = 0; layer < setup->numLayers(); layer++)
0113 outputStubs[offsetLayer + layer].emplace_back(tt::FrameStub());
0114 continue;
0115 }
0116 outputTracks[region].emplace_back(track->frameTrack_);
0117 outputTracksAdd[region].emplace_back(track->frame_);
0118 for (int layer = 0; layer < setup->numLayers(); layer++)
0119 outputStubs[offsetLayer + layer].emplace_back(track->streamStub_[layer]);
0120 }
0121 }
0122
0123 iEvent.emplace(edPutTokenTracks_, std::move(outputTracks));
0124 iEvent.emplace(edPutTokenTracksAdd_, std::move(outputTracksAdd));
0125 iEvent.emplace(edPutTokenStubs_, streamsStubs);
0126 }
0127 }
0128
0129 DEFINE_FWK_MODULE(trackerTFP::ProducerTQ);