File indexing completed on 2023-10-25 09:39:19
0001 #ifndef DataFormats_L1TCalorimeterPhase2_DigitizedClusterCorrelator_h
0002 #define DataFormats_L1TCalorimeterPhase2_DigitizedClusterCorrelator_h
0003
0004 #include <ap_int.h>
0005 #include <vector>
0006
0007 namespace l1tp2 {
0008
0009 class DigitizedClusterCorrelator {
0010 private:
0011
0012 ap_uint<64> clusterData;
0013 unsigned int idxGCTCard;
0014
0015
0016 static constexpr unsigned int n_towers_eta = 34;
0017 static constexpr unsigned int n_towers_phi = 24;
0018 static constexpr unsigned int n_crystals_in_tower = 5;
0019 static constexpr float LSB_PT = 0.5;
0020 static constexpr unsigned int n_bits_pt = 12;
0021 static constexpr unsigned int n_bits_unused_start = 49;
0022
0023
0024 ap_uint<12> digitizePt(float pt_f) {
0025 float maxPt_f = (std::pow(2, n_bits_pt) - 1) * LSB_PT;
0026
0027 if (pt_f >= maxPt_f) {
0028 return (ap_uint<12>)0xFFF;
0029 }
0030
0031 return (ap_uint<12>)(pt_f / LSB_PT);
0032 }
0033
0034
0035 ap_uint<6> digitizeIEta(unsigned int iEta) {
0036 assert(iEta < n_towers_eta);
0037 return (ap_uint<6>)iEta;
0038 }
0039
0040
0041 ap_uint<5> digitizeIPhi(unsigned int iPhi) {
0042 assert(iPhi < n_towers_phi);
0043 return (ap_uint<5>)iPhi;
0044 }
0045
0046 ap_uint<3> digitizeIEtaCr(unsigned int iEtaCr) {
0047 assert(iEtaCr < n_crystals_in_tower);
0048 return (ap_uint<3>)iEtaCr;
0049 }
0050
0051 ap_uint<3> digitizeIPhiCr(unsigned int iPhiCr) {
0052 assert(iPhiCr < n_crystals_in_tower);
0053 return (ap_uint<3>)iPhiCr;
0054 }
0055
0056
0057 ap_uint<4> digitizeHoE(unsigned int hoe) { return (ap_uint<4>)hoe; }
0058
0059
0060 ap_uint<3> digitizeIso(bool iso) { return (ap_uint<3>)iso; }
0061
0062
0063 ap_uint<6> digitizeFb(unsigned int fb) { return (ap_uint<6>)fb; }
0064
0065
0066 ap_uint<5> digitizeTiming(unsigned int timing) { return (ap_uint<5>)timing; }
0067
0068
0069 ap_uint<1> digitizeShape(bool is_ss) { return (ap_uint<1>)is_ss; }
0070
0071
0072 ap_uint<1> digitizeBrems(bool brems_applied) { return (ap_uint<1>)brems_applied; }
0073
0074 public:
0075 DigitizedClusterCorrelator() { clusterData = 0x0; }
0076
0077 DigitizedClusterCorrelator(ap_uint<64> data) { clusterData = data; }
0078
0079
0080 DigitizedClusterCorrelator(ap_uint<12> pt,
0081 ap_uint<6> eta,
0082 ap_uint<5> phi,
0083 ap_uint<3> etaCr,
0084 ap_uint<3> phiCr,
0085 ap_uint<4> hoe,
0086 ap_uint<3> iso,
0087 ap_uint<6> fb,
0088 ap_uint<5> timing,
0089 ap_uint<1> shape,
0090 ap_uint<1> brems,
0091 int iGCTCard,
0092 bool fullydigitizedInputs) {
0093 (void)fullydigitizedInputs;
0094
0095 clusterData = ((ap_uint<64>)pt) | (((ap_uint<64>)eta) << 12) | (((ap_uint<64>)phi) << 18) |
0096 (((ap_uint<64>)etaCr) << 23) | (((ap_uint<64>)phiCr) << 26) | (((ap_uint<64>)hoe) << 29) |
0097 (((ap_uint<64>)iso << 33)) | (((ap_uint<64>)fb << 36)) | (((ap_uint<64>)timing << 42)) |
0098 (((ap_uint<64>)shape << 47)) | (((ap_uint<64>)brems << 48));
0099 idxGCTCard = iGCTCard;
0100 }
0101
0102
0103 DigitizedClusterCorrelator(float pt_f,
0104 unsigned int iEta,
0105 unsigned int iPhi,
0106 unsigned int iEtaCr,
0107 unsigned int iPhiCr,
0108 unsigned int hoe,
0109 bool iso,
0110 unsigned int fb,
0111 unsigned int timing,
0112 bool shape,
0113 unsigned int brems,
0114 int iGCTCard) {
0115 clusterData = (((ap_uint<64>)digitizePt(pt_f)) | ((ap_uint<64>)digitizeIEta(iEta) << 12) |
0116 ((ap_uint<64>)digitizeIPhi(iPhi) << 18) | ((ap_uint<64>)digitizeIEtaCr(iEtaCr) << 23) |
0117 ((ap_uint<64>)digitizeIPhiCr(iPhiCr) << 26) | ((ap_uint<64>)digitizeHoE(hoe) << 29) |
0118 ((ap_uint<64>)digitizeIso(iso) << 33) | ((ap_uint<64>)digitizeFb(fb) << 36) |
0119 ((ap_uint<64>)digitizeTiming(timing) << 42) | ((ap_uint<64>)digitizeShape(shape) << 47) |
0120 ((ap_uint<64>)digitizeBrems(brems) << 48));
0121 idxGCTCard = iGCTCard;
0122 }
0123
0124 ap_uint<64> data() const { return clusterData; }
0125
0126
0127 float ptLSB() const { return LSB_PT; }
0128 ap_uint<12> pt() const { return (clusterData & 0xFFF); }
0129 ap_uint<6> eta() const { return ((clusterData >> 12) & 0x3F); }
0130 ap_uint<5> phi() const { return ((clusterData >> 18) & 0x1F); }
0131 ap_uint<3> etaCr() const { return ((clusterData >> 23) & 0x7); }
0132 ap_uint<3> phiCr() const { return ((clusterData >> 26) & 0x7); }
0133 ap_uint<4> hoe() const { return ((clusterData >> 29) & 0xF); }
0134 ap_uint<3> iso() const { return ((clusterData >> 33) & 0x7); }
0135 ap_uint<6> fb() const { return ((clusterData >> 36) & 0x3F); }
0136 ap_uint<5> timing() const { return ((clusterData >> 42) & 0x1F); }
0137 ap_uint<1> shape() const { return ((clusterData >> 47) & 0x1); }
0138 ap_uint<1> brems() const { return ((clusterData >> 48) & 0x1); }
0139 unsigned int cardNumber() const { return idxGCTCard; }
0140
0141 const int unusedBitsStart() const { return 49; }
0142
0143
0144 bool passNullBitsCheck(void) const { return ((data() >> unusedBitsStart()) == 0x0); }
0145 };
0146
0147
0148 typedef std::vector<l1tp2::DigitizedClusterCorrelator> DigitizedClusterCorrelatorCollection;
0149
0150 }
0151
0152 #endif