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 "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0014 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0015 #include "L1Trigger/TrackerTFP/interface/DataFormats.h"
0016 #include "L1Trigger/TrackerTFP/interface/KalmanFilterFormats.h"
0017 #include "L1Trigger/TrackerTFP/interface/LayerEncoding.h"
0018 #include "L1Trigger/TrackerTFP/interface/KalmanFilter.h"
0019
0020 #include <string>
0021 #include <vector>
0022 #include <utility>
0023
0024 namespace trackerTFP {
0025
0026
0027
0028
0029
0030
0031 class ProducerKF : public edm::stream::EDProducer<> {
0032 public:
0033 explicit ProducerKF(const edm::ParameterSet&);
0034 ~ProducerKF() override = default;
0035
0036 private:
0037 typedef State::Stub Stub;
0038 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0039 void produce(edm::Event&, const edm::EventSetup&) override;
0040 void endStream() override {
0041 std::stringstream ss;
0042 if (printDebug_)
0043 kalmanFilterFormats_.endJob(ss);
0044 edm::LogPrint(moduleDescription().moduleName()) << ss.str();
0045 }
0046
0047 edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0048 edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0049
0050 edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0051 edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0052
0053 edm::EDPutTokenT<int> edPutTokenNumStatesAccepted_;
0054 edm::EDPutTokenT<int> edPutTokenNumStatesTruncated_;
0055
0056 edm::EDPutTokenT<std::vector<std::pair<double, double>>> edPutTokenChi2s_;
0057
0058 edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0059
0060 edm::ESGetToken<DataFormats, DataFormatsRcd> esGetTokenDataFormats_;
0061
0062 edm::ESGetToken<LayerEncoding, DataFormatsRcd> esGetTokenLayerEncoding_;
0063
0064 KalmanFilterFormats kalmanFilterFormats_;
0065
0066 ConfigKF iConfig_;
0067
0068 bool printDebug_;
0069
0070 int numChannel_;
0071
0072 int numRegions_;
0073
0074 int numLayers_;
0075 };
0076
0077 ProducerKF::ProducerKF(const edm::ParameterSet& iConfig) {
0078
0079 iConfig_.enableIntegerEmulation_ = iConfig.getParameter<bool>("EnableIntegerEmulation");
0080 iConfig_.widthR00_ = iConfig.getParameter<int>("WidthR00");
0081 iConfig_.widthR11_ = iConfig.getParameter<int>("WidthR11");
0082 iConfig_.widthC00_ = iConfig.getParameter<int>("WidthC00");
0083 iConfig_.widthC01_ = iConfig.getParameter<int>("WidthC01");
0084 iConfig_.widthC11_ = iConfig.getParameter<int>("WidthC11");
0085 iConfig_.widthC22_ = iConfig.getParameter<int>("WidthC22");
0086 iConfig_.widthC23_ = iConfig.getParameter<int>("WidthC23");
0087 iConfig_.widthC33_ = iConfig.getParameter<int>("WidthC33");
0088 iConfig_.baseShiftx0_ = iConfig.getParameter<int>("BaseShiftx0");
0089 iConfig_.baseShiftx1_ = iConfig.getParameter<int>("BaseShiftx1");
0090 iConfig_.baseShiftx2_ = iConfig.getParameter<int>("BaseShiftx2");
0091 iConfig_.baseShiftx3_ = iConfig.getParameter<int>("BaseShiftx3");
0092 iConfig_.baseShiftr0_ = iConfig.getParameter<int>("BaseShiftr0");
0093 iConfig_.baseShiftr1_ = iConfig.getParameter<int>("BaseShiftr1");
0094 iConfig_.baseShiftS00_ = iConfig.getParameter<int>("BaseShiftS00");
0095 iConfig_.baseShiftS01_ = iConfig.getParameter<int>("BaseShiftS01");
0096 iConfig_.baseShiftS12_ = iConfig.getParameter<int>("BaseShiftS12");
0097 iConfig_.baseShiftS13_ = iConfig.getParameter<int>("BaseShiftS13");
0098 iConfig_.baseShiftR00_ = iConfig.getParameter<int>("BaseShiftR00");
0099 iConfig_.baseShiftR11_ = iConfig.getParameter<int>("BaseShiftR11");
0100 iConfig_.baseShiftInvR00Approx_ = iConfig.getParameter<int>("BaseShiftInvR00Approx");
0101 iConfig_.baseShiftInvR11Approx_ = iConfig.getParameter<int>("BaseShiftInvR11Approx");
0102 iConfig_.baseShiftInvR00Cor_ = iConfig.getParameter<int>("BaseShiftInvR00Cor");
0103 iConfig_.baseShiftInvR11Cor_ = iConfig.getParameter<int>("BaseShiftInvR11Cor");
0104 iConfig_.baseShiftInvR00_ = iConfig.getParameter<int>("BaseShiftInvR00");
0105 iConfig_.baseShiftInvR11_ = iConfig.getParameter<int>("BaseShiftInvR11");
0106 iConfig_.baseShiftS00Shifted_ = iConfig.getParameter<int>("BaseShiftS00Shifted");
0107 iConfig_.baseShiftS01Shifted_ = iConfig.getParameter<int>("BaseShiftS01Shifted");
0108 iConfig_.baseShiftS12Shifted_ = iConfig.getParameter<int>("BaseShiftS12Shifted");
0109 iConfig_.baseShiftS13Shifted_ = iConfig.getParameter<int>("BaseShiftS13Shifted");
0110 iConfig_.baseShiftK00_ = iConfig.getParameter<int>("BaseShiftK00");
0111 iConfig_.baseShiftK10_ = iConfig.getParameter<int>("BaseShiftK10");
0112 iConfig_.baseShiftK21_ = iConfig.getParameter<int>("BaseShiftK21");
0113 iConfig_.baseShiftK31_ = iConfig.getParameter<int>("BaseShiftK31");
0114 iConfig_.baseShiftC00_ = iConfig.getParameter<int>("BaseShiftC00");
0115 iConfig_.baseShiftC01_ = iConfig.getParameter<int>("BaseShiftC01");
0116 iConfig_.baseShiftC11_ = iConfig.getParameter<int>("BaseShiftC11");
0117 iConfig_.baseShiftC22_ = iConfig.getParameter<int>("BaseShiftC22");
0118 iConfig_.baseShiftC23_ = iConfig.getParameter<int>("BaseShiftC23");
0119 iConfig_.baseShiftC33_ = iConfig.getParameter<int>("BaseShiftC33");
0120 iConfig_.baseShiftr0Shifted_ = iConfig.getParameter<int>("BaseShiftr0Shifted");
0121 iConfig_.baseShiftr1Shifted_ = iConfig.getParameter<int>("BaseShiftr1Shifted");
0122 iConfig_.baseShiftr02_ = iConfig.getParameter<int>("BaseShiftr02");
0123 iConfig_.baseShiftr12_ = iConfig.getParameter<int>("BaseShiftr12");
0124 iConfig_.baseShiftchi20_ = iConfig.getParameter<int>("BaseShiftchi20");
0125 iConfig_.baseShiftchi21_ = iConfig.getParameter<int>("BaseShiftchi21");
0126 printDebug_ = iConfig.getParameter<bool>("PrintKFDebug");
0127 const std::string& label = iConfig.getParameter<std::string>("InputLabelKF");
0128 const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0129 const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0130 const std::string& branchTruncated = iConfig.getParameter<std::string>("BranchTruncated");
0131
0132 edGetTokenStubs_ = consumes<tt::StreamsStub>(edm::InputTag(label, branchStubs));
0133 edGetTokenTracks_ = consumes<tt::StreamsTrack>(edm::InputTag(label, branchTracks));
0134 edPutTokenStubs_ = produces<tt::StreamsStub>(branchStubs);
0135 edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0136 edPutTokenNumStatesAccepted_ = produces<int>(branchTracks);
0137 edPutTokenNumStatesTruncated_ = produces<int>(branchTruncated);
0138 edPutTokenChi2s_ = produces<std::vector<std::pair<double, double>>>(branchTracks);
0139
0140 esGetTokenSetup_ = esConsumes();
0141 esGetTokenDataFormats_ = esConsumes();
0142 esGetTokenLayerEncoding_ = esConsumes();
0143 }
0144
0145 void ProducerKF::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {
0146 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0147 numRegions_ = setup->numRegions();
0148 numLayers_ = setup->numLayers();
0149 const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0150 numChannel_ = dataFormats->numChannel(Process::kf);
0151 kalmanFilterFormats_.beginRun(dataFormats, iConfig_);
0152 }
0153
0154 void ProducerKF::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0155
0156 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0157
0158 const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0159
0160 const LayerEncoding* layerEncoding = &iSetup.getData(esGetTokenLayerEncoding_);
0161
0162 tt::StreamsStub acceptedStubs(numRegions_ * numChannel_ * numLayers_);
0163 tt::StreamsTrack acceptedTracks(numRegions_ * numChannel_);
0164 int numStatesAccepted(0);
0165 int numStatesTruncated(0);
0166 std::deque<std::pair<double, double>> chi2s;
0167
0168 const tt::StreamsStub& allStubs = iEvent.get(edGetTokenStubs_);
0169 const tt::StreamsTrack& allTracks = iEvent.get(edGetTokenTracks_);
0170
0171 auto validFrameT = [](int sum, const tt::FrameTrack& frame) { return sum + (frame.first.isNonnull() ? 1 : 0); };
0172 auto validFrameS = [](int sum, const tt::FrameStub& frame) { return sum + (frame.first.isNonnull() ? 1 : 0); };
0173 auto putT = [](const std::vector<TrackKF*>& objects, tt::StreamTrack& stream) {
0174 auto toFrame = [](TrackKF* object) { return object ? object->frame() : tt::FrameTrack(); };
0175 stream.reserve(objects.size());
0176 std::transform(objects.begin(), objects.end(), std::back_inserter(stream), toFrame);
0177 };
0178 auto putS = [](const std::vector<StubKF*>& objects, tt::StreamStub& stream) {
0179 auto toFrame = [](StubKF* object) { return object ? object->frame() : tt::FrameStub(); };
0180 stream.reserve(objects.size());
0181 std::transform(objects.begin(), objects.end(), std::back_inserter(stream), toFrame);
0182 };
0183 for (int region = 0; region < numRegions_; region++) {
0184 const int offset = region * numChannel_;
0185
0186 int nTracks(0);
0187 int nStubs(0);
0188 for (int channel = 0; channel < numChannel_; channel++) {
0189 const int index = offset + channel;
0190 const int offsetStubs = index * numLayers_;
0191 const tt::StreamTrack& tracks = allTracks[index];
0192 nTracks += std::accumulate(tracks.begin(), tracks.end(), 0, validFrameT);
0193 for (int layer = 0; layer < numLayers_; layer++) {
0194 const tt::StreamStub& stubs = allStubs[offsetStubs + layer];
0195 nStubs += std::accumulate(stubs.begin(), stubs.end(), 0, validFrameS);
0196 }
0197 }
0198
0199 std::vector<TrackCTB> tracksCTB;
0200 tracksCTB.reserve(nTracks);
0201 std::vector<Stub> stubs;
0202 stubs.reserve(nStubs);
0203
0204 std::vector<std::vector<TrackCTB*>> regionTracks(numChannel_);
0205 std::vector<std::vector<Stub*>> regionStubs(numChannel_ * numLayers_);
0206
0207 for (int channel = 0; channel < numChannel_; channel++) {
0208 const int index = offset + channel;
0209 const int offsetAll = index * numLayers_;
0210 const int offsetRegion = channel * numLayers_;
0211 const tt::StreamTrack& streamTrack = allTracks[index];
0212 std::vector<TrackCTB*>& tracks = regionTracks[channel];
0213 tracks.reserve(streamTrack.size());
0214 for (const tt::FrameTrack& frame : streamTrack) {
0215 TrackCTB* track = nullptr;
0216 if (frame.first.isNonnull()) {
0217 tracksCTB.emplace_back(frame, dataFormats);
0218 track = &tracksCTB.back();
0219 }
0220 tracks.push_back(track);
0221 }
0222 for (int layer = 0; layer < numLayers_; layer++) {
0223 for (const tt::FrameStub& frame : allStubs[offsetAll + layer]) {
0224 Stub* stub = nullptr;
0225 if (frame.first.isNonnull()) {
0226 stubs.emplace_back(&kalmanFilterFormats_, frame);
0227 stub = &stubs.back();
0228 }
0229 regionStubs[offsetRegion + layer].push_back(stub);
0230 }
0231 }
0232 }
0233
0234 std::vector<TrackKF> tracksKF;
0235 tracksKF.reserve(nTracks);
0236 std::vector<StubKF> stubsKF;
0237 stubsKF.reserve(nStubs);
0238
0239 KalmanFilter kf(setup, dataFormats, layerEncoding, &kalmanFilterFormats_, tracksKF, stubsKF);
0240
0241 std::vector<std::vector<TrackKF*>> streamsTrack(numChannel_);
0242 std::vector<std::vector<std::vector<StubKF*>>> streamsStub(numChannel_,
0243 std::vector<std::vector<StubKF*>>(numLayers_));
0244
0245 kf.produce(regionTracks, regionStubs, streamsTrack, streamsStub, numStatesAccepted, numStatesTruncated, chi2s);
0246
0247 for (int channel = 0; channel < numChannel_; channel++) {
0248 const int index = offset + channel;
0249 const int offsetStubs = index * numLayers_;
0250 putT(streamsTrack[channel], acceptedTracks[index]);
0251 for (int layer = 0; layer < numLayers_; layer++)
0252 putS(streamsStub[channel][layer], acceptedStubs[offsetStubs + layer]);
0253 }
0254 }
0255
0256 iEvent.emplace(edPutTokenStubs_, std::move(acceptedStubs));
0257 iEvent.emplace(edPutTokenTracks_, std::move(acceptedTracks));
0258 iEvent.emplace(edPutTokenNumStatesAccepted_, numStatesAccepted);
0259 iEvent.emplace(edPutTokenNumStatesTruncated_, numStatesTruncated);
0260 iEvent.emplace(edPutTokenChi2s_, chi2s.begin(), chi2s.end());
0261 }
0262
0263 }
0264
0265 DEFINE_FWK_MODULE(trackerTFP::ProducerKF);