Back to home page

Project CMSSW displayed by LXR

 
 

    


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   /*! \class  trackerTFP::ProducerTQ
0023    *  \brief  Bit accurate emulation of the track quality BDT
0024    *  \author Thomas Schuh
0025    *  \date   2024, Aug
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     // ED input token of kf stubs
0036     edm::EDGetTokenT<tt::StreamsStub> edGetTokenStubs_;
0037     // ED input token of kf tracks
0038     edm::EDGetTokenT<tt::StreamsTrack> edGetTokenTracks_;
0039     // ED output token for tracks
0040     edm::EDPutTokenT<tt::StreamsTrack> edPutTokenTracks_;
0041     // ED output token for additional track variables
0042     edm::EDPutTokenT<tt::Streams> edPutTokenTracksAdd_;
0043     // ED output token for stubs
0044     edm::EDPutTokenT<tt::StreamsStub> edPutTokenStubs_;
0045     // Setup token
0046     edm::ESGetToken<tt::Setup, tt::SetupRcd> esGetTokenSetup_;
0047     // DataFormats token
0048     edm::ESGetToken<DataFormats, DataFormatsRcd> esGetTokenDataFormats_;
0049     // TrackQuality token
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     // book in- and output ED products
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     // book ES products
0064     esGetTokenSetup_ = esConsumes();
0065     esGetTokenTrackQuality_ = esConsumes();
0066   }
0067 
0068   void ProducerTQ::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0069     // helper class to store configurations
0070     const tt::Setup* setup = &iSetup.getData(esGetTokenSetup_);
0071     // helper class to determine Track Quality
0072     const TrackQuality* trackQuality = &iSetup.getData(esGetTokenTrackQuality_);
0073     auto valid = [](int sum, const tt::FrameTrack& frame) { return sum + (frame.first.isNull() ? 0 : 1); };
0074     // empty TQ product
0075     tt::StreamsTrack outputTracks(setup->numRegions());
0076     tt::Streams outputTracksAdd(setup->numRegions());
0077     tt::StreamsStub outputStubs(setup->numRegions() * setup->numLayers());
0078     // read in KF Product and produce TQ product
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       // calculate track quality
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       // fill TQ product
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     // store TQ product
0123     iEvent.emplace(edPutTokenTracks_, std::move(outputTracks));
0124     iEvent.emplace(edPutTokenTracksAdd_, std::move(outputTracksAdd));
0125     iEvent.emplace(edPutTokenStubs_, streamsStubs);
0126   }
0127 }  // namespace trackerTFP
0128 
0129 DEFINE_FWK_MODULE(trackerTFP::ProducerTQ);