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;
0111 }
0112 return (status & ((uint8_t) 1 << bit)) != 0;
0113 }
0114
0115 ClassDefOverride(TowerInfov4, 1);
0116
0117 };
0118
0119 #endif