File indexing completed on 2023-03-17 10:49:53
0001 #ifndef DataFormats_GEMDigi_GEMAMC_h
0002 #define DataFormats_GEMDigi_GEMAMC_h
0003 #include "GEMOptoHybrid.h"
0004 #include <vector>
0005
0006 class GEMAMC {
0007 public:
0008 union AMCheader1 {
0009 uint64_t word;
0010 struct {
0011 uint64_t dataLength : 20;
0012 uint64_t bxID : 12;
0013 uint64_t l1AID : 24;
0014 uint64_t AMCnum : 4;
0015 uint64_t reserved : 4;
0016 };
0017 };
0018 union AMCheader2 {
0019 uint64_t word;
0020
0021 struct {
0022 uint64_t boardID : 16;
0023 uint64_t orbitNum : 16;
0024 uint64_t param3 : 8;
0025 uint64_t param2 : 8;
0026 uint64_t param1 : 8;
0027 uint64_t runType : 4;
0028 uint64_t formatVer : 4;
0029 };
0030
0031 struct {
0032 uint64_t softSrcId : 12;
0033 uint64_t softSlot : 4;
0034 uint64_t orbitNumV302 : 32;
0035 uint64_t : 12;
0036 uint64_t FVv302 : 4;
0037 };
0038 };
0039 union AMCTrailer {
0040 uint64_t word;
0041 struct {
0042 uint64_t dataLength : 20;
0043 uint64_t : 4;
0044 uint64_t l1AID : 8;
0045 uint64_t crc : 32;
0046 };
0047 };
0048 union EventHeader {
0049 uint64_t word;
0050 struct {
0051 uint64_t ttsState : 4;
0052 uint64_t pType : 4;
0053
0054
0055 uint64_t pVer : 3;
0056 uint64_t davCnt : 5;
0057 uint64_t buffState : 24;
0058 uint64_t davList : 24;
0059 };
0060 };
0061 union EventTrailer {
0062 uint64_t word;
0063
0064 struct {
0065 uint64_t BCL : 4;
0066
0067 uint64_t DR : 1;
0068 uint64_t CL : 1;
0069 uint64_t ML : 1;
0070 uint64_t BP : 1;
0071 uint64_t oosGlib : 32;
0072
0073 uint64_t linkTo : 24;
0074 };
0075
0076 struct {
0077 uint64_t L1aNF : 1;
0078 uint64_t L1aF : 1;
0079 uint64_t : 1;
0080 uint64_t BCLv302 : 1;
0081
0082 uint64_t DRv302 : 1;
0083 uint64_t CLv302 : 1;
0084 uint64_t MLv302 : 1;
0085 uint64_t BPv302 : 1;
0086 uint64_t param3 : 8;
0087 uint64_t param2 : 8;
0088 uint64_t param1 : 8;
0089 uint64_t runType : 4;
0090
0091 uint64_t : 4;
0092 uint64_t linkToV302 : 24;
0093 };
0094 };
0095
0096 GEMAMC() : amch1_(0), amch2_(0), amct_(0), eh_(0), et_(0){};
0097 ~GEMAMC() { gebd_.clear(); }
0098
0099 int status();
0100
0101 void setAMCheader1(uint64_t word) { amch1_ = word; }
0102 void setAMCheader1(uint32_t dataLength, uint16_t bxID, uint32_t l1AID, uint8_t AMCnum);
0103 uint64_t getAMCheader1() const { return amch1_; }
0104
0105 void setAMCheader2(uint64_t word) { amch2_ = word; }
0106 void setAMCheader2(uint16_t boardID, uint16_t orbitNum, uint8_t runType);
0107 uint64_t getAMCheader2() const { return amch2_; }
0108
0109 void setAMCTrailer(uint64_t word) { amct_ = word; }
0110 uint64_t getAMCTrailer() const { return amct_; }
0111
0112 void setGEMeventHeader(uint64_t word) { eh_ = word; }
0113 void setGEMeventHeader(uint8_t davCnt, uint32_t davList);
0114 uint64_t getGEMeventHeader() const { return eh_; }
0115
0116 void setGEMeventTrailer(uint64_t word) { et_ = word; }
0117 uint64_t getGEMeventTrailer() const { return et_; }
0118
0119
0120 uint32_t dataLength() const { return AMCTrailer{amct_}.dataLength; }
0121 uint16_t bunchCrossing() const { return AMCheader1{amch1_}.bxID; }
0122 uint32_t lv1Id() const { return AMCheader1{amch1_}.l1AID; }
0123 uint8_t amcNum() const { return AMCheader1{amch1_}.AMCnum; }
0124
0125 uint16_t boardId() const { return AMCheader2{amch2_}.boardID; }
0126 uint32_t orbitNumber() const {
0127 if (formatVer() == 0)
0128 return AMCheader2{amch2_}.orbitNum;
0129 return AMCheader2{amch2_}.orbitNumV302;
0130 }
0131 uint8_t param3() const {
0132 if (formatVer() == 0)
0133 return AMCheader2{amch2_}.param3;
0134 return EventTrailer{et_}.param3;
0135 }
0136 uint8_t param2() const {
0137 if (formatVer() == 0)
0138 return AMCheader2{amch2_}.param2;
0139 return EventTrailer{et_}.param2;
0140 }
0141 uint8_t param1() const {
0142 if (formatVer() == 0)
0143 return AMCheader2{amch2_}.param1;
0144 return EventTrailer{et_}.param1;
0145 }
0146 uint8_t runType() const {
0147 if (formatVer() == 0)
0148 return AMCheader2{amch2_}.runType;
0149 return EventTrailer{et_}.runType;
0150 }
0151
0152 uint8_t formatVer() const { return AMCheader2{amch2_}.formatVer; }
0153
0154 uint8_t lv1Idt() const { return AMCTrailer{amct_}.l1AID; }
0155 uint32_t crc() const { return AMCTrailer{amct_}.crc; }
0156
0157 uint16_t ttsState() const { return EventHeader{eh_}.ttsState; }
0158 uint8_t davCnt() const { return EventHeader{eh_}.davCnt; }
0159 uint32_t buffState() const { return EventHeader{eh_}.buffState; }
0160 uint32_t davList() const { return EventHeader{eh_}.davList; }
0161
0162 uint8_t bc0locked() const { return EventTrailer{et_}.BCL; }
0163 uint8_t daqReady() const { return EventTrailer{et_}.DR; }
0164 uint8_t daqClockLocked() const { return EventTrailer{et_}.CL; }
0165 uint8_t mmcmLocked() const { return EventTrailer{et_}.ML; }
0166 uint8_t backPressure() const { return EventTrailer{et_}.BP; }
0167 uint8_t oosGlib() const { return EventTrailer{et_}.oosGlib; }
0168 uint32_t linkTo() const { return EventTrailer{et_}.linkTo; }
0169
0170
0171 uint16_t softSrcId() const { return AMCheader2{amch2_}.softSrcId; }
0172 uint8_t softSlot() const { return AMCheader2{amch2_}.softSlot; }
0173
0174 uint8_t l1aNF() const { return EventTrailer{et_}.L1aNF; }
0175 uint8_t l1aF() const { return EventTrailer{et_}.L1aF; }
0176
0177
0178 void addGEB(GEMOptoHybrid g) { gebd_.push_back(g); }
0179
0180 const std::vector<GEMOptoHybrid>* gebs() const { return &gebd_; }
0181
0182 void clearGEBs() { gebd_.clear(); }
0183
0184 private:
0185 uint64_t amch1_;
0186 uint64_t amch2_;
0187 uint64_t amct_;
0188 uint64_t eh_;
0189 uint64_t et_;
0190
0191 std::vector<GEMOptoHybrid> gebd_;
0192 };
0193 #endif