Back to home page

Project CMSSW displayed by LXR

 
 

    


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 // GEM OptoHybrid status
0008 class GEMOHStatus {
0009 public:
0010   union Errors {
0011     uint16_t codes;
0012     struct {
0013       uint16_t EvtF : 1;      // Event FIFO full
0014       uint16_t InF : 1;       // Input FIFO full
0015       uint16_t L1aF : 1;      // L1A FIFO full
0016       uint16_t EvtSzOFW : 1;  // Event size overflow
0017       uint16_t Inv : 1;       // Invalid event
0018       uint16_t OOScAvV : 1;   // Out of Sync (EC mismatch) AMC vs VFAT
0019       uint16_t OOScVvV : 1;   // Out of Sync (EC mismatch) VFAT vs VFAT
0020       uint16_t BxmAvV : 1;    // BX mismatch AMC vs VFAT
0021       uint16_t BxmVvV : 1;    // 1st bit BX mismatch VFAT vs VFAT
0022       uint16_t InUfw : 1;     // Input FIFO underflow
0023       uint16_t badVFatCount : 1;
0024     };
0025   };
0026   union Warnings {
0027     uint8_t wcodes;
0028     struct {
0029       uint8_t EvtNF : 1;   // Event FIFO near full
0030       uint8_t InNF : 1;    // Input FIFO near full
0031       uint8_t L1aNF : 1;   // L1A FIFO near full
0032       uint8_t EvtSzW : 1;  // Event size warning
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