Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 #ifndef L1Trigger_TrackerTFP_KalmanFilterFormats_h
0002 #define L1Trigger_TrackerTFP_KalmanFilterFormats_h
0003 
0004 /*----------------------------------------------------------------------
0005 Classes to calculate and provide dataformats used by Kalman Filter emulator
0006 enabling tuning of bit widths
0007 ----------------------------------------------------------------------*/
0008 
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "L1Trigger/TrackerTFP/interface/DataFormats.h"
0011 
0012 #include <vector>
0013 #include <cmath>
0014 #include <initializer_list>
0015 #include <tuple>
0016 #include <utility>
0017 #include <array>
0018 #include <string>
0019 
0020 namespace trackerTFP {
0021 
0022   enum class VariableKF {
0023     begin,
0024     x0 = begin,
0025     x1,
0026     x2,
0027     x3,
0028     H00,
0029     H12,
0030     m0,
0031     m1,
0032     v0,
0033     v1,
0034     r0,
0035     r1,
0036     S00,
0037     S01,
0038     S12,
0039     S13,
0040     S00Shifted,
0041     S01Shifted,
0042     S12Shifted,
0043     S13Shifted,
0044     K00,
0045     K10,
0046     K21,
0047     K31,
0048     R00,
0049     R11,
0050     R00Rough,
0051     R11Rough,
0052     invR00Approx,
0053     invR11Approx,
0054     invR00Cor,
0055     invR11Cor,
0056     invR00,
0057     invR11,
0058     C00,
0059     C01,
0060     C11,
0061     C22,
0062     C23,
0063     C33,
0064     r0Shifted,
0065     r1Shifted,
0066     r02,
0067     r12,
0068     chi20,
0069     chi21,
0070     dH,
0071     invdH,
0072     invdH2,
0073     H2,
0074     Hm0,
0075     Hm1,
0076     Hv0,
0077     Hv1,
0078     H2v0,
0079     H2v1,
0080     end,
0081     x
0082   };
0083   inline constexpr int operator+(VariableKF v) { return static_cast<int>(v); }
0084   inline constexpr VariableKF operator+(VariableKF v, int i) { return VariableKF(+v + i); }
0085 
0086   // Configuration
0087   struct ConfigKF {
0088     bool enableIntegerEmulation_;
0089     int widthR00_;
0090     int widthR11_;
0091     int widthC00_;
0092     int widthC01_;
0093     int widthC11_;
0094     int widthC22_;
0095     int widthC23_;
0096     int widthC33_;
0097     int baseShiftx0_;
0098     int baseShiftx1_;
0099     int baseShiftx2_;
0100     int baseShiftx3_;
0101     int baseShiftr0_;
0102     int baseShiftr1_;
0103     int baseShiftS00_;
0104     int baseShiftS01_;
0105     int baseShiftS12_;
0106     int baseShiftS13_;
0107     int baseShiftR00_;
0108     int baseShiftR11_;
0109     int baseShiftInvR00Approx_;
0110     int baseShiftInvR11Approx_;
0111     int baseShiftInvR00Cor_;
0112     int baseShiftInvR11Cor_;
0113     int baseShiftInvR00_;
0114     int baseShiftInvR11_;
0115     int baseShiftS00Shifted_;
0116     int baseShiftS01Shifted_;
0117     int baseShiftS12Shifted_;
0118     int baseShiftS13Shifted_;
0119     int baseShiftK00_;
0120     int baseShiftK10_;
0121     int baseShiftK21_;
0122     int baseShiftK31_;
0123     int baseShiftC00_;
0124     int baseShiftC01_;
0125     int baseShiftC11_;
0126     int baseShiftC22_;
0127     int baseShiftC23_;
0128     int baseShiftC33_;
0129     int baseShiftr0Shifted_;
0130     int baseShiftr1Shifted_;
0131     int baseShiftr02_;
0132     int baseShiftr12_;
0133     int baseShiftchi20_;
0134     int baseShiftchi21_;
0135   };
0136 
0137   class DataFormatKF {
0138   public:
0139     DataFormatKF(const VariableKF& v, bool twos, bool enableIntegerEmulation, int width, double base, double range);
0140     ~DataFormatKF() = default;
0141     double digi(double val) const {
0142       return enableIntegerEmulation_ ? (std::floor(val / base_ + 1.e-11) + .5) * base_ : val;
0143     }
0144     bool twos() const { return twos_; }
0145     int width() const { return width_; }
0146     double base() const { return base_; }
0147     double range() const { return range_; }
0148     double min() const { return min_; }
0149     double abs() const { return abs_; }
0150     double max() const { return max_; }
0151     // returns false if data format would oferflow for this double value
0152     bool inRange(double d) const;
0153     void updateRangeActual(double d);
0154     int integer(double d) const { return floor(d / base_ + 1.e-11); }
0155 
0156   protected:
0157     VariableKF v_;
0158     bool twos_;
0159     bool enableIntegerEmulation_;
0160     int width_;
0161     double base_;
0162     double range_;
0163     double min_;
0164     double abs_;
0165     double max_;
0166   };
0167 
0168   class KalmanFilterFormats {
0169   public:
0170     KalmanFilterFormats();
0171     ~KalmanFilterFormats() = default;
0172     void beginRun(const DataFormats* dataFormats, const ConfigKF& iConfig);
0173     const tt::Setup* setup() const { return dataFormats_->setup(); }
0174     const DataFormats* dataFormats() const { return dataFormats_; }
0175     DataFormatKF& format(VariableKF v) { return formats_[+v]; }
0176     void endJob(std::stringstream& ss);
0177 
0178   private:
0179     template <VariableKF it = VariableKF::begin>
0180     void fillFormats();
0181     ConfigKF iConfig_;
0182     const DataFormats* dataFormats_;
0183     std::vector<DataFormatKF> formats_;
0184   };
0185 
0186   // function template for DataFormat generation
0187   template <VariableKF v>
0188   DataFormatKF makeDataFormat(const DataFormats* dataFormats, const ConfigKF& iConfig);
0189 
0190   template <>
0191   DataFormatKF makeDataFormat<VariableKF::x0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0192   template <>
0193   DataFormatKF makeDataFormat<VariableKF::x1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0194   template <>
0195   DataFormatKF makeDataFormat<VariableKF::x2>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0196   template <>
0197   DataFormatKF makeDataFormat<VariableKF::x3>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0198   template <>
0199   DataFormatKF makeDataFormat<VariableKF::H00>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0200   template <>
0201   DataFormatKF makeDataFormat<VariableKF::H12>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0202   template <>
0203   DataFormatKF makeDataFormat<VariableKF::m0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0204   template <>
0205   DataFormatKF makeDataFormat<VariableKF::m1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0206   template <>
0207   DataFormatKF makeDataFormat<VariableKF::v0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0208   template <>
0209   DataFormatKF makeDataFormat<VariableKF::v1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0210   template <>
0211   DataFormatKF makeDataFormat<VariableKF::r0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0212   template <>
0213   DataFormatKF makeDataFormat<VariableKF::r1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0214   template <>
0215   DataFormatKF makeDataFormat<VariableKF::S00>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0216   template <>
0217   DataFormatKF makeDataFormat<VariableKF::S01>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0218   template <>
0219   DataFormatKF makeDataFormat<VariableKF::S12>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0220   template <>
0221   DataFormatKF makeDataFormat<VariableKF::S13>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0222   template <>
0223   DataFormatKF makeDataFormat<VariableKF::S00Shifted>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0224   template <>
0225   DataFormatKF makeDataFormat<VariableKF::S01Shifted>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0226   template <>
0227   DataFormatKF makeDataFormat<VariableKF::S12Shifted>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0228   template <>
0229   DataFormatKF makeDataFormat<VariableKF::S13Shifted>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0230   template <>
0231   DataFormatKF makeDataFormat<VariableKF::K00>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0232   template <>
0233   DataFormatKF makeDataFormat<VariableKF::K10>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0234   template <>
0235   DataFormatKF makeDataFormat<VariableKF::K21>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0236   template <>
0237   DataFormatKF makeDataFormat<VariableKF::K31>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0238   template <>
0239   DataFormatKF makeDataFormat<VariableKF::R00>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0240   template <>
0241   DataFormatKF makeDataFormat<VariableKF::R11>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0242   template <>
0243   DataFormatKF makeDataFormat<VariableKF::R00Rough>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0244   template <>
0245   DataFormatKF makeDataFormat<VariableKF::R11Rough>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0246   template <>
0247   DataFormatKF makeDataFormat<VariableKF::invR00Approx>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0248   template <>
0249   DataFormatKF makeDataFormat<VariableKF::invR11Approx>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0250   template <>
0251   DataFormatKF makeDataFormat<VariableKF::invR00Cor>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0252   template <>
0253   DataFormatKF makeDataFormat<VariableKF::invR11Cor>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0254   template <>
0255   DataFormatKF makeDataFormat<VariableKF::invR00>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0256   template <>
0257   DataFormatKF makeDataFormat<VariableKF::invR11>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0258   template <>
0259   DataFormatKF makeDataFormat<VariableKF::C00>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0260   template <>
0261   DataFormatKF makeDataFormat<VariableKF::C01>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0262   template <>
0263   DataFormatKF makeDataFormat<VariableKF::C11>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0264   template <>
0265   DataFormatKF makeDataFormat<VariableKF::C22>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0266   template <>
0267   DataFormatKF makeDataFormat<VariableKF::C23>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0268   template <>
0269   DataFormatKF makeDataFormat<VariableKF::C33>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0270   template <>
0271   DataFormatKF makeDataFormat<VariableKF::r0Shifted>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0272   template <>
0273   DataFormatKF makeDataFormat<VariableKF::r1Shifted>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0274   template <>
0275   DataFormatKF makeDataFormat<VariableKF::r02>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0276   template <>
0277   DataFormatKF makeDataFormat<VariableKF::r12>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0278   template <>
0279   DataFormatKF makeDataFormat<VariableKF::chi20>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0280   template <>
0281   DataFormatKF makeDataFormat<VariableKF::chi21>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0282 
0283   template <>
0284   DataFormatKF makeDataFormat<VariableKF::dH>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0285   template <>
0286   DataFormatKF makeDataFormat<VariableKF::invdH>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0287   template <>
0288   DataFormatKF makeDataFormat<VariableKF::invdH2>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0289   template <>
0290   DataFormatKF makeDataFormat<VariableKF::H2>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0291   template <>
0292   DataFormatKF makeDataFormat<VariableKF::Hm0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0293   template <>
0294   DataFormatKF makeDataFormat<VariableKF::Hm1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0295   template <>
0296   DataFormatKF makeDataFormat<VariableKF::Hv0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0297   template <>
0298   DataFormatKF makeDataFormat<VariableKF::Hv1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0299   template <>
0300   DataFormatKF makeDataFormat<VariableKF::H2v0>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0301   template <>
0302   DataFormatKF makeDataFormat<VariableKF::H2v1>(const DataFormats* dataFormats, const ConfigKF& iConfig);
0303 
0304 }  // namespace trackerTFP
0305 
0306 #endif