Back to home page

Project CMSSW displayed by LXR

 
 

    


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     // Data
0012     ap_uint<64> clusterData;
0013     unsigned int idxGCTCard;  // 0, 1, or 2
0014 
0015     // Constants
0016     static constexpr unsigned int n_towers_eta = 34;  // in GCT card unique region
0017     static constexpr unsigned int n_towers_phi = 24;  // in GCT card unique region
0018     static constexpr unsigned int n_crystals_in_tower = 5;
0019     static constexpr float LSB_PT = 0.5;                     // 0.5 GeV
0020     static constexpr unsigned int n_bits_pt = 12;            // 12 bits allocated for pt
0021     static constexpr unsigned int n_bits_unused_start = 49;  // unused bits start at bit 49
0022 
0023     // Private member functions to perform digitization
0024     ap_uint<12> digitizePt(float pt_f) {
0025       float maxPt_f = (std::pow(2, n_bits_pt) - 1) * LSB_PT;
0026       // If pT exceeds the maximum (extremely unlikely), saturate the value
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     // This is tower iPhi in the unique region of the GCT card, so this only goes from 0-23
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     // To-do: HoE is not defined for clusters
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     // To-do: fb: no information yet
0063     ap_uint<6> digitizeFb(unsigned int fb) { return (ap_uint<6>)fb; }
0064 
0065     // To-do: timing: no information yet
0066     ap_uint<5> digitizeTiming(unsigned int timing) { return (ap_uint<5>)timing; }
0067 
0068     // Shape: shower shape working point
0069     ap_uint<1> digitizeShape(bool is_ss) { return (ap_uint<1>)is_ss; }
0070 
0071     // TO-DO: Brems: was brems applied (NOT STORED YET IN GCT)
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     // Constructor from digitized inputs
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     // Constructor from float inputs
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     // Other getters
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); }   // (six 1's) 0b111111 = 0x3F
0130     ap_uint<5> phi() const { return ((clusterData >> 18) & 0x1F); }   // (five 1's) 0b11111 = 0x1F
0131     ap_uint<3> etaCr() const { return ((clusterData >> 23) & 0x7); }  // (three 1's) 0b111 = 0x7
0132     ap_uint<3> phiCr() const { return ((clusterData >> 26) & 0x7); }
0133     ap_uint<4> hoe() const { return ((clusterData >> 29) & 0xF); }  // (four 1's) 0b1111 = 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; }  // which GCT card (0, 1, or 2)
0140 
0141     const int unusedBitsStart() const { return 49; }  // unused bits start at bit 49
0142 
0143     // Other checks
0144     bool passNullBitsCheck(void) const { return ((data() >> unusedBitsStart()) == 0x0); }
0145   };
0146 
0147   // Collection typedef
0148   typedef std::vector<l1tp2::DigitizedClusterCorrelator> DigitizedClusterCorrelatorCollection;
0149 
0150 }  // namespace l1tp2
0151 
0152 #endif