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
0012 ap_uint<16> towerData;
0013 unsigned int idxCard;
0014 unsigned int idxFiber;
0015 unsigned int idxTower;
0016
0017
0018 static constexpr float LSB_ET = 0.5;
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
0025 ap_uint<10> digitizeEt(float et_f) {
0026 float maxEt_f = (std::pow(2, n_bits_pt) - 1) * LSB_ET;
0027
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
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
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
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
0077 float etLSB() const { return LSB_ET; }
0078 ap_uint<10> et() const { return (towerData & 0x3FF); }
0079 ap_uint<4> hoe() const { return ((towerData >> 10) & 0xF); }
0080 ap_uint<2> fb() const { return ((towerData >> 14) & 0x3); }
0081 float etFloat() const { return et() * etLSB(); }
0082 unsigned int cardNumber() const { return idxCard; }
0083 unsigned int fiberNumber() const { return idxFiber; }
0084 unsigned int towerNumber() const { return idxTower; }
0085
0086
0087 bool hasValidIndices(void) const {
0088 return (idxTower < n_towers_in_fiber) && (idxFiber < n_fibers_in_card) && (idxCard < n_cards);
0089 }
0090 };
0091
0092
0093 typedef std::vector<l1tp2::DigitizedTowerCorrelator> DigitizedTowerCorrelatorCollection;
0094
0095 }
0096
0097 #endif