Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-10-25 09:39:19

0001 #ifndef DataFormats_L1TCalorimeterPhase2_DigitizedTowerCorrelator_h
0002 #define DataFormats_L1TCalorimeterPhase2_DigitizedTowerCorrelator_h
0003 
0004 #include <ap_int.h>
0005 #include <vector>
0006 
0007 namespace l1tp2 {
0008 
0009   class DigitizedTowerCorrelator {
0010   private:
0011     // Data
0012     ap_uint<16> towerData;
0013     unsigned int idxCard;   // 0, 1, or 2 (there are three GCT cards)
0014     unsigned int idxFiber;  // 0 to 47 (there are 48 fibers in one GCT card)
0015     unsigned int idxTower;  // 0 to 16 (there are 17 towers in one fiber)
0016 
0017     // Constants
0018     static constexpr float LSB_ET = 0.5;  // 0.5 GeV, so max value is (2^10 - 1) * 0.5 = 511.5 GeV
0019     static constexpr unsigned int n_bits_pt = 10;
0020     static constexpr unsigned int n_towers_in_fiber = 17;
0021     static constexpr unsigned int n_fibers_in_card = 48;
0022     static constexpr unsigned int n_cards = 3;
0023 
0024     // Private member functions to perform digitization
0025     ap_uint<10> digitizeEt(float et_f) {
0026       float maxEt_f = (std::pow(2, n_bits_pt) - 1) * LSB_ET;
0027       // If pT exceeds the maximum, saturate the value
0028       if (et_f >= maxEt_f) {
0029         return (ap_uint<10>)0x3FF;
0030       }
0031       return (ap_uint<10>)(et_f / LSB_ET);
0032     }
0033 
0034     ap_uint<4> digitizeHoE(ap_uint<4> hoe) { return (ap_uint<4>)hoe; }
0035 
0036     // To-do: FB not implemented yet
0037     ap_uint<2> digitizeFB(ap_uint<2> fb) { return (ap_uint<2>)fb; }
0038 
0039   public:
0040     DigitizedTowerCorrelator() { towerData = 0x0; }
0041 
0042     DigitizedTowerCorrelator(ap_uint<16> data) { towerData = data; }
0043 
0044     // Constructor from digitized inputs
0045     DigitizedTowerCorrelator(ap_uint<10> et,
0046                              ap_uint<4> hoe,
0047                              ap_uint<2> fb,
0048                              unsigned int indexCard,
0049                              unsigned int indexFiber,
0050                              unsigned int indexTower,
0051                              bool fullyDigitizedInputs) {
0052       (void)fullyDigitizedInputs;
0053       towerData = ((ap_uint<16>)et) | (((ap_uint<16>)hoe) << 10) | (((ap_uint<16>)fb) << 14);
0054       idxCard = indexCard;
0055       idxFiber = indexFiber;
0056       idxTower = indexTower;
0057       assert(hasValidIndices());
0058     }
0059 
0060     // Constructor from float inputs
0061     DigitizedTowerCorrelator(float et_f,
0062                              ap_uint<4> hoe,
0063                              ap_uint<2> fb,
0064                              unsigned int indexCard,
0065                              unsigned int indexFiber,
0066                              unsigned int indexTower) {
0067       towerData = ((ap_uint<16>)digitizeEt(et_f)) | (((ap_uint<16>)hoe) << 10) | (((ap_uint<16>)fb) << 14);
0068       idxCard = indexCard;
0069       idxFiber = indexFiber;
0070       idxTower = indexTower;
0071       assert(hasValidIndices());
0072     }
0073 
0074     ap_uint<16> data() const { return towerData; }
0075 
0076     // Other getters
0077     float etLSB() const { return LSB_ET; }
0078     ap_uint<10> et() const { return (towerData & 0x3FF); }        // ten 1's = 0x3FF
0079     ap_uint<4> hoe() const { return ((towerData >> 10) & 0xF); }  // four 1's= 0xF
0080     ap_uint<2> fb() const { return ((towerData >> 14) & 0x3); }   // two 1's = 0x3
0081     float etFloat() const { return et() * etLSB(); }
0082     unsigned int cardNumber() const { return idxCard; }    // GCT card number
0083     unsigned int fiberNumber() const { return idxFiber; }  // fiber number in card (hardware convention)
0084     unsigned int towerNumber() const { return idxTower; }  // tower number in fiber (hardware convention)
0085 
0086     // Other checks
0087     bool hasValidIndices(void) const {
0088       return (idxTower < n_towers_in_fiber) && (idxFiber < n_fibers_in_card) && (idxCard < n_cards);
0089     }
0090   };
0091 
0092   // Collection typedef
0093   typedef std::vector<l1tp2::DigitizedTowerCorrelator> DigitizedTowerCorrelatorCollection;
0094 
0095 }  // namespace l1tp2
0096 
0097 #endif