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 
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   /*! \class  trklet::ProducerKF
0026    *  \brief  L1TrackTrigger Kamlan Filter emulator
0027    *  \author Thomas Schuh
0028    *  \date   2020, July
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     // ED input token of sf stubs and tracks
0044     edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0045     edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0046     // ED output token for accepted stubs and tracks
0047     edm::EDPutTokenT<tt::TTTracks> edPutTokenTTTracks_;
0048     edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0049     edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0050     // ED output token for number of accepted and lost States
0051     edm::EDPutTokenT<int> edPutTokenNumStatesAccepted_;
0052     edm::EDPutTokenT<int> edPutTokenNumStatesTruncated_;
0053     // Setup token
0054     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0055     // DataFormats token
0056     edm::ESGetToken<DataFormats, ChannelAssignmentRcd> esGetTokenDataFormats_;
0057     // provides dataformats of Kalman filter internals
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     // print end job internal unused MSB
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     // book in- and output ED products
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     // book ES products
0133     esGetTokenSetup_ = esConsumes();
0134     esGetTokenDataFormats_ = esConsumes();
0135   }
0136 
0137   void ProducerKF::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0138     // helper class to store configurations
0139     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0140     settings_.setMagneticField(setup->bField());
0141     // helper class to extract structured data from tt::Frames
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     // empty KF products
0146     tt::StreamsStub streamsStub(setup->numRegions() * setup->numLayers());
0147     tt::StreamsTrack streamsTrack(setup->numRegions());
0148     int numStatesAccepted(0);
0149     int numStatesTruncated(0);
0150     // read in DR Product and produce KF product
0151     const tt::StreamsStub& stubs = iEvent.get(edGetTokenStubs_);
0152     const tt::StreamsTrack& tracks = iEvent.get(edGetTokenTracks_);
0153     // prep TTTracks
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       // object to fit tracks in a processing region
0170       KalmanFilter kf(setup, dataFormats, &kalmanFilterFormats_, &settings_, tmtt_, region, ttTracks);
0171       // read in and organize input tracks and stubs
0172       kf.consume(tracks, stubs);
0173       // fill output products
0174       kf.produce(streamsStub, streamsTrack, numStatesAccepted, numStatesTruncated);
0175     }
0176     if (setup->kfUse5ParameterFit()) {
0177       // store ttTracks
0178       const edm::OrphanHandle<tt::TTTracks> oh = iEvent.emplace(edPutTokenTTTracks_, std::move(ttTracks));
0179       // replace ttTrackRefs in track streams
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     // store products
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 }  // namespace trklet
0194 
0195 DEFINE_FWK_MODULE(trklet::ProducerKF);