File indexing completed on 2023-10-25 09:39:02
0001 #ifndef DataFormats_GEMDigi_GEMOHStatus_h
0002 #define DataFormats_GEMDigi_GEMOHStatus_h
0003 #include "GEMOptoHybrid.h"
0004 #include <bitset>
0005 #include <ostream>
0006
0007
0008 class GEMOHStatus {
0009 public:
0010 union Errors {
0011 uint16_t codes;
0012 struct {
0013 uint16_t EvtF : 1;
0014 uint16_t InF : 1;
0015 uint16_t L1aF : 1;
0016 uint16_t EvtSzOFW : 1;
0017 uint16_t Inv : 1;
0018 uint16_t OOScAvV : 1;
0019 uint16_t OOScVvV : 1;
0020 uint16_t BxmAvV : 1;
0021 uint16_t BxmVvV : 1;
0022 uint16_t InUfw : 1;
0023 uint16_t badVFatCount : 1;
0024 };
0025 };
0026 union Warnings {
0027 uint8_t wcodes;
0028 struct {
0029 uint8_t EvtNF : 1;
0030 uint8_t InNF : 1;
0031 uint8_t L1aNF : 1;
0032 uint8_t EvtSzW : 1;
0033 uint8_t InValidVFAT : 1;
0034 uint8_t missingVFAT : 1;
0035 };
0036 };
0037
0038 GEMOHStatus() {}
0039 GEMOHStatus(const GEMOptoHybrid& oh, int chamberType) : chamberType_(chamberType) {
0040 Errors error{0};
0041 error.EvtF = oh.evtF();
0042 error.InF = oh.inF();
0043 error.L1aF = (oh.l1aF() and (oh.version() == 0));
0044 error.EvtSzOFW = oh.evtSzOFW();
0045 error.Inv = oh.inv();
0046 error.OOScAvV = oh.oOScAvV();
0047 error.OOScVvV = oh.oOScVvV();
0048 error.BxmAvV = oh.bxmAvV();
0049 error.BxmVvV = oh.bxmVvV();
0050 error.InUfw = oh.inUfw();
0051 error.badVFatCount = oh.vfatWordCnt() != oh.vfatWordCntT();
0052 errors_ = error.codes;
0053
0054 Warnings warn{0};
0055 existVFATs_ = oh.existVFATs();
0056 vfatMask_ = oh.vfatMask();
0057 zsMask_ = oh.zsMask();
0058 missingVFATs_ = (existVFATs_ ^ 0xffffff) & (vfatMask_ & (zsMask_ ^ 0xffffff));
0059 warn.EvtNF = oh.evtNF();
0060 warn.InNF = oh.inNF();
0061 warn.L1aNF = (oh.l1aNF() and (oh.version() == 0));
0062 warn.EvtSzW = oh.evtSzW();
0063 warn.missingVFAT = (oh.version() != 0) and (missingVFATs_ != 0);
0064 warnings_ = warn.wcodes;
0065 }
0066
0067 void inValidVFAT() {
0068 Warnings warn{warnings_};
0069 warn.InValidVFAT = 1;
0070 warnings_ = warn.wcodes;
0071 }
0072
0073 bool isBad() const { return errors_ != 0; }
0074 uint16_t errors() const { return errors_; }
0075 uint8_t warnings() const { return warnings_; }
0076 uint32_t missingVFATs() const { return missingVFATs_; }
0077 uint32_t vfatMask() const { return vfatMask_; }
0078 uint32_t zsMask() const { return zsMask_; }
0079 uint32_t existVFATs() const { return existVFATs_; }
0080 int chamberType() const { return chamberType_; }
0081
0082 private:
0083 int chamberType_;
0084 uint16_t errors_;
0085 uint8_t warnings_;
0086 uint32_t missingVFATs_;
0087 uint32_t vfatMask_;
0088 uint32_t zsMask_;
0089 uint32_t existVFATs_;
0090 };
0091
0092 inline std::ostream& operator<<(std::ostream& out, const GEMOHStatus& status) {
0093 out << "GEMOHStatus errors " << std::bitset<16>(status.errors()) << " warnings " << std::bitset<8>(status.warnings());
0094 return out;
0095 }
0096
0097 #endif