Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2022-10-14 01:43:51

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/Framework/interface/data_default_record_trait.h"
0010 #include "L1Trigger/TrackerTFP/interface/KalmanFilterFormatsRcd.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "L1Trigger/TrackerTFP/interface/DataFormats.h"
0013 
0014 #include <vector>
0015 #include <cmath>
0016 #include <initializer_list>
0017 #include <tuple>
0018 #include <utility>
0019 #include <array>
0020 #include <string>
0021 
0022 namespace trackerTFP {
0023 
0024   enum class VariableKF {
0025     begin,
0026     x0 = begin,
0027     x1,
0028     x2,
0029     x3,
0030     H00,
0031     H12,
0032     m0,
0033     m1,
0034     v0,
0035     v1,
0036     r0,
0037     r1,
0038     S00,
0039     S01,
0040     S12,
0041     S13,
0042     K00,
0043     K10,
0044     K21,
0045     K31,
0046     R00,
0047     R11,
0048     R00Rough,
0049     R11Rough,
0050     invR00Approx,
0051     invR11Approx,
0052     invR00Cor,
0053     invR11Cor,
0054     invR00,
0055     invR11,
0056     C00,
0057     C01,
0058     C11,
0059     C22,
0060     C23,
0061     C33,
0062     end,
0063     x
0064   };
0065   inline constexpr int operator+(VariableKF v) { return static_cast<int>(v); }
0066   inline constexpr VariableKF operator++(VariableKF v) { return VariableKF(+v + 1); }
0067 
0068   class DataFormatKF {
0069   public:
0070     DataFormatKF(const VariableKF& v, bool twos);
0071     virtual ~DataFormatKF() {}
0072     double digi(double val) const { return (std::floor(val / base_ + 1.e-12) + .5) * base_; }
0073     bool twos() const { return twos_; }
0074     int width() const { return width_; }
0075     double base() const { return base_; }
0076     double range() const { return range_; }
0077     const std::pair<double, double>& rangeActual() const { return rangeActual_; }
0078     // returns false if data format would oferflow for this double value
0079     bool inRange(double d) const;
0080     void updateRangeActual(double d);
0081     int integer(double d) const { return floor(d / base_); }
0082 
0083   protected:
0084     VariableKF v_;
0085     bool twos_;
0086     int width_;
0087     double base_;
0088     double range_;
0089     std::pair<double, double> rangeActual_;
0090   };
0091 
0092   template <VariableKF v>
0093   class FormatKF : public DataFormatKF {
0094   public:
0095     FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0096     ~FormatKF() override {}
0097 
0098   private:
0099     void calcRange() { range_ = base_ * pow(2, width_); }
0100   };
0101 
0102   template <>
0103   FormatKF<VariableKF::x0>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0104   template <>
0105   FormatKF<VariableKF::x1>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0106   template <>
0107   FormatKF<VariableKF::x2>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0108   template <>
0109   FormatKF<VariableKF::x3>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0110   template <>
0111   FormatKF<VariableKF::H00>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0112   template <>
0113   FormatKF<VariableKF::H12>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0114   template <>
0115   FormatKF<VariableKF::m0>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0116   template <>
0117   FormatKF<VariableKF::m1>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0118   template <>
0119   FormatKF<VariableKF::v0>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0120   template <>
0121   FormatKF<VariableKF::v1>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0122   template <>
0123   FormatKF<VariableKF::r0>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0124   template <>
0125   FormatKF<VariableKF::r1>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0126   template <>
0127   FormatKF<VariableKF::S00>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0128   template <>
0129   FormatKF<VariableKF::S01>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0130   template <>
0131   FormatKF<VariableKF::S12>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0132   template <>
0133   FormatKF<VariableKF::S13>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0134   template <>
0135   FormatKF<VariableKF::K00>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0136   template <>
0137   FormatKF<VariableKF::K10>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0138   template <>
0139   FormatKF<VariableKF::K21>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0140   template <>
0141   FormatKF<VariableKF::K31>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0142   template <>
0143   FormatKF<VariableKF::R00>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0144   template <>
0145   FormatKF<VariableKF::R11>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0146   template <>
0147   FormatKF<VariableKF::R00Rough>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0148   template <>
0149   FormatKF<VariableKF::R11Rough>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0150   template <>
0151   FormatKF<VariableKF::invR00Approx>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0152   template <>
0153   FormatKF<VariableKF::invR11Approx>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0154   template <>
0155   FormatKF<VariableKF::invR00Cor>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0156   template <>
0157   FormatKF<VariableKF::invR11Cor>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0158   template <>
0159   FormatKF<VariableKF::invR00>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0160   template <>
0161   FormatKF<VariableKF::invR11>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0162   template <>
0163   FormatKF<VariableKF::C00>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0164   template <>
0165   FormatKF<VariableKF::C01>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0166   template <>
0167   FormatKF<VariableKF::C11>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0168   template <>
0169   FormatKF<VariableKF::C22>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0170   template <>
0171   FormatKF<VariableKF::C23>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0172   template <>
0173   FormatKF<VariableKF::C33>::FormatKF(const DataFormats* dataFormats, const edm::ParameterSet& iConfig);
0174 
0175   class KalmanFilterFormats {
0176   public:
0177     KalmanFilterFormats();
0178     KalmanFilterFormats(const edm::ParameterSet& iConfig, const DataFormats* dataFormats);
0179     ~KalmanFilterFormats() {}
0180     const tt::Setup* setup() const { return setup_; }
0181     const DataFormats* dataFormats() const { return dataFormats_; }
0182     int width(VariableKF v) const { return formats_[+v].width(); }
0183     double base(VariableKF v) const { return formats_[+v].base(); }
0184     DataFormatKF& format(VariableKF v) { return formats_[+v]; }
0185     void endJob();
0186 
0187   private:
0188     template <VariableKF it = VariableKF::begin>
0189     void fillFormats();
0190     const edm::ParameterSet iConfig_;
0191     const DataFormats* dataFormats_;
0192     const tt::Setup* setup_;
0193     std::vector<DataFormatKF> formats_;
0194   };
0195 
0196 }  // namespace trackerTFP
0197 
0198 EVENTSETUP_DATA_DEFAULT_RECORD(trackerTFP::KalmanFilterFormats, trackerTFP::KalmanFilterFormatsRcd);
0199 
0200 #endif