File indexing completed on 2024-04-06 12:04:12
0001 #ifndef DataFormats_GEMDigi_GEMAMCStatus_h
0002 #define DataFormats_GEMDigi_GEMAMCStatus_h
0003 #include "GEMAMC13.h"
0004 #include "GEMAMC.h"
0005 #include <bitset>
0006 #include <ostream>
0007
0008 class GEMAMCStatus {
0009 public:
0010 union Errors {
0011 uint16_t ecodes;
0012 struct {
0013 uint16_t badEC : 1;
0014 uint16_t badBC : 1;
0015 uint16_t badOC : 1;
0016 uint16_t badRunType : 1;
0017 uint16_t badCRC : 1;
0018 uint16_t MMCMlocked : 1;
0019 uint16_t DAQclocklocked : 1;
0020 uint16_t DAQnotReday : 1;
0021 uint16_t BC0locked : 1;
0022 uint16_t badFEDId : 1;
0023 uint16_t L1AFull : 1;
0024 };
0025 };
0026 union Warnings {
0027 uint8_t wcodes;
0028 struct {
0029 uint8_t InValidOH : 1;
0030 uint8_t backPressure : 1;
0031 uint8_t L1ANearFull : 1;
0032 };
0033 };
0034
0035 GEMAMCStatus() {}
0036 GEMAMCStatus(const GEMAMC13* amc13, const GEMAMC& amc) {
0037 amcNum_ = amc.amcNum();
0038 Errors error{0};
0039 error.badEC = (amc13->lv1Id() != amc.lv1Id());
0040
0041 error.badBC = !((amc13->bunchCrossing() == amc.bunchCrossing()) ||
0042 (amc13->bunchCrossing() == 0 && amc.bunchCrossing() == GEMAMC13::lastBC));
0043 error.badRunType = amc.runType() != 0x1;
0044
0045 if (amc.formatVer() == 0)
0046 error.badOC =
0047 !((uint16_t(amc13->orbitNumber()) == amc.orbitNumber()) ||
0048 (amc13->bunchCrossing() == 0 && uint16_t(amc.orbitNumber() + 1) == uint16_t(amc13->orbitNumber())));
0049 else
0050 error.badOC = !((amc13->orbitNumber() == (amc.orbitNumber() + 1)) ||
0051 (amc13->bunchCrossing() == 0 && amc13->orbitNumber() == (amc.orbitNumber() + 2)));
0052 error.MMCMlocked = !amc.mmcmLocked();
0053 error.DAQclocklocked = !amc.daqClockLocked();
0054 error.DAQnotReday = !amc.daqReady();
0055 error.BC0locked = !amc.bc0locked();
0056 error.badFEDId = (amc13->sourceId() != amc.softSrcId() and amc.formatVer() != 0);
0057 error.L1AFull = (amc.l1aF() and amc.formatVer() != 0);
0058 errors_ = error.ecodes;
0059
0060 Warnings warn{0};
0061 warn.backPressure = amc.backPressure();
0062 warn.L1ANearFull = (amc.l1aNF() and amc.formatVer() != 0);
0063 warnings_ = warn.wcodes;
0064 }
0065
0066 void inValidOH() {
0067 Warnings warn{warnings_};
0068 warn.InValidOH = 1;
0069 warnings_ = warn.wcodes;
0070 }
0071
0072 uint8_t amcNumber() const { return amcNum_; };
0073 bool isBad() const { return errors_ != 0; }
0074 uint16_t errors() const { return errors_; }
0075 uint8_t warnings() const { return warnings_; }
0076
0077 private:
0078 uint8_t amcNum_;
0079 uint16_t errors_;
0080 uint8_t warnings_;
0081 };
0082
0083 inline std::ostream& operator<<(std::ostream& out, const GEMAMCStatus& status) {
0084 out << "GEMAMCStatus errors " << std::bitset<16>(status.errors()) << " warnings "
0085 << std::bitset<8>(status.warnings());
0086 return out;
0087 }
0088
0089 #endif