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
0006
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
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
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
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 }
0305
0306 #endif