Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 /*
0002 Track Quality Header file
0003 C.Brown 28/07/20
0004 */
0005 
0006 #ifndef L1Trigger_TrackerTFP_TrackQuality_h
0007 #define L1Trigger_TrackerTFP_TrackQuality_h
0008 
0009 #include "FWCore/Framework/interface/data_default_record_trait.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "DataFormats/L1TrackTrigger/interface/TTTypes.h"
0012 #include "L1Trigger/TrackerTFP/interface/DataFormats.h"
0013 
0014 #include <vector>
0015 #include <string>
0016 #include <cmath>
0017 #include "ap_fixed.h"
0018 
0019 namespace trackerTFP {
0020 
0021   // number of mva bit
0022   static constexpr int widthMVA_ = TTTrack_TrackWord::TrackBitWidths::kMVAQualitySize;
0023   // number of mva bins
0024   static constexpr int numBinsMVA_ = 1 << widthMVA_;
0025   // number of chi2B bins
0026   static constexpr int numBinsChi2B_ = 1 << TTTrack_TrackWord::TrackBitWidths::kBendChi2Size;
0027   // number of chi2rphi bins
0028   static constexpr int numBinschi2rphi_ = 1 << TTTrack_TrackWord::TrackBitWidths::kChi2RPhiSize;
0029   // number of chi2rz bins
0030   static constexpr int numBinschi2rz_ = 1 << TTTrack_TrackWord::TrackBitWidths::kChi2RZSize;
0031 
0032   // track quality variables
0033   enum class VariableTQ { begin, m20 = begin, m21, invV0, invV1, chi2rphi, chi2rz, end, x };
0034   // conversion: Variable to int
0035   inline constexpr int operator+(VariableTQ v) { return static_cast<int>(v); }
0036   // increment of Variable
0037   inline constexpr VariableTQ operator+(VariableTQ v, int i) { return VariableTQ(+v + i); }
0038 
0039   // configuration
0040   struct ConfigTQ {
0041     edm::FileInPath model_;
0042     std::vector<std::string> featureNames_;
0043     double baseShiftCot_;
0044     double baseShiftZ0_;
0045     double baseShiftAPfixed_;
0046     int chi2rphiConv_;
0047     int chi2rzConv_;
0048     int weightBinFraction_;
0049     int dzTruncation_;
0050     int dphiTruncation_;
0051     int widthM20_;
0052     int widthM21_;
0053     int widthInvV0_;
0054     int widthInvV1_;
0055     int widthchi2rphi_;
0056     int widthchi2rz_;
0057     int baseShiftchi2rphi_;
0058     int baseShiftchi2rz_;
0059   };
0060 
0061   // function template for DataFormat generation
0062   template <VariableTQ v>
0063   DataFormat makeDataFormat(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0064 
0065   // specializations
0066 
0067   template <>
0068   DataFormat makeDataFormat<VariableTQ::m20>(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0069   template <>
0070   DataFormat makeDataFormat<VariableTQ::m21>(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0071   template <>
0072   DataFormat makeDataFormat<VariableTQ::invV0>(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0073   template <>
0074   DataFormat makeDataFormat<VariableTQ::invV1>(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0075   template <>
0076   DataFormat makeDataFormat<VariableTQ::chi2rphi>(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0077   template <>
0078   DataFormat makeDataFormat<VariableTQ::chi2rz>(const DataFormats* dataFormats, const ConfigTQ& iConfig);
0079 
0080   /*! \class  trackerTFP::TrackQuality
0081    *  \brief  Bit accurate emulation of the track quality BDT
0082    *  \author C.Brown
0083    *  \date   28/07/20
0084    *  \update 2024, June by Claire Savard
0085    *  \update 2024, Aug by Thomas Schuh
0086    */
0087   class TrackQuality {
0088   public:
0089     TrackQuality() {}
0090     TrackQuality(const ConfigTQ& iConfig, const DataFormats* dataFormats);
0091     ~TrackQuality() = default;
0092     // object to represent tracks
0093     struct Track {
0094       Track(const tt::FrameTrack& frameTrack, const tt::StreamStub& streamStub, const TrackQuality* tq);
0095       // track frame
0096       tt::FrameTrack frameTrack_;
0097       // additional track variables
0098       tt::Frame frame_;
0099       // collection of stubs forming track
0100       tt::StreamStub streamStub_;
0101     };
0102     // provides dataformats
0103     const DataFormats* dataFormats() const { return dataFormats_; }
0104     // Controls the conversion between TTTrack features and ML model training features
0105     std::vector<float> featureTransform(TTTrack<Ref_Phase2TrackerDigi_>& aTrack,
0106                                         const std::vector<std::string>& featureNames) const;
0107     // Passed by reference a track without MVA filled, method fills the track's MVA field
0108     void setL1TrackQuality(TTTrack<Ref_Phase2TrackerDigi_>& aTrack) const;
0109     // Helper function to convert mvaPreSig to bin
0110     int toBinMVA(double mva) const;
0111     // Helper function to convert chi2B to bin
0112     int toBinChi2B(double chi2B) const;
0113     // Helper function to convert chi2rphi to bin
0114     int toBinchi2rphi(double chi2rphi) const;
0115     // Helper function to convert chi2rz to bin
0116     int toBinchi2rz(double chi2rz) const;
0117     //
0118     double scaleCot(int cot) const { return scaleAP(scale(cot, baseShiftCot_)); }
0119     //
0120     double scaleZ0(int z0) const { return scaleAP(scale(z0, baseShiftZ0_)); }
0121     // access to spedific format
0122     const DataFormat& format(VariableTQ v) const { return dataFormatsTQ_[+v]; }
0123     //
0124     double base(VariableTQ v) const { return dataFormatsTQ_[+v].base(); }
0125     //
0126     double range(VariableTQ v) const { return dataFormatsTQ_[+v].range(); }
0127     //
0128     const edm::FileInPath& model() const { return model_; }
0129 
0130   private:
0131     // constructs TQ data formats
0132     template <VariableTQ v = VariableTQ::begin>
0133     void fillDataFormats(const ConfigTQ& iConfig);
0134     // TQ MVA bin conversion LUT
0135     constexpr std::array<double, numBinsMVA_> mvaPreSigBins() const;
0136     //
0137     static constexpr double invSigmoid(double value) { return -log(1. / value - 1.); }
0138     //
0139     template <class T>
0140     int toBin(const T& bins, double d) const;
0141     //
0142     int scale(int i, int shift) const { return floor(i * pow(2., shift)); }
0143     //
0144     double scaleAP(int i) const { return i * pow(2., baseShiftAPfixed_); }
0145     // provides dataformats
0146     const DataFormats* dataFormats_;
0147     //
0148     ConfigTQ iConfig_;
0149     //
0150     edm::FileInPath model_;
0151     //
0152     std::vector<std::string> featureNames_;
0153     //
0154     double baseShiftCot_;
0155     //
0156     double baseShiftZ0_;
0157     //
0158     double baseShiftAPfixed_;
0159     // Conversion factor between dphi^2/weight and chi2rphi
0160     int chi2rphiConv_;
0161     // Conversion factor between dz^2/weight and chi2rz
0162     int chi2rzConv_;
0163     // Fraction of total dphi and dz ranges to calculate v0 and v1 LUT for
0164     int weightBinFraction_;
0165     // Constant used in FW to prevent 32-bit int overflow
0166     int dzTruncation_;
0167     // Constant used in FW to prevent 32-bit int overflow
0168     int dphiTruncation_;
0169     // collection of unique formats
0170     std::vector<DataFormat> dataFormatsTQ_;
0171   };
0172 
0173 }  // namespace trackerTFP
0174 
0175 EVENTSETUP_DATA_DEFAULT_RECORD(trackerTFP::TrackQuality, trackerTFP::DataFormatsRcd);
0176 
0177 #endif