File indexing completed on 2023-03-17 10:49:53
0001 #ifndef DataFormats_GEMDigi_GEMAMC13_h
0002 #define DataFormats_GEMDigi_GEMAMC13_h
0003 #include <vector>
0004 #include "GEMAMC.h"
0005
0006 class GEMAMC13 {
0007 public:
0008 union CDFHeader {
0009 uint64_t word;
0010 struct {
0011 uint64_t fov : 8;
0012 uint64_t sourceId : 12;
0013 uint64_t bxId : 12;
0014 uint64_t lv1Id : 24;
0015 uint64_t eventType : 4;
0016 uint64_t cb5 : 4;
0017 };
0018 };
0019 union AMC13Header {
0020 uint64_t word;
0021 struct {
0022 uint64_t cb0 : 4;
0023 uint64_t orbitN : 32;
0024 uint64_t reserved0 : 16;
0025 uint64_t nAMC : 4;
0026 uint64_t calType : 4;
0027 uint64_t uFov : 4;
0028 };
0029 };
0030 union AMC13Trailer {
0031 uint64_t word;
0032 struct {
0033 uint64_t bxIdT : 12;
0034 uint64_t lv1IdT : 8;
0035 uint64_t blkN : 8;
0036 uint64_t : 4;
0037 uint64_t crc32 : 32;
0038 };
0039 };
0040 union CDFTrailer {
0041 uint64_t word;
0042 struct {
0043 uint64_t res1 : 2;
0044 uint64_t crcModified : 1;
0045 uint64_t moreTrailers : 1;
0046 uint64_t tts : 4;
0047 uint64_t evtStat : 4;
0048 uint64_t res2 : 2;
0049 uint64_t slinkError : 1;
0050 uint64_t wrongFedId : 1;
0051 uint64_t crcCDF : 16;
0052 uint64_t evtLength : 24;
0053 uint64_t eventType : 4;
0054 uint64_t cbA : 4;
0055 };
0056 };
0057 union AMCHeader {
0058 uint64_t word;
0059 struct {
0060 uint64_t boardId : 16;
0061 uint64_t amcNo : 4;
0062 uint64_t blkNo : 8;
0063 uint64_t unused : 4;
0064 uint64_t amcSize : 24;
0065 uint64_t errStrip : 8;
0066 };
0067 };
0068
0069 GEMAMC13() : cdfh_(0), amc13h_(0), amc13t_(0), cdft_(0) {}
0070 ~GEMAMC13() {
0071 amcHeaders_.clear();
0072 amcs_.clear();
0073 }
0074
0075 void setCDFHeader(uint64_t word) { cdfh_ = word; }
0076 void setCDFHeader(uint8_t Evt_ty, uint32_t LV1_id, uint16_t BX_id, uint16_t Source_id);
0077 uint64_t getCDFHeader() const { return cdfh_; }
0078
0079 void setAMC13Header(uint64_t word) { amc13h_ = word; }
0080 void setAMC13Header(uint8_t CalTyp, uint8_t nAMC, uint32_t OrN);
0081 uint64_t getAMC13Header() const { return amc13h_; }
0082
0083 void setAMC13Trailer(uint64_t word) { amc13t_ = word; }
0084 void setAMC13Trailer(uint8_t Blk_NoT, uint8_t LV1_idT, uint16_t BX_idT);
0085 uint64_t getAMC13Trailer() const { return amc13t_; }
0086
0087 void setCDFTrailer(uint64_t word) { cdft_ = word; }
0088 void setCDFTrailer(uint32_t EvtLength);
0089 uint64_t getCDFTrailer() const { return cdft_; }
0090 uint32_t fragmentLength() const { return CDFTrailer{cdft_}.evtLength; }
0091 uint8_t evtStatus() const { return CDFTrailer{cdft_}.evtStat; }
0092 uint8_t ttsBits() const { return CDFTrailer{cdft_}.tts; }
0093
0094 uint16_t bunchCrossing() const { return CDFHeader{cdfh_}.bxId; }
0095 uint32_t lv1Id() const { return CDFHeader{cdfh_}.lv1Id; }
0096 uint16_t sourceId() const { return CDFHeader{cdfh_}.sourceId; }
0097
0098 uint32_t orbitNumber() const { return AMC13Header{amc13h_}.orbitN; }
0099 uint8_t nAMC() const { return AMC13Header{amc13h_}.nAMC; }
0100
0101 const std::vector<uint64_t>* getAMCheaders() const { return &amcHeaders_; }
0102 uint32_t getAMCsize(int i) const { return AMCHeader{amcHeaders_.at(i)}.amcSize; }
0103 void addAMCheader(uint64_t word);
0104 void addAMCheader(uint32_t AMC_size, uint8_t Blk_No, uint8_t AMC_No, uint16_t BoardID);
0105
0106 uint32_t crc() const { return AMC13Trailer{amc13t_}.crc32; }
0107
0108 const std::vector<GEMAMC>* getAMCpayloads() const { return &amcs_; }
0109 void addAMCpayload(const GEMAMC& a) { amcs_.push_back(a); }
0110 void clearAMCpayloads() { amcs_.clear(); }
0111
0112 static const int lastBC = 3564;
0113
0114 private:
0115 uint64_t cdfh_;
0116 uint64_t amc13h_;
0117 uint64_t amc13t_;
0118 uint64_t cdft_;
0119
0120
0121 std::vector<uint64_t> amcHeaders_;
0122
0123 std::vector<GEMAMC> amcs_;
0124 };
0125
0126 #endif