File indexing completed on 2025-06-11 03:00:13
0001 #ifndef L1Trigger_TrackerTFP_DataFormats_h
0002 #define L1Trigger_TrackerTFP_DataFormats_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "FWCore/Framework/interface/data_default_record_trait.h"
0013 #include "L1Trigger/TrackerTFP/interface/DataFormatsRcd.h"
0014 #include "L1Trigger/TrackTrigger/interface/Setup.h"
0015 #include "DataFormats/L1TrackTrigger/interface/TTBV.h"
0016
0017 #include <vector>
0018 #include <cmath>
0019 #include <initializer_list>
0020 #include <tuple>
0021 #include <iostream>
0022 #include <string>
0023
0024 namespace trackerTFP {
0025
0026
0027 enum class Process { begin, dtc = begin, pp, gp, ht, ctb, kf, dr, tfp, end, x };
0028
0029 enum class Variable { begin, r = begin, phi, z, dPhi, dZ, inv2R, phiT, cot, zT, layer, match, end, x };
0030
0031 constexpr std::initializer_list<Process> Processes = {
0032 Process::dtc, Process::pp, Process::gp, Process::ht, Process::ctb, Process::kf, Process::dr, Process::tfp};
0033
0034 inline constexpr int operator+(Process p) { return static_cast<int>(p); }
0035
0036 inline constexpr int operator+(Variable v) { return static_cast<int>(v); }
0037 inline constexpr Process operator+(Process p, int i) { return Process(+p + i); }
0038 inline constexpr Variable operator+(Variable v, int i) { return Variable(+v + i); }
0039
0040
0041 class DataFormat {
0042 public:
0043 DataFormat() {}
0044 DataFormat(bool twos, bool biased = true) : twos_(twos), width_(0), base_(1.), range_(0.) {}
0045 DataFormat(bool twos, int width, double base, double range)
0046 : twos_(twos), width_(width), base_(base), range_(range) {}
0047 ~DataFormat() = default;
0048
0049 TTBV ttBV(int i) const { return TTBV(i, width_, twos_); }
0050
0051 TTBV ttBV(double d) const { return TTBV(d, base_, width_, twos_); }
0052
0053 void extract(TTBV& in, int& out) const { out = in.extract(width_, twos_); }
0054
0055 void extract(TTBV& in, double& out) const { out = in.extract(base_, width_, twos_); }
0056
0057 void extract(TTBV& in, TTBV& out) const { out = in.slice(width_, twos_); }
0058
0059 void extract(TTBV& in, bool& out) const { out = in.extract(); }
0060
0061 void attach(const int i, TTBV& ttBV) const { ttBV += TTBV(i, width_, twos_); }
0062
0063 void attach(const double d, TTBV& ttBV) const { ttBV += TTBV(d, base_, width_, twos_); }
0064
0065 void attach(const TTBV& bv, TTBV& ttBV) const { ttBV += bv; }
0066
0067 double floating(int i) const { return (i + .5) * base_; }
0068
0069 int integer(double d) const { return std::floor(d / base_ + 1.e-12); }
0070
0071 double digi(double d) const { return floating(integer(d)); }
0072
0073 int toSigned(int i) const { return i - std::pow(2, width_) / 2; }
0074
0075 int toUnsigned(int i) const { return i + std::pow(2, width_) / 2; }
0076
0077 int toUnsigned(double d) const { return this->integer(d) + std::pow(2, width_) / 2; }
0078
0079
0080
0081 bool inRange(double d, bool digi = true) const {
0082 const double range = digi ? base_ * pow(2, width_) : range_;
0083 return d >= -range / 2. && d < range / 2.;
0084 }
0085
0086 bool inRange(int i) const { return inRange(floating(i)); }
0087
0088 bool twos() const { return twos_; }
0089
0090 int width() const { return width_; }
0091
0092 double base() const { return base_; }
0093
0094 double range() const { return range_; }
0095
0096 protected:
0097
0098 bool twos_;
0099
0100 int width_;
0101
0102 double base_;
0103
0104 double range_;
0105 };
0106
0107
0108 template <Variable v, Process p>
0109 DataFormat makeDataFormat(const tt::Setup* setup);
0110
0111
0112
0113 template <>
0114 DataFormat makeDataFormat<Variable::inv2R, Process::tfp>(const tt::Setup* setup);
0115 template <>
0116 DataFormat makeDataFormat<Variable::phiT, Process::tfp>(const tt::Setup* setup);
0117 template <>
0118 DataFormat makeDataFormat<Variable::cot, Process::tfp>(const tt::Setup* setup);
0119 template <>
0120 DataFormat makeDataFormat<Variable::zT, Process::tfp>(const tt::Setup* setup);
0121
0122 template <>
0123 DataFormat makeDataFormat<Variable::r, Process::dtc>(const tt::Setup* setup);
0124 template <>
0125 DataFormat makeDataFormat<Variable::phi, Process::dtc>(const tt::Setup* setup);
0126 template <>
0127 DataFormat makeDataFormat<Variable::z, Process::dtc>(const tt::Setup* setup);
0128 template <>
0129 DataFormat makeDataFormat<Variable::layer, Process::dtc>(const tt::Setup* setup);
0130
0131 template <>
0132 DataFormat makeDataFormat<Variable::phi, Process::gp>(const tt::Setup* setup);
0133 template <>
0134 DataFormat makeDataFormat<Variable::z, Process::gp>(const tt::Setup* setup);
0135 template <>
0136 DataFormat makeDataFormat<Variable::phiT, Process::gp>(const tt::Setup* setup);
0137 template <>
0138 DataFormat makeDataFormat<Variable::zT, Process::gp>(const tt::Setup* setup);
0139 template <>
0140 DataFormat makeDataFormat<Variable::cot, Process::gp>(const tt::Setup* setup);
0141 template <>
0142 DataFormat makeDataFormat<Variable::layer, Process::gp>(const tt::Setup* setup);
0143
0144 template <>
0145 DataFormat makeDataFormat<Variable::phi, Process::ht>(const tt::Setup* setup);
0146 template <>
0147 DataFormat makeDataFormat<Variable::inv2R, Process::ht>(const tt::Setup* setup);
0148 template <>
0149 DataFormat makeDataFormat<Variable::phiT, Process::ht>(const tt::Setup* setup);
0150
0151 template <>
0152 DataFormat makeDataFormat<Variable::dPhi, Process::ctb>(const tt::Setup* setup);
0153 template <>
0154 DataFormat makeDataFormat<Variable::dZ, Process::ctb>(const tt::Setup* setup);
0155 template <>
0156 DataFormat makeDataFormat<Variable::layer, Process::ctb>(const tt::Setup* setup);
0157
0158 template <>
0159 DataFormat makeDataFormat<Variable::inv2R, Process::kf>(const tt::Setup* setup);
0160 template <>
0161 DataFormat makeDataFormat<Variable::phiT, Process::kf>(const tt::Setup* setup);
0162 template <>
0163 DataFormat makeDataFormat<Variable::cot, Process::kf>(const tt::Setup* setup);
0164 template <>
0165 DataFormat makeDataFormat<Variable::zT, Process::kf>(const tt::Setup* setup);
0166 template <>
0167 DataFormat makeDataFormat<Variable::phi, Process::kf>(const tt::Setup* setup);
0168 template <>
0169 DataFormat makeDataFormat<Variable::match, Process::kf>(const tt::Setup* setup);
0170
0171 template <>
0172 DataFormat makeDataFormat<Variable::cot, Process::dr>(const tt::Setup* setup);
0173
0174
0175
0176
0177
0178
0179 class DataFormats {
0180 private:
0181
0182 static constexpr std::array<std::array<Process, +Process::end>, +Variable::end> config_ = {{
0183
0184 {{Process::dtc,
0185 Process::dtc,
0186 Process::dtc,
0187 Process::dtc,
0188 Process::dtc,
0189 Process::dtc,
0190 Process::dtc,
0191 Process::x}},
0192 {{Process::dtc,
0193 Process::dtc,
0194 Process::gp,
0195 Process::ht,
0196 Process::ht,
0197 Process::kf,
0198 Process::kf,
0199 Process::x}},
0200 {{Process::dtc,
0201 Process::dtc,
0202 Process::gp,
0203 Process::gp,
0204 Process::gp,
0205 Process::gp,
0206 Process::gp,
0207 Process::x}},
0208 {{Process::x,
0209 Process::x,
0210 Process::x,
0211 Process::x,
0212 Process::ctb,
0213 Process::ctb,
0214 Process::ctb,
0215 Process::x}},
0216 {{Process::x,
0217 Process::x,
0218 Process::x,
0219 Process::x,
0220 Process::ctb,
0221 Process::ctb,
0222 Process::ctb,
0223 Process::x}},
0224 {{Process::ht,
0225 Process::ht,
0226 Process::ht,
0227 Process::ht,
0228 Process::ht,
0229 Process::kf,
0230 Process::kf,
0231 Process::tfp}},
0232 {{Process::gp,
0233 Process::gp,
0234 Process::gp,
0235 Process::ht,
0236 Process::ht,
0237 Process::kf,
0238 Process::kf,
0239 Process::tfp}},
0240 {{Process::x,
0241 Process::x,
0242 Process::gp,
0243 Process::x,
0244 Process::gp,
0245 Process::kf,
0246 Process::dr,
0247 Process::tfp}},
0248 {{Process::gp,
0249 Process::gp,
0250 Process::gp,
0251 Process::gp,
0252 Process::gp,
0253 Process::kf,
0254 Process::kf,
0255 Process::tfp}},
0256 {{Process::dtc,
0257 Process::dtc,
0258 Process::gp,
0259 Process::gp,
0260 Process::ctb,
0261 Process::x,
0262 Process::x,
0263 Process::x}},
0264 {{Process::x, Process::x, Process::x, Process::x, Process::x, Process::kf, Process::x, Process::x}}
0265 }};
0266
0267 static constexpr std::array<std::initializer_list<Variable>, +Process::end> stubs_ = {{
0268 {Variable::r,
0269 Variable::phi,
0270 Variable::z,
0271 Variable::layer,
0272 Variable::phiT,
0273 Variable::phiT,
0274 Variable::zT,
0275 Variable::zT,
0276 Variable::inv2R,
0277 Variable::inv2R},
0278 {Variable::r,
0279 Variable::phi,
0280 Variable::z,
0281 Variable::layer,
0282 Variable::phiT,
0283 Variable::phiT,
0284 Variable::zT,
0285 Variable::zT,
0286 Variable::inv2R,
0287 Variable::inv2R},
0288 {Variable::r, Variable::phi, Variable::z, Variable::layer, Variable::inv2R, Variable::inv2R},
0289 {Variable::r, Variable::phi, Variable::z, Variable::layer, Variable::phiT, Variable::zT},
0290 {Variable::r, Variable::phi, Variable::z, Variable::dPhi, Variable::dZ},
0291 {Variable::r, Variable::phi, Variable::z, Variable::dPhi, Variable::dZ},
0292 {Variable::r, Variable::phi, Variable::z, Variable::dPhi, Variable::dZ},
0293 {}
0294 }};
0295
0296 static constexpr std::array<std::initializer_list<Variable>, +Process::end> tracks_ = {{
0297 {},
0298 {},
0299 {},
0300 {},
0301 {Variable::inv2R, Variable::phiT, Variable::zT},
0302 {Variable::inv2R, Variable::phiT, Variable::cot, Variable::zT, Variable::match},
0303 {Variable::inv2R, Variable::phiT, Variable::cot, Variable::zT},
0304 {}
0305 }};
0306
0307 public:
0308 DataFormats();
0309 DataFormats(const tt::Setup* setup);
0310 ~DataFormats() = default;
0311
0312 template <typename... Ts>
0313 void convertStub(Process p, const tt::Frame& bv, std::tuple<Ts...>& data) const {
0314 TTBV ttBV(bv);
0315 extractStub(p, ttBV, data);
0316 }
0317
0318 template <typename... Ts>
0319 void convertStub(Process p, const std::tuple<Ts...>& data, tt::Frame& bv) const {
0320 TTBV ttBV(1, 1 + numUnusedBitsStubs_[+p]);
0321 attachStub(p, data, ttBV);
0322 bv = ttBV.bs();
0323 }
0324
0325 template <typename... Ts>
0326 void convertTrack(Process p, const tt::Frame& bv, std::tuple<Ts...>& data) const {
0327 TTBV ttBV(bv);
0328 extractTrack(p, ttBV, data);
0329 }
0330
0331 template <typename... Ts>
0332 void convertTrack(Process p, const std::tuple<Ts...>& data, tt::Frame& bv) const {
0333 TTBV ttBV(1, 1 + numUnusedBitsTracks_[+p]);
0334 attachTrack(p, data, ttBV);
0335 bv = ttBV.bs();
0336 }
0337
0338 const tt::Setup* setup() const { return setup_; }
0339
0340 int width(Variable v, Process p) const { return formats_[+v][+p]->width(); }
0341
0342 double base(Variable v, Process p) const { return formats_[+v][+p]->base(); }
0343
0344 double range(Variable v, Process p) const { return formats_[+v][+p]->range(); }
0345
0346 int numUnusedBitsStubs(Process p) const { return numUnusedBitsStubs_[+p]; }
0347
0348 int numUnusedBitsTracks(Process p) const { return numUnusedBitsTracks_[+p]; }
0349
0350 int numChannel(Process p) const { return numChannel_[+p]; }
0351
0352 int numStreamsStubs(Process p) const { return numStreamsStubs_[+p]; }
0353
0354 int numStreamsTracks(Process p) const { return numStreamsTracks_[+p]; }
0355
0356 const DataFormat& format(Variable v, Process p) const { return *formats_[+v][+p]; }
0357
0358 private:
0359
0360 int numDataFormats_;
0361
0362 template <Variable v = Variable::begin, Process p = Process::begin>
0363 void countFormats();
0364
0365 template <Variable v = Variable::begin, Process p = Process::begin>
0366 void fillDataFormats();
0367
0368 template <Variable v, Process p, Process it = Process::begin>
0369 void fillFormats();
0370
0371 template <int it = 0, typename... Ts>
0372 void extractStub(Process p, TTBV& ttBV, std::tuple<Ts...>& data) const {
0373 Variable v = *std::next(stubs_[+p].begin(), sizeof...(Ts) - 1 - it);
0374 formats_[+v][+p]->extract(ttBV, std::get<sizeof...(Ts) - 1 - it>(data));
0375 if constexpr (it + 1 != sizeof...(Ts))
0376 extractStub<it + 1>(p, ttBV, data);
0377 }
0378
0379 template <int it = 0, typename... Ts>
0380 void extractTrack(Process p, TTBV& ttBV, std::tuple<Ts...>& data) const {
0381 Variable v = *std::next(tracks_[+p].begin(), sizeof...(Ts) - 1 - it);
0382 formats_[+v][+p]->extract(ttBV, std::get<sizeof...(Ts) - 1 - it>(data));
0383 if constexpr (it + 1 != sizeof...(Ts))
0384 extractTrack<it + 1>(p, ttBV, data);
0385 }
0386
0387 template <int it = 0, typename... Ts>
0388 void attachStub(Process p, const std::tuple<Ts...>& data, TTBV& ttBV) const {
0389 Variable v = *std::next(stubs_[+p].begin(), it);
0390 formats_[+v][+p]->attach(std::get<it>(data), ttBV);
0391 if constexpr (it + 1 != sizeof...(Ts))
0392 attachStub<it + 1>(p, data, ttBV);
0393 }
0394
0395 template <int it = 0, typename... Ts>
0396 void attachTrack(Process p, const std::tuple<Ts...>& data, TTBV& ttBV) const {
0397 Variable v = *std::next(tracks_[+p].begin(), it);
0398 formats_[+v][+p]->attach(std::get<it>(data), ttBV);
0399 if constexpr (it + 1 != sizeof...(Ts))
0400 attachTrack<it + 1>(p, data, ttBV);
0401 }
0402
0403 const tt::Setup* setup_;
0404
0405 std::vector<DataFormat> dataFormats_;
0406
0407 std::vector<std::vector<DataFormat*>> formats_;
0408
0409 std::vector<int> numUnusedBitsStubs_;
0410
0411 std::vector<int> numUnusedBitsTracks_;
0412
0413 std::vector<int> numChannel_;
0414
0415 std::vector<int> numStreamsStubs_;
0416
0417 std::vector<int> numStreamsTracks_;
0418 };
0419
0420
0421 template <typename... Ts>
0422 class Stub {
0423 public:
0424
0425 Stub(const tt::FrameStub& fs, const DataFormats* df, Process p) : dataFormats_(df), p_(p), frame_(fs) {
0426 dataFormats_->convertStub(p_, frame_.second, data_);
0427 }
0428 template <typename... Others>
0429
0430 Stub(const Stub<Others...>& stub, Ts... data)
0431 : dataFormats_(stub.dataFormats()), p_(stub.p() + 1), frame_(stub.frame()), data_(data...) {
0432 dataFormats_->convertStub(p_, data_, frame_.second);
0433 }
0434
0435 Stub(const TTStubRef& ttStubRef, const DataFormats* df, Process p, Ts... data)
0436 : dataFormats_(df), p_(p), frame_(ttStubRef, tt::Frame()), data_(data...) {
0437 dataFormats_->convertStub(p_, data_, frame_.second);
0438 }
0439 Stub() {}
0440 virtual ~Stub() = default;
0441
0442 explicit operator bool() const { return frame_.first.isNonnull(); }
0443
0444 const DataFormats* dataFormats() const { return dataFormats_; }
0445
0446 Process p() const { return p_; }
0447
0448 const tt::FrameStub& frame() const { return frame_; }
0449
0450 protected:
0451
0452 const DataFormats* dataFormats_;
0453
0454 Process p_;
0455
0456 tt::FrameStub frame_;
0457
0458 std::tuple<Ts...> data_;
0459 };
0460
0461
0462 class StubDTC : public Stub<double, double, double, TTBV, int, int, int, int, int, int> {
0463 public:
0464
0465 StubDTC(const TTStubRef& ttStubRef,
0466 const DataFormats* df,
0467 double r,
0468 double phi,
0469 double z,
0470 const TTBV& layer,
0471 int phiTMin,
0472 int phiTMax,
0473 int zTMin,
0474 int zTMax,
0475 int inv2RMin,
0476 int inv2RMax)
0477 : Stub(ttStubRef, df, Process::dtc, r, phi, z, layer, phiTMin, phiTMax, zTMin, zTMax, inv2RMin, inv2RMax) {}
0478 ~StubDTC() override = default;
0479
0480 double r() const { return std::get<0>(data_); }
0481
0482 double phi() const { return std::get<1>(data_); }
0483
0484 double z() const { return std::get<2>(data_); }
0485
0486 TTBV layer() const { return std::get<3>(data_); }
0487
0488 int phiTMin() const { return std::get<4>(data_); }
0489
0490 int phiTMax() const { return std::get<5>(data_); }
0491
0492 int zTMin() const { return std::get<6>(data_); }
0493
0494 int zTMax() const { return std::get<7>(data_); }
0495
0496 int inv2RMin() const { return std::get<8>(data_); }
0497
0498 int inv2RMax() const { return std::get<9>(data_); }
0499 };
0500
0501
0502 class StubPP : public Stub<double, double, double, TTBV, int, int, int, int, int, int> {
0503 public:
0504
0505 StubPP(const tt::FrameStub& fs, const DataFormats* df) : Stub(fs, df, Process::pp) {}
0506 ~StubPP() override = default;
0507
0508 double r() const { return std::get<0>(data_); }
0509
0510 double phi() const { return std::get<1>(data_); }
0511
0512 double z() const { return std::get<2>(data_); }
0513
0514 const TTBV& layer() const { return std::get<3>(data_); }
0515
0516 int phiTMin() const { return std::get<4>(data_); }
0517
0518 int phiTMax() const { return std::get<5>(data_); }
0519
0520 int zTMin() const { return std::get<6>(data_); }
0521
0522 int zTMax() const { return std::get<7>(data_); }
0523
0524 int inv2RMin() const { return std::get<8>(data_); }
0525
0526 int inv2RMax() const { return std::get<9>(data_); }
0527 };
0528
0529
0530 class StubGP : public Stub<double, double, double, TTBV, int, int> {
0531 public:
0532
0533 StubGP(const tt::FrameStub& fs, const DataFormats* df) : Stub(fs, df, Process::gp) {}
0534
0535 StubGP(const StubPP& stub, double r, double phi, double z, const TTBV& layer, int inv2RMin, int inv2RMax)
0536 : Stub(stub, r, phi, z, layer, inv2RMin, inv2RMax) {}
0537 ~StubGP() override = default;
0538
0539 double r() const { return std::get<0>(data_); }
0540
0541 double phi() const { return std::get<1>(data_); }
0542
0543 double z() const { return std::get<2>(data_); }
0544
0545 const TTBV& layer() const { return std::get<3>(data_); }
0546
0547 int inv2RMin() const { return std::get<4>(data_); }
0548
0549 int inv2RMax() const { return std::get<5>(data_); }
0550 };
0551
0552
0553 class StubHT : public Stub<double, double, double, TTBV, int, int> {
0554 public:
0555
0556 StubHT(const tt::FrameStub& fs, const DataFormats* df) : Stub(fs, df, Process::ht) {}
0557
0558 StubHT(const StubGP& stub, double r, double phi, double z, const TTBV& layer, int phiT, int zT)
0559 : Stub(stub, r, phi, z, layer, phiT, zT) {}
0560 ~StubHT() override = default;
0561
0562 double r() const { return std::get<0>(data_); };
0563
0564 double phi() const { return std::get<1>(data_); };
0565
0566 double z() const { return std::get<2>(data_); };
0567
0568 const TTBV& layer() const { return std::get<3>(data_); }
0569
0570 int phiT() const { return std::get<4>(data_); };
0571
0572 int zT() const { return std::get<5>(data_); };
0573 };
0574
0575
0576 class StubCTB : public Stub<double, double, double, double, double> {
0577 public:
0578
0579 StubCTB(const tt::FrameStub& fs, const DataFormats* df) : Stub(fs, df, Process::ctb) {}
0580
0581 StubCTB(const StubHT& stub, double r, double phi, double z, double dPhi, double dZ)
0582 : Stub(stub, r, phi, z, dPhi, dZ) {}
0583 ~StubCTB() override = default;
0584
0585 double r() const { return std::get<0>(data_); }
0586
0587 double phi() const { return std::get<1>(data_); }
0588
0589 double z() const { return std::get<2>(data_); }
0590
0591 double dPhi() const { return std::get<3>(data_); }
0592
0593 double dZ() const { return std::get<4>(data_); }
0594 };
0595
0596
0597 class StubKF : public Stub<double, double, double, double, double> {
0598 public:
0599
0600 StubKF(const tt::FrameStub& fs, const DataFormats* df) : Stub(fs, df, Process::kf) {}
0601
0602 StubKF(const StubCTB& stub, double r, double phi, double z, double dPhi, double dZ)
0603 : Stub(stub, r, phi, z, dPhi, dZ) {}
0604 ~StubKF() override = default;
0605
0606 double r() const { return std::get<0>(data_); }
0607
0608 double phi() const { return std::get<1>(data_); }
0609
0610 double z() const { return std::get<2>(data_); }
0611
0612 double dPhi() const { return std::get<3>(data_); }
0613
0614 double dZ() const { return std::get<4>(data_); }
0615 };
0616
0617
0618 class StubDR : public Stub<double, double, double, double, double> {
0619 public:
0620
0621 StubDR(const tt::FrameStub& fs, const DataFormats* df) : Stub(fs, df, Process::dr) {}
0622
0623 StubDR(const StubKF& stub, double r, double phi, double z, double dPhi, double dZ)
0624 : Stub(stub, r, phi, z, dPhi, dZ) {}
0625 ~StubDR() override = default;
0626
0627 double r() const { return std::get<0>(data_); }
0628
0629 double phi() const { return std::get<1>(data_); }
0630
0631 double z() const { return std::get<2>(data_); }
0632
0633 double dPhi() const { return std::get<3>(data_); }
0634
0635 double dZ() const { return std::get<4>(data_); }
0636 };
0637
0638
0639 template <typename... Ts>
0640 class Track {
0641 public:
0642
0643 Track(const tt::FrameTrack& ft, const DataFormats* df, Process p) : dataFormats_(df), p_(p), frame_(ft) {
0644 dataFormats_->convertTrack(p_, frame_.second, data_);
0645 }
0646
0647 Track(const TTTrackRef& ttTrackRef, const DataFormats* df, Process p, Ts... data)
0648 : dataFormats_(df), p_(p), frame_(ttTrackRef, tt::Frame()), data_(data...) {
0649 dataFormats_->convertTrack(p_, data_, frame_.second);
0650 }
0651
0652 template <typename... Others>
0653 Track(const Track<Others...>& track, Ts... data)
0654 : dataFormats_(track.dataFormats()), p_(track.p() + 1), frame_(track.frame()), data_(data...) {
0655 dataFormats_->convertTrack(p_, data_, frame_.second);
0656 }
0657 virtual ~Track() = default;
0658
0659 explicit operator bool() const { return frame_.first.isNonnull(); }
0660
0661 const DataFormats* dataFormats() const { return dataFormats_; }
0662
0663 Process p() const { return p_; }
0664
0665 const tt::FrameTrack& frame() const { return frame_; }
0666
0667 protected:
0668
0669 const DataFormats* dataFormats_;
0670
0671 Process p_;
0672
0673 tt::FrameTrack frame_;
0674
0675 std::tuple<Ts...> data_;
0676 };
0677
0678
0679 class TrackCTB : public Track<double, double, double> {
0680 public:
0681
0682 TrackCTB(const tt::FrameTrack& ft, const DataFormats* df) : Track(ft, df, Process::ctb) {}
0683
0684 TrackCTB(const TTTrackRef& tTTrackRef, const DataFormats* df, double inv2R, double phiT, double zT)
0685 : Track(tTTrackRef, df, Process::ctb, inv2R, phiT, zT) {}
0686 ~TrackCTB() override = default;
0687
0688 double inv2R() const { return std::get<0>(data_); }
0689
0690 double phiT() const { return std::get<1>(data_); }
0691
0692 double zT() const { return std::get<2>(data_); }
0693 };
0694
0695
0696 class TrackKF : public Track<double, double, double, double, TTBV> {
0697 public:
0698
0699 TrackKF(const tt::FrameTrack& ft, const DataFormats* df) : Track(ft, df, Process::kf) {}
0700
0701 TrackKF(const TrackCTB& track, double inv2R, double phiT, double cot, double zT, const TTBV& match)
0702 : Track(track, inv2R, phiT, cot, zT, match) {}
0703 ~TrackKF() override = default;
0704
0705 double inv2R() const { return std::get<0>(data_); }
0706
0707 double phiT() const { return std::get<1>(data_); }
0708
0709 double cot() const { return std::get<2>(data_); }
0710
0711 double zT() const { return std::get<3>(data_); }
0712
0713 const TTBV& match() const { return std::get<4>(data_); }
0714 };
0715
0716
0717 class TrackDR : public Track<double, double, double, double> {
0718 public:
0719
0720 TrackDR(const tt::FrameTrack& ft, const DataFormats* df) : Track(ft, df, Process::dr) {}
0721
0722 TrackDR(const TrackKF& track, double inv2R, double phiT, double cot, double zT)
0723 : Track(track, inv2R, phiT, cot, zT) {}
0724 ~TrackDR() override = default;
0725
0726 double inv2R() const { return std::get<0>(data_); }
0727
0728 double phiT() const { return std::get<1>(data_); }
0729
0730 double cot() const { return std::get<2>(data_); }
0731
0732 double zT() const { return std::get<3>(data_); }
0733 };
0734
0735 }
0736
0737 EVENTSETUP_DATA_DEFAULT_RECORD(trackerTFP::DataFormats, trackerTFP::DataFormatsRcd);
0738
0739 #endif