Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-03 00:12:14

0001 #ifndef L1Trigger_TrackerTFP_TrackFindingProcessor_h
0002 #define L1Trigger_TrackerTFP_TrackFindingProcessor_h
0003 
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0006 #include "L1Trigger/TrackerTFP/interface/DataFormats.h"
0007 #include "L1Trigger/TrackerTFP/interface/TrackQuality.h"
0008 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0009 
0010 #include <utility>
0011 #include <vector>
0012 #include <deque>
0013 
0014 namespace trackerTFP {
0015 
0016   // Class to format final tfp output and to prodcue final TTTrackCollection
0017   class TrackFindingProcessor {
0018   public:
0019     TrackFindingProcessor(const tt::Setup* setup_, const DataFormats* dataFormats, const TrackQuality* trackQuality);
0020     ~TrackFindingProcessor() = default;
0021 
0022     // produce TTTracks
0023     void produce(const tt::StreamsTrack& inputs,
0024                  const tt::StreamsStub& stubs,
0025                  tt::TTTracks& ttTracks,
0026                  tt::StreamsTrack& outputs);
0027     // produce StreamsTrack
0028     void produce(const std::vector<TTTrackRef>& inputs, tt::StreamsTrack& outputs) const;
0029 
0030   private:
0031     // number of bits used to describe one part of a track (96 bit)
0032     static constexpr int partial_width = 32;
0033     // number of track parts arriving per clock tick (1 track per tick)
0034     static constexpr int partial_in = 3;
0035     // number of track parts leaving per clock tick (TFP sends 2/3 tracks per clock and link)
0036     static constexpr int partial_out = 2;
0037     // type describing one part of a track
0038     typedef std::bitset<partial_width> PartialFrame;
0039     // type describing one part of a track together with its edm ref
0040     typedef std::pair<const TTTrackRef&, PartialFrame> PartialFrameTrack;
0041     // type representing a track
0042     struct Track {
0043       Track(const tt::FrameTrack& frameTrack,
0044             const tt::Frame& frameTQ,
0045             const std::vector<TTStubRef>& ttStubRefs,
0046             const TrackQuality* tq);
0047       const TTTrackRef& ttTrackRef_;
0048       const std::vector<TTStubRef> ttStubRefs_;
0049       bool valid_;
0050       std::vector<PartialFrame> partials_;
0051       TTBV hitPattern_;
0052       int channel_;
0053       int mva_;
0054       double inv2R_;
0055       double phiT_;
0056       double cot_;
0057       double zT_;
0058       double chi2rphi_;
0059       double chi2rz_;
0060     };
0061     // remove and return first element of deque, returns nullptr if empty
0062     template <class T>
0063     T* pop_front(std::deque<T*>& ts) const;
0064     //
0065     void consume(const tt::StreamsTrack& inputs,
0066                  const tt::StreamsStub& stubs,
0067                  std::vector<std::deque<Track*>>& outputs);
0068     // emualte data format f/w
0069     void produce(std::vector<std::deque<Track*>>& inputs, tt::StreamsTrack& outputs) const;
0070     // produce TTTracks
0071     void produce(const tt::StreamsTrack& inputs, tt::TTTracks& ouputs) const;
0072     // provides run-time constants
0073     const tt::Setup* setup_;
0074     // provides data formats
0075     const DataFormats* dataFormats_;
0076     // provides Track Quality algo and formats
0077     const TrackQuality* trackQuality_;
0078     // storage of tracks
0079     std::vector<Track> tracks_;
0080     // b field
0081     double bfield_;
0082   };
0083 
0084 }  // namespace trackerTFP
0085 
0086 #endif