File indexing completed on 2025-06-03 00:12:14
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/TrackerTFP/interface/DataFormats.h"
0017 #include "L1Trigger/TrackerTFP/interface/CleanTrackBuilder.h"
0018
0019 #include <string>
0020 #include <vector>
0021 #include <deque>
0022 #include <iterator>
0023 #include <cmath>
0024 #include <numeric>
0025 #include <algorithm>
0026
0027 namespace trackerTFP {
0028
0029
0030
0031
0032
0033
0034 class ProducerCTB : public edm::stream::EDProducer<> {
0035 public:
0036 explicit ProducerCTB(const edm::ParameterSet&);
0037 ~ProducerCTB() override = default;
0038
0039 private:
0040 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0041 void produce(edm::Event&, const edm::EventSetup&) override;
0042
0043 edm::EDGetTokenT<tt::StreamsStub> edGetToken_;
0044
0045 edm::EDPutTokenT<tt::TTTracks> edPutTokenTTTracks_;
0046
0047 edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0048
0049 edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0050
0051 edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0052
0053 edm::ESGetToken<DataFormats, DataFormatsRcd> esGetTokenDataFormats_;
0054
0055 edm::ESGetToken<LayerEncoding, DataFormatsRcd> esGetTokenLayerEncoding_;
0056
0057 DataFormat cot_;
0058
0059 int numChannelIn_;
0060
0061 int numChannelOut_;
0062
0063 int numRegions_;
0064
0065 int numLayers_;
0066 };
0067
0068 ProducerCTB::ProducerCTB(const edm::ParameterSet& iConfig) {
0069 const std::string& label = iConfig.getParameter<std::string>("InputLabelCTB");
0070 const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0071 const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0072
0073 edGetToken_ = consumes<tt::StreamsStub>(edm::InputTag(label, branchStubs));
0074 edPutTokenStubs_ = produces<tt::StreamsStub>(branchStubs);
0075 edPutTokenTTTracks_ = produces<tt::TTTracks>(branchTracks);
0076 edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0077
0078 esGetTokenSetup_ = esConsumes();
0079 esGetTokenDataFormats_ = esConsumes();
0080 esGetTokenLayerEncoding_ = esConsumes();
0081 }
0082
0083 void ProducerCTB::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {
0084 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0085 const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0086 numChannelIn_ = dataFormats->numChannel(Process::ht);
0087 numChannelOut_ = dataFormats->numChannel(Process::ctb);
0088 numRegions_ = setup->numRegions();
0089 numLayers_ = setup->numLayers();
0090
0091 const double baseZ = dataFormats->base(Variable::z, Process::ctb);
0092 const double baseR = dataFormats->base(Variable::r, Process::ctb);
0093 const double range = dataFormats->range(Variable::cot, Process::kf);
0094 const int baseShift = std::ceil(std::log2(range / baseZ * baseR / setup->ctbNumBinsCot()));
0095 const int width = std::ceil(std::log2(setup->ctbNumBinsCot()));
0096 const double base = baseZ / baseR * pow(2, baseShift);
0097 cot_ = DataFormat(true, width, base, range);
0098 }
0099
0100 void ProducerCTB::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0101 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0102 const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0103 const LayerEncoding* layerEncoding = &iSetup.getData(esGetTokenLayerEncoding_);
0104
0105 tt::StreamsTrack acceptedTracks(numRegions_ * numChannelOut_);
0106 tt::StreamsStub acceptedStubs(numRegions_ * numChannelOut_ * numLayers_);
0107 std::vector<std::vector<std::deque<TrackCTB*>>> streamsTracks(numRegions_,
0108 std::vector<std::deque<TrackCTB*>>(numChannelOut_));
0109 std::vector<std::vector<std::vector<std::deque<StubCTB*>>>> streamsStubs(
0110 numRegions_,
0111 std::vector<std::vector<std::deque<StubCTB*>>>(numChannelOut_, std::vector<std::deque<StubCTB*>>(numLayers_)));
0112
0113 const tt::StreamsStub& streamsStub = iEvent.get(edGetToken_);
0114
0115 int nStubsHT(0);
0116 auto validFrame = [](int sum, const tt::FrameStub& frame) { return sum + (frame.first.isNonnull() ? 1 : 0); };
0117 for (const tt::StreamStub& stream : streamsStub)
0118 nStubsHT += std::accumulate(stream.begin(), stream.end(), 0, validFrame);
0119
0120 std::vector<StubHT> stubsHT;
0121 stubsHT.reserve(nStubsHT);
0122
0123 int nTracksHT(0);
0124 for (const tt::StreamStub& stream : streamsStub) {
0125 std::pair<int, int> trackId({setup->htNumBinsPhiT(), setup->gpNumBinsZT()});
0126 for (const tt::FrameStub& frame : stream) {
0127 if (frame.first.isNull())
0128 continue;
0129 stubsHT.emplace_back(frame, dataFormats);
0130 StubHT* stub = &stubsHT.back();
0131 if (trackId.first != stub->phiT() || trackId.second != stub->zT()) {
0132 nTracksHT++;
0133 trackId = {stub->phiT(), stub->zT()};
0134 }
0135 }
0136 }
0137
0138 std::vector<StubCTB> stubsCTB;
0139 stubsCTB.reserve(nStubsHT);
0140 std::vector<TrackCTB> tracksCTB;
0141 tracksCTB.reserve(nTracksHT);
0142 CleanTrackBuilder ctb(setup, dataFormats, layerEncoding, cot_, stubsCTB, tracksCTB);
0143 int iStub(0);
0144 for (int region = 0; region < numRegions_; region++) {
0145 const int offsetIn = region * numChannelIn_;
0146 const int offsetOut = region * numChannelOut_;
0147
0148 std::vector<std::vector<StubHT*>> streamsIn(numChannelIn_);
0149 for (int channelIn = 0; channelIn < numChannelIn_; channelIn++) {
0150 const tt::StreamStub& channelStubs = streamsStub[offsetIn + channelIn];
0151 std::vector<StubHT*>& stream = streamsIn[channelIn];
0152 stream.reserve(channelStubs.size());
0153 for (const tt::FrameStub& frame : channelStubs)
0154 stream.push_back(frame.first.isNull() ? nullptr : &stubsHT[iStub++]);
0155 }
0156
0157 std::vector<std::deque<TrackCTB*>>& regionTracks = streamsTracks[region];
0158 std::vector<std::vector<std::deque<StubCTB*>>>& regionStubs = streamsStubs[region];
0159
0160 ctb.produce(streamsIn, regionTracks, regionStubs);
0161
0162 for (int channelOut = 0; channelOut < numChannelOut_; channelOut++) {
0163 const int offset = (offsetOut + channelOut) * numLayers_;
0164 const std::vector<std::deque<StubCTB*>>& channelStubs = regionStubs[channelOut];
0165 for (int layer = 0; layer < numLayers_; layer++) {
0166 tt::StreamStub& accepted = acceptedStubs[offset + layer];
0167 const std::deque<StubCTB*>& layerStubs = channelStubs[layer];
0168 accepted.reserve(layerStubs.size());
0169 for (StubCTB* stub : layerStubs)
0170 accepted.emplace_back(stub ? stub->frame() : tt::FrameStub());
0171 }
0172 }
0173 }
0174
0175 int nTracks(0);
0176 auto valid = [](int sum, TrackCTB* track) { return sum + (track ? 1 : 0); };
0177 for (const std::vector<std::deque<TrackCTB*>>& region : streamsTracks)
0178 for (const std::deque<TrackCTB*>& channel : region)
0179 nTracks += std::accumulate(channel.begin(), channel.end(), 0, valid);
0180 tt::TTTracks ttTracks;
0181 ttTracks.reserve(nTracks);
0182 for (int region = 0; region < numRegions_; region++) {
0183 const std::vector<std::deque<TrackCTB*>>& regionTracks = streamsTracks[region];
0184 const std::vector<std::vector<std::deque<StubCTB*>>>& regionStubs = streamsStubs[region];
0185 for (int channelOut = 0; channelOut < numChannelOut_; channelOut++) {
0186 const std::deque<TrackCTB*>& channelTracks = regionTracks[channelOut];
0187 const std::vector<std::deque<StubCTB*>>& channelStubs = regionStubs[channelOut];
0188 for (int frame = 0; frame < static_cast<int>(channelTracks.size()); frame++) {
0189 TrackCTB* track = channelTracks[frame];
0190 if (!track)
0191 continue;
0192 const auto begin = std::next(channelTracks.begin(), frame);
0193 const auto end = std::find_if(begin + 1, channelTracks.end(), [](TrackCTB* track) { return track; });
0194 const int size = std::distance(begin, end);
0195 std::vector<std::vector<StubCTB*>> stubs(numLayers_);
0196 for (int layer = 0; layer < numLayers_; layer++) {
0197 const std::deque<StubCTB*>& layerStubs = channelStubs[layer];
0198 std::vector<StubCTB*>& layerTrack = stubs[layer];
0199 layerTrack.reserve(size);
0200 for (int s = 0; s < size; s++) {
0201 StubCTB* stub = layerStubs[frame + s];
0202 if (stub)
0203 layerTrack.push_back(stub);
0204 }
0205 }
0206 ctb.put(track, stubs, region, ttTracks);
0207 }
0208 }
0209 }
0210 const edm::OrphanHandle<tt::TTTracks> handle = iEvent.emplace(edPutTokenTTTracks_, std::move(ttTracks));
0211
0212 int iTrk(0);
0213 int iChan(0);
0214 for (const std::vector<std::deque<TrackCTB*>>& region : streamsTracks) {
0215 for (const std::deque<TrackCTB*>& stream : region) {
0216 tt::StreamTrack& streamTrack = acceptedTracks[iChan++];
0217 for (TrackCTB* track : stream) {
0218 if (!track) {
0219 streamTrack.emplace_back(tt::FrameTrack());
0220 continue;
0221 }
0222 tt::FrameTrack frame = track->frame();
0223 frame.first = TTTrackRef(handle, iTrk++);
0224 streamTrack.emplace_back(frame);
0225 }
0226 }
0227 }
0228
0229 iEvent.emplace(edPutTokenTracks_, std::move(acceptedTracks));
0230
0231 iEvent.emplace(edPutTokenStubs_, std::move(acceptedStubs));
0232 }
0233
0234 }
0235
0236 DEFINE_FWK_MODULE(trackerTFP::ProducerCTB);