File indexing completed on 2024-04-06 12:21:43
0001 #ifndef L1Trigger_TrackerTFP_KalmanFilterFormats_h
0002 #define L1Trigger_TrackerTFP_KalmanFilterFormats_h
0003
0004
0005
0006
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
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 }
0197
0198 EVENTSETUP_DATA_DEFAULT_RECORD(trackerTFP::KalmanFilterFormats, trackerTFP::KalmanFilterFormatsRcd);
0199
0200 #endif