Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-12-17 09:19:55

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