Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:17:30

0001 #ifndef TOWERINFOV4_H
0002 #define TOWERINFOV4_H
0003 
0004 #include "TowerInfov1.h"
0005 
0006 #include <cmath>
0007 #include <limits>
0008 
0009 class TowerInfov4 : public TowerInfo
0010 {
0011  public:
0012   TowerInfov4() {}
0013 
0014   ~TowerInfov4() override {}
0015 
0016   void Reset() override;
0017   void Clear(Option_t* = "") override;
0018 
0019   void set_energy(float _energy) override { energy = _energy; }
0020   float get_energy() override { return energy; }
0021 
0022   void set_time(short t) override { time = (t * 1000); }
0023   short get_time() override { return ((float) time) / 1000; }
0024 
0025   void set_time_float(float t) override { time = t * 1000; }
0026   float get_time_float() override { return time / 1000.; }
0027 
0028   void set_chi2(float _chi2) override
0029   {
0030     float lnChi2;
0031     
0032     if (std::isnan(_chi2))
0033     {
0034       lnChi2 = 0;
0035     }
0036     else if (_chi2 <= 0)
0037     {
0038       lnChi2 = 1;
0039     }
0040     else
0041     {
0042       lnChi2 = std::log(_chi2 + 1) / std::log(1.08);
0043     }
0044     if (lnChi2 > 255.0)
0045     {
0046       lnChi2 = 255;
0047     }
0048     chi2 = static_cast<uint8_t>(std::round(lnChi2));
0049   }
0050   float get_chi2() override {
0051     return (chi2 == 0)
0052         ? std::numeric_limits<float>::quiet_NaN() 
0053         : (pow(1.08, static_cast<float>(chi2)) - 1.0);
0054   }
0055 
0056   void set_isHot(bool isHot) override { set_status_bit(0, isHot); }
0057   bool get_isHot() const override { return get_status_bit(0); }
0058 
0059   void set_isBadTime(bool isBadTime) override { set_status_bit(1, isBadTime); }
0060   bool get_isBadTime() const override { return get_status_bit(1); }
0061 
0062   void set_isBadChi2(bool isBadChi2) override { set_status_bit(2, isBadChi2); }
0063   bool get_isBadChi2() const override { return get_status_bit(2); }
0064 
0065   void set_isNotInstr(bool isNotInstr) override { set_status_bit(3, isNotInstr); }
0066   bool get_isNotInstr() const override { return get_status_bit(3); }
0067 
0068   void set_isNoCalib(bool isNoCalib) override { set_status_bit(4, isNoCalib); }
0069   bool get_isNoCalib() const override { return get_status_bit(4); }
0070 
0071   void set_isZS(bool isZS) override { set_status_bit(5, isZS); }
0072   bool get_isZS() const override { return get_status_bit(5); }
0073 
0074   void set_isRecovered(bool isRecovered) override { set_status_bit(6, isRecovered); }
0075   bool get_isRecovered() const override { return get_status_bit(6); }
0076 
0077   void set_isSaturated(bool isSaturated) override { set_status_bit(7, isSaturated); }
0078   bool get_isSaturated() const override { return get_status_bit(7); }
0079 
0080   bool get_isGood() const override { return !(get_isHot() || get_isBadChi2() || get_isNoCalib()); }
0081 
0082   uint8_t get_status() const override { return status; }
0083 
0084   void set_status(uint8_t _status) override { status = _status; }
0085 
0086   void copy_tower(TowerInfo* tower) override;
0087 
0088  private:
0089   float energy = 0;
0090   short time = 0;
0091   uint8_t chi2 = 0;
0092   uint8_t status = 0;
0093 
0094   void set_status_bit(int bit, bool value)
0095   {
0096     if (bit < 0 || bit > 7)
0097     {
0098       return;
0099     }
0100     status &= ~((uint8_t) 1 << bit);
0101     status |= (uint8_t) value << bit;
0102   }
0103 
0104   bool get_status_bit(int bit) const
0105   {
0106     if (bit < 0 || bit > 7)
0107     {
0108       return false;  // default behavior
0109     }
0110     return (status & ((uint8_t) 1 << bit)) != 0;
0111   }
0112 
0113   ClassDefOverride(TowerInfov4, 1);
0114   // Inherit other methods and properties from TowerInfov1
0115 };
0116 
0117 #endif