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 "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0014 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0015 #include "L1Trigger/TrackFindingTracklet/interface/DataFormats.h"
0016 #include "L1Trigger/TrackFindingTracklet/interface/KalmanFilter.h"
0017 #include "L1Trigger/TrackFindingTMTT/interface/Settings.h"
0018 #include "L1Trigger/TrackFindingTMTT/interface/KFParamsComb.h"
0019
0020 #include <string>
0021 #include <vector>
0022
0023 namespace trklet {
0024
0025
0026
0027
0028
0029
0030 class ProducerKF : public edm::stream::EDProducer<> {
0031 public:
0032 explicit ProducerKF(const edm::ParameterSet&);
0033 ~ProducerKF() override = default;
0034
0035 private:
0036 void produce(edm::Event&, const edm::EventSetup&) override;
0037 void endStream() override {
0038 std::stringstream ss;
0039 if (printDebug_)
0040 kalmanFilterFormats_.endJob(ss);
0041 edm::LogPrint(moduleDescription().moduleName()) << ss.str();
0042 }
0043
0044 edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0045 edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0046
0047 edm::EDPutTokenT<tt::TTTracks> edPutTokenTTTracks_;
0048 edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0049 edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0050
0051 edm::EDPutTokenT<int> edPutTokenNumStatesAccepted_;
0052 edm::EDPutTokenT<int> edPutTokenNumStatesTruncated_;
0053
0054 edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0055
0056 edm::ESGetToken<DataFormats, ChannelAssignmentRcd> esGetTokenDataFormats_;
0057
0058 KalmanFilterFormats kalmanFilterFormats_;
0059
0060 ConfigKF iConfig_;
0061
0062 tmtt::Settings settings_;
0063
0064 tmtt::KFParamsComb tmtt4_;
0065
0066 tmtt::KFParamsComb tmtt5_;
0067
0068 tmtt::KFParamsComb* tmtt_;
0069
0070 bool printDebug_;
0071 };
0072
0073 ProducerKF::ProducerKF(const edm::ParameterSet& iConfig)
0074 : settings_(iConfig),
0075 tmtt4_(&settings_, 4, "KF5ParamsComb"),
0076 tmtt5_(&settings_, 5, "KF4ParamsComb"),
0077 tmtt_(&tmtt4_) {
0078 iConfig_.enableIntegerEmulation_ = iConfig.getParameter<bool>("EnableIntegerEmulation");
0079 iConfig_.widthR00_ = iConfig.getParameter<int>("WidthR00");
0080 iConfig_.widthR11_ = iConfig.getParameter<int>("WidthR11");
0081 iConfig_.widthC00_ = iConfig.getParameter<int>("WidthC00");
0082 iConfig_.widthC01_ = iConfig.getParameter<int>("WidthC01");
0083 iConfig_.widthC11_ = iConfig.getParameter<int>("WidthC11");
0084 iConfig_.widthC22_ = iConfig.getParameter<int>("WidthC22");
0085 iConfig_.widthC23_ = iConfig.getParameter<int>("WidthC23");
0086 iConfig_.widthC33_ = iConfig.getParameter<int>("WidthC33");
0087 iConfig_.baseShiftx0_ = iConfig.getParameter<int>("BaseShiftx0");
0088 iConfig_.baseShiftx1_ = iConfig.getParameter<int>("BaseShiftx1");
0089 iConfig_.baseShiftx2_ = iConfig.getParameter<int>("BaseShiftx2");
0090 iConfig_.baseShiftx3_ = iConfig.getParameter<int>("BaseShiftx3");
0091 iConfig_.baseShiftr0_ = iConfig.getParameter<int>("BaseShiftr0");
0092 iConfig_.baseShiftr1_ = iConfig.getParameter<int>("BaseShiftr1");
0093 iConfig_.baseShiftS00_ = iConfig.getParameter<int>("BaseShiftS00");
0094 iConfig_.baseShiftS01_ = iConfig.getParameter<int>("BaseShiftS01");
0095 iConfig_.baseShiftS12_ = iConfig.getParameter<int>("BaseShiftS12");
0096 iConfig_.baseShiftS13_ = iConfig.getParameter<int>("BaseShiftS13");
0097 iConfig_.baseShiftR00_ = iConfig.getParameter<int>("BaseShiftR00");
0098 iConfig_.baseShiftR11_ = iConfig.getParameter<int>("BaseShiftR11");
0099 iConfig_.baseShiftInvR00Approx_ = iConfig.getParameter<int>("BaseShiftInvR00Approx");
0100 iConfig_.baseShiftInvR11Approx_ = iConfig.getParameter<int>("BaseShiftInvR11Approx");
0101 iConfig_.baseShiftInvR00Cor_ = iConfig.getParameter<int>("BaseShiftInvR00Cor");
0102 iConfig_.baseShiftInvR11Cor_ = iConfig.getParameter<int>("BaseShiftInvR11Cor");
0103 iConfig_.baseShiftInvR00_ = iConfig.getParameter<int>("BaseShiftInvR00");
0104 iConfig_.baseShiftInvR11_ = iConfig.getParameter<int>("BaseShiftInvR11");
0105 iConfig_.baseShiftS00Shifted_ = iConfig.getParameter<int>("BaseShiftS00Shifted");
0106 iConfig_.baseShiftS01Shifted_ = iConfig.getParameter<int>("BaseShiftS01Shifted");
0107 iConfig_.baseShiftS12Shifted_ = iConfig.getParameter<int>("BaseShiftS12Shifted");
0108 iConfig_.baseShiftS13Shifted_ = iConfig.getParameter<int>("BaseShiftS13Shifted");
0109 iConfig_.baseShiftK00_ = iConfig.getParameter<int>("BaseShiftK00");
0110 iConfig_.baseShiftK10_ = iConfig.getParameter<int>("BaseShiftK10");
0111 iConfig_.baseShiftK21_ = iConfig.getParameter<int>("BaseShiftK21");
0112 iConfig_.baseShiftK31_ = iConfig.getParameter<int>("BaseShiftK31");
0113 iConfig_.baseShiftC00_ = iConfig.getParameter<int>("BaseShiftC00");
0114 iConfig_.baseShiftC01_ = iConfig.getParameter<int>("BaseShiftC01");
0115 iConfig_.baseShiftC11_ = iConfig.getParameter<int>("BaseShiftC11");
0116 iConfig_.baseShiftC22_ = iConfig.getParameter<int>("BaseShiftC22");
0117 iConfig_.baseShiftC23_ = iConfig.getParameter<int>("BaseShiftC23");
0118 iConfig_.baseShiftC33_ = iConfig.getParameter<int>("BaseShiftC33");
0119 printDebug_ = iConfig.getParameter<bool>("PrintKFDebug");
0120 const std::string& label = iConfig.getParameter<std::string>("InputLabelKF");
0121 const std::string& branchStubs = iConfig.getParameter<std::string>("BranchStubs");
0122 const std::string& branchTracks = iConfig.getParameter<std::string>("BranchTracks");
0123 const std::string& branchTruncated = iConfig.getParameter<std::string>("BranchTruncated");
0124
0125 edGetTokenStubs_ = consumes<tt::StreamsStub>(edm::InputTag(label, branchStubs));
0126 edGetTokenTracks_ = consumes<tt::StreamsTrack>(edm::InputTag(label, branchTracks));
0127 edPutTokenStubs_ = produces<tt::StreamsStub>(branchStubs);
0128 edPutTokenTracks_ = produces<tt::StreamsTrack>(branchTracks);
0129 edPutTokenTTTracks_ = produces<tt::TTTracks>(branchTracks);
0130 edPutTokenNumStatesAccepted_ = produces<int>(branchTracks);
0131 edPutTokenNumStatesTruncated_ = produces<int>(branchTruncated);
0132
0133 esGetTokenSetup_ = esConsumes();
0134 esGetTokenDataFormats_ = esConsumes();
0135 }
0136
0137 void ProducerKF::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0138
0139 const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0140 settings_.setMagneticField(setup->bField());
0141
0142 const DataFormats* dataFormats = &iSetup.getData(esGetTokenDataFormats_);
0143 kalmanFilterFormats_.consume(dataFormats, iConfig_);
0144 auto valid = [](int sum, const tt::FrameTrack& f) { return sum + (f.first.isNull() ? 0 : 1); };
0145
0146 tt::StreamsStub streamsStub(setup->numRegions() * setup->numLayers());
0147 tt::StreamsTrack streamsTrack(setup->numRegions());
0148 int numStatesAccepted(0);
0149 int numStatesTruncated(0);
0150
0151 const tt::StreamsStub& stubs = iEvent.get(edGetTokenStubs_);
0152 const tt::StreamsTrack& tracks = iEvent.get(edGetTokenTracks_);
0153
0154 tt::TTTracks ttTracks;
0155 std::vector<TTTrackRef> ttTrackRefs;
0156 if (setup->kfUse5ParameterFit()) {
0157 tmtt_ = &tmtt5_;
0158 int nTracks(0);
0159 for (const tt::StreamTrack& stream : tracks)
0160 nTracks += std::accumulate(stream.begin(), stream.end(), 0, valid);
0161 ttTracks.reserve(nTracks);
0162 ttTrackRefs.reserve(nTracks);
0163 for (const tt::StreamTrack& stream : tracks)
0164 for (const tt::FrameTrack& frame : stream)
0165 if (frame.first.isNonnull())
0166 ttTrackRefs.push_back(frame.first);
0167 }
0168 for (int region = 0; region < setup->numRegions(); region++) {
0169
0170 KalmanFilter kf(setup, dataFormats, &kalmanFilterFormats_, &settings_, tmtt_, region, ttTracks);
0171
0172 kf.consume(tracks, stubs);
0173
0174 kf.produce(streamsStub, streamsTrack, numStatesAccepted, numStatesTruncated);
0175 }
0176 if (setup->kfUse5ParameterFit()) {
0177
0178 const edm::OrphanHandle<tt::TTTracks> oh = iEvent.emplace(edPutTokenTTTracks_, std::move(ttTracks));
0179
0180 int iTrk(0);
0181 for (tt::StreamTrack& stream : streamsTrack)
0182 for (tt::FrameTrack& frame : stream)
0183 if (frame.first.isNonnull())
0184 frame.first = TTTrackRef(oh, iTrk++);
0185 }
0186
0187 iEvent.emplace(edPutTokenStubs_, std::move(streamsStub));
0188 iEvent.emplace(edPutTokenTracks_, std::move(streamsTrack));
0189 iEvent.emplace(edPutTokenNumStatesAccepted_, numStatesAccepted);
0190 iEvent.emplace(edPutTokenNumStatesTruncated_, numStatesTruncated);
0191 }
0192
0193 }
0194
0195 DEFINE_FWK_MODULE(trklet::ProducerKF);