File indexing completed on 2025-03-05 03:16:38
0001 #ifndef L1Trigger_Phase2L1GT_L1GTEvaluationInterface_h
0002 #define L1Trigger_Phase2L1GT_L1GTEvaluationInterface_h
0003
0004 #include "DataFormats/L1Trigger/interface/P2GTCandidate.h"
0005
0006 #include <ap_int.h>
0007
0008 #include <array>
0009 #include <cstddef>
0010 #include <cstdint>
0011
0012
0013
0014
0015 namespace l1t {
0016
0017 template <typename A, typename... Args>
0018 A l1t_pack_int(const Args&... args) {
0019 A result = 0;
0020 std::size_t shift = 0;
0021 (
0022 [&result, &shift](const auto& arg) {
0023 result(shift + arg.width - 1, shift) = arg;
0024 shift += arg.width;
0025 }(args),
0026 ...);
0027
0028 return result;
0029 }
0030
0031 struct L1TGT_BaseInterface {
0032 virtual std::size_t packed_width() const = 0;
0033 virtual P2GTCandidate to_GTObject() const = 0;
0034 virtual ~L1TGT_BaseInterface() {}
0035 };
0036
0037 template <std::size_t N>
0038 struct L1TGT_Interface : public L1TGT_BaseInterface {
0039 virtual ap_uint<N> pack() const = 0;
0040
0041 static constexpr std::size_t WIDTH = N;
0042
0043 std::size_t packed_width() const override { return WIDTH; }
0044 };
0045
0046 template <std::size_t N>
0047 struct L1TGT_Common3Vector : public L1TGT_Interface<N> {
0048 ap_uint<1> valid;
0049 ap_uint<16> pT;
0050 ap_int<13> phi;
0051 ap_int<14> eta;
0052
0053 L1TGT_Common3Vector(int valid = 0, int pT = 0, int phi = 0, int eta = 0)
0054 : valid(valid), pT(pT), phi(phi), eta(eta) {};
0055
0056 virtual ap_uint<44> pack_common() const { return l1t_pack_int<ap_uint<44>>(valid, pT, phi, eta); }
0057
0058 ap_uint<N> pack() const override { return pack_common(); }
0059
0060 P2GTCandidate to_GTObject() const override {
0061 P2GTCandidate gt_object;
0062 gt_object.setHwPT(pT);
0063 gt_object.setHwPhi(phi);
0064 gt_object.setHwEta(eta);
0065
0066 return gt_object;
0067 }
0068 };
0069
0070 struct L1TGT_CommonSum : public L1TGT_Interface<64> {
0071 ap_uint<1> valid;
0072 ap_uint<16> pT;
0073 ap_int<13> phi;
0074 ap_uint<16> scalarSumPT;
0075
0076 L1TGT_CommonSum(int valid = 0, int pT = 0, int phi = 0, int scalarSumPT = 0)
0077 : valid(valid), pT(pT), phi{phi}, scalarSumPT(scalarSumPT) {}
0078
0079 ap_uint<46> pack_common() const { return l1t_pack_int<ap_uint<46>>(valid, pT, phi, scalarSumPT); }
0080
0081 ap_uint<64> pack() const override { return pack_common(); }
0082
0083 P2GTCandidate to_GTObject() const override {
0084 P2GTCandidate gt_object;
0085 gt_object.setHwPT(pT);
0086 gt_object.setHwPhi(phi);
0087 gt_object.setHwScalarSumPT(scalarSumPT);
0088
0089 return gt_object;
0090 }
0091 };
0092
0093
0094
0095 struct L1TGT_GCT_EgammaNonIsolated6p6 : public L1TGT_Common3Vector<64> {
0096 using L1TGT_Common3Vector::L1TGT_Common3Vector;
0097 };
0098
0099 struct L1TGT_GCT_EgammaIsolated6p6 : public L1TGT_Common3Vector<64> {
0100 using L1TGT_Common3Vector::L1TGT_Common3Vector;
0101 };
0102
0103 struct L1TGT_GCT_jet6p6 : public L1TGT_Common3Vector<64> {
0104 using L1TGT_Common3Vector::L1TGT_Common3Vector;
0105 };
0106
0107 struct L1TGT_GCT_tau6p6 : public L1TGT_Common3Vector<64> {
0108 ap_uint<10> seed_pT;
0109
0110 L1TGT_GCT_tau6p6(int valid = 0, int pT = 0, int phi = 0, int eta = 0, int seed_pT = 0)
0111 : L1TGT_Common3Vector(valid, pT, phi, eta), seed_pT(seed_pT) {}
0112
0113 ap_uint<WIDTH> pack() const override {
0114 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), seed_pT);
0115 }
0116
0117 P2GTCandidate to_GTObject() const override {
0118 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0119 gt_object.setHwSeed_pT(seed_pT);
0120
0121 return gt_object;
0122 }
0123 };
0124
0125 struct L1TGT_GCT_Sum2 : public L1TGT_CommonSum {
0126 using L1TGT_CommonSum::L1TGT_CommonSum;
0127 };
0128
0129
0130
0131 struct L1TGT_GMT_PromptDisplacedMuon : public L1TGT_Common3Vector<64> {
0132 ap_int<5> z0;
0133 ap_int<7> d0;
0134 ap_uint<1> charge;
0135 ap_uint<4> qualityScore;
0136
0137 L1TGT_GMT_PromptDisplacedMuon(int valid = 0,
0138 int pT = 0,
0139 int phi = 0,
0140 int eta = 0,
0141 int z0 = 0,
0142 int d0 = 0,
0143 int charge = 0,
0144 int qualityScore = 0)
0145 : L1TGT_Common3Vector(valid, pT, phi, eta), z0(z0), d0(d0), charge(charge), qualityScore(qualityScore) {}
0146
0147 ap_uint<WIDTH> pack() const override {
0148 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), z0, d0, charge, qualityScore);
0149 }
0150
0151 P2GTCandidate to_GTObject() const override {
0152 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0153 gt_object.setHwZ0(static_cast<int>(z0) << 12);
0154 gt_object.setHwD0(static_cast<int>(d0) << 5);
0155 gt_object.setHwCharge(charge);
0156 gt_object.setHwQualityScore(qualityScore);
0157
0158 return gt_object;
0159 }
0160 };
0161
0162 struct L1TGT_GMT_TrackMatchedmuon : public L1TGT_Common3Vector<96> {
0163 ap_int<10> z0;
0164 ap_int<10> d0;
0165 ap_uint<1> charge;
0166 ap_uint<6> qualityFlags;
0167 ap_uint<6> isolationPT;
0168 ap_uint<4> beta;
0169
0170 L1TGT_GMT_TrackMatchedmuon(int valid = 0,
0171 int pT = 0,
0172 int phi = 0,
0173 int eta = 0,
0174 int z0 = 0,
0175 int d0 = 0,
0176 int charge = 0,
0177 int qualityFlags = 0,
0178 int isolationPT = 0,
0179 int beta = 0)
0180 : L1TGT_Common3Vector(valid, pT, phi, eta),
0181 z0(z0),
0182 d0(d0),
0183 charge(charge),
0184 qualityFlags(qualityFlags),
0185 isolationPT(isolationPT),
0186 beta(beta) {}
0187
0188 ap_uint<WIDTH> pack() const override {
0189 return l1t_pack_int<ap_uint<WIDTH>>(
0190 L1TGT_Common3Vector::pack_common(), z0, d0, charge, qualityFlags, isolationPT, beta);
0191 }
0192
0193 P2GTCandidate to_GTObject() const override {
0194 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0195 gt_object.setHwZ0(static_cast<int>(z0) << 7);
0196 gt_object.setHwD0(static_cast<int>(d0) << 2);
0197 gt_object.setHwCharge(charge);
0198 gt_object.setHwQualityFlags(static_cast<int>(qualityFlags));
0199 gt_object.setHwIsolationPT(static_cast<int>(isolationPT));
0200 gt_object.setHwBeta(beta);
0201
0202 return gt_object;
0203 }
0204 };
0205
0206 struct L1TGT_GMT_TopoObject : public L1TGT_Interface<64> {
0207 ap_uint<1> valid;
0208 ap_uint<8> pT;
0209 ap_int<8> eta;
0210 ap_int<8> phi;
0211 ap_uint<8> mass;
0212 ap_uint<6> qualityFlags;
0213
0214
0215
0216 L1TGT_GMT_TopoObject(int valid = 0, int pT = 0, int phi = 0, int eta = 0, int mass = 0, int qualityFlags = 0)
0217 : valid(valid), pT(pT), eta(eta), phi(phi), mass(mass), qualityFlags(qualityFlags) {}
0218
0219 ap_uint<WIDTH> pack() const override {
0220 return l1t_pack_int<ap_uint<WIDTH>>(valid, pT, eta, phi, mass, qualityFlags);
0221 }
0222
0223 P2GTCandidate to_GTObject() const override {
0224 P2GTCandidate gt_object;
0225 gt_object.setHwPT(static_cast<int>(pT) * 5);
0226 gt_object.setHwPhi(static_cast<int>(phi) << 5);
0227 gt_object.setHwEta(static_cast<int>(eta) << 5);
0228 gt_object.setHwMass(mass);
0229 gt_object.setHwQualityFlags(qualityFlags);
0230
0231 return gt_object;
0232 }
0233 };
0234
0235
0236
0237 struct L1TGT_GTT_PromptJet : public L1TGT_Common3Vector<128> {
0238 ap_int<10> z0;
0239 ap_uint<5> number_of_tracks;
0240 ap_uint<4> number_of_displaced_tracks;
0241
0242 L1TGT_GTT_PromptJet(int valid = 0,
0243 int pT = 0,
0244 int phi = 0,
0245 int eta = 0,
0246 int z0 = 0,
0247 int number_of_tracks = 0,
0248 int number_of_displaced_tracks = 0)
0249 : L1TGT_Common3Vector(valid, pT, phi, eta),
0250 z0(z0),
0251 number_of_tracks(number_of_tracks),
0252 number_of_displaced_tracks(number_of_displaced_tracks) {}
0253
0254 ap_uint<WIDTH> pack() const override {
0255 return l1t_pack_int<ap_uint<WIDTH>>(
0256 L1TGT_Common3Vector::pack_common(), z0, number_of_tracks, number_of_displaced_tracks);
0257 }
0258
0259 P2GTCandidate to_GTObject() const override {
0260 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0261 gt_object.setHwZ0(static_cast<int>(z0) << 7);
0262 gt_object.setHwNumber_of_tracks(number_of_tracks);
0263 gt_object.setHwNumber_of_displaced_tracks(number_of_displaced_tracks);
0264
0265 return gt_object;
0266 }
0267 };
0268
0269 struct L1TGT_GTT_DisplacedJet : public L1TGT_Common3Vector<128> {
0270 ap_int<10> z0;
0271 ap_uint<5> number_of_tracks;
0272 ap_uint<4> number_of_displaced_tracks;
0273
0274 L1TGT_GTT_DisplacedJet(int valid = 0,
0275 int pT = 0,
0276 int phi = 0,
0277 int eta = 0,
0278 int z0 = 0,
0279 int number_of_tracks = 0,
0280 int number_of_displaced_tracks = 0)
0281 : L1TGT_Common3Vector(valid, pT, phi, eta),
0282 z0(z0),
0283 number_of_tracks(number_of_tracks),
0284 number_of_displaced_tracks(number_of_displaced_tracks) {}
0285
0286 ap_uint<WIDTH> pack() const override {
0287 return l1t_pack_int<ap_uint<WIDTH>>(
0288 L1TGT_Common3Vector::pack_common(), z0, number_of_tracks, number_of_displaced_tracks);
0289 }
0290
0291 P2GTCandidate to_GTObject() const override {
0292 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0293 gt_object.setHwZ0(static_cast<int>(z0) << 7);
0294 gt_object.setHwNumber_of_tracks(number_of_tracks);
0295 gt_object.setHwNumber_of_displaced_tracks(number_of_displaced_tracks);
0296
0297 return gt_object;
0298 }
0299 };
0300
0301 struct L1TGT_GTT_Sum : public L1TGT_CommonSum {
0302 using L1TGT_CommonSum::L1TGT_CommonSum;
0303 };
0304
0305 struct L1TGT_GTT_HadronicTau : public L1TGT_Common3Vector<96> {
0306 ap_uint<10> seed_pT;
0307 ap_int<10> seed_z0;
0308 ap_uint<1> charge;
0309 ap_uint<2> type;
0310
0311 L1TGT_GTT_HadronicTau(int valid = 0,
0312 int pT = 0,
0313 int phi = 0,
0314 int eta = 0,
0315 int seed_pT = 0,
0316 int seed_z0 = 0,
0317 int charge = 0,
0318 int type = 0)
0319 : L1TGT_Common3Vector(valid, pT, phi, eta), seed_pT(seed_pT), seed_z0(seed_z0), charge(charge), type(type) {}
0320
0321 ap_uint<WIDTH> pack() const override {
0322 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), seed_pT, seed_z0, charge, type);
0323 }
0324
0325 P2GTCandidate to_GTObject() const override {
0326 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0327 gt_object.setHwSeed_pT(seed_pT);
0328 gt_object.setHwSeed_z0(seed_z0);
0329 gt_object.setHwCharge(charge);
0330 gt_object.setHwType(type);
0331
0332 return gt_object;
0333 }
0334 };
0335
0336 struct L1TGT_GTT_LightMeson : public L1TGT_Common3Vector<96> {
0337 ap_int<10> z0;
0338
0339
0340
0341
0342 L1TGT_GTT_LightMeson(int valid = 0, int pT = 0, int phi = 0, int eta = 0, int z0 = 0)
0343 : L1TGT_Common3Vector(valid, pT, phi, eta), z0(z0) {}
0344
0345 ap_uint<WIDTH> pack() const override {
0346 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), z0);
0347 }
0348
0349 P2GTCandidate to_GTObject() const override {
0350 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0351 gt_object.setHwZ0(static_cast<int>(z0) << 7);
0352
0353 return gt_object;
0354 }
0355 };
0356
0357 struct L1TGT_GTT_Track : public L1TGT_Interface<96> {
0358
0359
0360 L1TGT_GTT_Track() {};
0361
0362 ap_uint<WIDTH> pack() const override { return ap_uint<WIDTH>(0); }
0363
0364 P2GTCandidate to_GTObject() const override { return P2GTCandidate(); }
0365 };
0366
0367 struct L1TGT_GTT_PrimaryVert : public L1TGT_Interface<64> {
0368 ap_uint<1> valid;
0369 ap_int<15> z0;
0370 ap_uint<8> number_of_tracks_in_pv;
0371 ap_uint<12> sum_pT_pv;
0372 ap_uint<3> qualityScore;
0373 ap_uint<10> number_of_tracks_not_in_pv;
0374
0375
0376 L1TGT_GTT_PrimaryVert(int valid = 0,
0377 int z0 = 0,
0378 int number_of_tracks_in_pv = 0,
0379 int sum_pT_pv = 0,
0380 int qualityScore = 0,
0381 int number_of_tracks_not_in_pv = 0)
0382 : valid(valid),
0383 z0(z0),
0384 number_of_tracks_in_pv(number_of_tracks_in_pv),
0385 sum_pT_pv(sum_pT_pv),
0386 qualityScore(qualityScore),
0387 number_of_tracks_not_in_pv(number_of_tracks_not_in_pv) {}
0388
0389 ap_uint<WIDTH> pack() const override {
0390 return l1t_pack_int<ap_uint<WIDTH>>(
0391 valid, z0, number_of_tracks_in_pv, sum_pT_pv, qualityScore, number_of_tracks_not_in_pv);
0392 }
0393
0394 P2GTCandidate to_GTObject() const override {
0395 P2GTCandidate gt_object;
0396 gt_object.setHwZ0(static_cast<int>(z0) * 5);
0397 gt_object.setHwNumber_of_tracks_in_pv(number_of_tracks_in_pv);
0398 gt_object.setHwSum_pT_pv(sum_pT_pv);
0399 gt_object.setHwQualityScore(qualityScore);
0400 gt_object.setHwNumber_of_tracks_not_in_pv(number_of_tracks_not_in_pv);
0401
0402 return gt_object;
0403 }
0404 };
0405
0406
0407
0408 struct L1TGT_CL2_Jet : public L1TGT_Common3Vector<128> {
0409 ap_int<10> z0;
0410
0411 L1TGT_CL2_Jet(int valid = 0, int pT = 0, int phi = 0, int eta = 0, int z0 = 0)
0412 : L1TGT_Common3Vector(valid, pT, phi, eta), z0(z0) {}
0413
0414 ap_uint<WIDTH> pack() const override {
0415 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), z0);
0416 }
0417
0418 P2GTCandidate to_GTObject() const override {
0419 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0420 gt_object.setHwZ0(static_cast<int>(z0) << 7);
0421
0422 return gt_object;
0423 }
0424 };
0425
0426 struct L1TGT_CL2_Sum : public L1TGT_CommonSum {
0427 using L1TGT_CommonSum::L1TGT_CommonSum;
0428 };
0429
0430 struct L1TGT_CL2_Tau : public L1TGT_Common3Vector<96> {
0431 ap_uint<10> seed_pT;
0432 ap_int<10> seed_z0;
0433 ap_uint<1> charge;
0434 ap_uint<2> type;
0435
0436
0437
0438
0439 L1TGT_CL2_Tau(int valid = 0,
0440 int pT = 0,
0441 int phi = 0,
0442 int eta = 0,
0443 int seed_pT = 0,
0444 int seed_z0 = 0,
0445 int charge = 0,
0446 int type = 0)
0447 : L1TGT_Common3Vector(valid, pT, phi, eta), seed_pT(seed_pT), seed_z0(seed_z0), charge(charge), type(type) {}
0448
0449 ap_uint<WIDTH> pack() const override {
0450 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), seed_pT, seed_z0, charge, type);
0451 }
0452
0453 P2GTCandidate to_GTObject() const override {
0454 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0455 gt_object.setHwSeed_pT(seed_pT);
0456 gt_object.setHwSeed_z0(seed_z0);
0457 gt_object.setHwCharge(charge);
0458 gt_object.setHwType(type);
0459
0460 return gt_object;
0461 }
0462 };
0463
0464 struct L1TGT_CL2_Electron : public L1TGT_Common3Vector<96> {
0465 ap_uint<4> qualityFlags;
0466 ap_uint<11> isolationPT;
0467 ap_uint<1> charge;
0468 ap_int<10> z0;
0469
0470 L1TGT_CL2_Electron(int valid = 0,
0471 int pT = 0,
0472 int phi = 0,
0473 int eta = 0,
0474 int qualityFlags = 0,
0475 int isolationPT = 0,
0476 int charge = 0,
0477 int z0 = 0)
0478 : L1TGT_Common3Vector(valid, pT, phi, eta),
0479 qualityFlags(qualityFlags),
0480 isolationPT(isolationPT),
0481 charge(charge),
0482 z0(z0) {}
0483
0484 ap_uint<WIDTH> pack() const override {
0485 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), qualityFlags, isolationPT, charge, z0);
0486 }
0487
0488 P2GTCandidate to_GTObject() const override {
0489 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0490 gt_object.setHwQualityFlags(qualityFlags);
0491 gt_object.setHwIsolationPT(isolationPT);
0492 gt_object.setHwCharge(charge);
0493 gt_object.setHwZ0(static_cast<int>(z0) << 7);
0494
0495 return gt_object;
0496 }
0497 };
0498
0499 struct L1TGT_CL2_Photon : public L1TGT_Common3Vector<96> {
0500 ap_uint<4> qualityFlags;
0501 ap_uint<11> isolationPT;
0502
0503 L1TGT_CL2_Photon(int valid = 0, int pT = 0, int phi = 0, int eta = 0, int qualityFlags = 0, int isolationPT = 0)
0504 : L1TGT_Common3Vector(valid, pT, phi, eta), qualityFlags(qualityFlags), isolationPT(isolationPT) {}
0505
0506 ap_uint<WIDTH> pack() const override {
0507 return l1t_pack_int<ap_uint<WIDTH>>(L1TGT_Common3Vector::pack_common(), qualityFlags, isolationPT);
0508 }
0509
0510 P2GTCandidate to_GTObject() const override {
0511 P2GTCandidate gt_object(L1TGT_Common3Vector::to_GTObject());
0512 gt_object.setHwQualityFlags(qualityFlags);
0513 gt_object.setHwIsolationPT(isolationPT);
0514
0515 return gt_object;
0516 }
0517 };
0518 }
0519
0520 #endif