Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:04:12

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;        // not used
0012       uint64_t sourceId : 12;  // FED number assigned by CDAQ
0013       uint64_t bxId : 12;      // BX number, Reset by BC0
0014       uint64_t lv1Id : 24;     // L1A / event number, Reset by EC0
0015       uint64_t eventType : 4;  // Event Type (1 for normal, 2 for calibration)
0016       uint64_t cb5 : 4;        // 0x5
0017     };
0018   };
0019   union AMC13Header {
0020     uint64_t word;
0021     struct {
0022       uint64_t cb0 : 4;         // 0x0
0023       uint64_t orbitN : 32;     // Orbit Number
0024       uint64_t reserved0 : 16;  // reserved
0025       uint64_t nAMC : 4;        // Number of AMCs following (0 to 12)
0026       uint64_t calType : 4;     // Calibration event type
0027       uint64_t uFov : 4;        // Format version: 0x1
0028     };
0029   };
0030   union AMC13Trailer {
0031     uint64_t word;
0032     struct {
0033       uint64_t bxIdT : 12;  // bx id
0034       uint64_t lv1IdT : 8;  // level 1 id
0035       uint64_t blkN : 8;    // block number
0036       uint64_t : 4;
0037       uint64_t crc32 : 32;  // Overall CRC
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;      // tts
0047       uint64_t evtStat : 4;  // event status
0048       uint64_t res2 : 2;
0049       uint64_t slinkError : 1;
0050       uint64_t wrongFedId : 1;
0051       uint64_t crcCDF : 16;     // CDF crc
0052       uint64_t evtLength : 24;  // event length
0053       uint64_t eventType : 4;   // Event Type
0054       uint64_t cbA : 4;         // 0xA
0055     };
0056   };
0057   union AMCHeader {
0058     uint64_t word;
0059     struct {
0060       uint64_t boardId : 16;  // board id
0061       uint64_t amcNo : 4;     // amc number
0062       uint64_t blkNo : 8;     // block number
0063       uint64_t unused : 4;    // unused
0064       uint64_t amcSize : 24;  // amc size
0065       uint64_t errStrip : 8;  // errStrip
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_;    // CDFHeader
0116   uint64_t amc13h_;  // AMC13Header
0117   uint64_t amc13t_;  // AMC13Trailer
0118   uint64_t cdft_;    // CDFTrailer
0119 
0120   // AMC headers
0121   std::vector<uint64_t> amcHeaders_;
0122   // AMCs payload
0123   std::vector<GEMAMC> amcs_;
0124 };
0125 
0126 #endif