Header

Packet

Trailer

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#ifndef EventFilter_L1TRawToDigi_AMC13_SPEC__h
#define EventFilter_L1TRawToDigi_AMC13_SPEC__h

#include <memory>
#include <vector>
#include <cstdint>

#include "AMCSpec.h"

namespace edm {
  class Event;
}

namespace amc13 {
  class Header {
  public:
    Header() : data_(0) {}
    Header(const uint64_t *data) : data_(data[0]) {}
    Header(unsigned int namc, unsigned int orbit);

    inline uint64_t raw() const { return data_; };
    bool check() const;

    inline unsigned int getFormatVersion() const { return (data_ >> uFOV_shift) & uFOV_mask; };
    inline unsigned int getNumberOfAMCs() const { return (data_ >> nAMC_shift) & nAMC_mask; };
    inline unsigned int getOrbitNumber() const { return (data_ >> OrN_shift) & OrN_mask; };

  private:
    static const unsigned int uFOV_shift = 60;
    static const unsigned int uFOV_mask = 0xf;
    static const unsigned int nAMC_shift = 52;
    static const unsigned int nAMC_mask = 0xf;
    static const unsigned int OrN_shift = 4;
    static const unsigned int OrN_mask = 0xffffffff;

    static const unsigned int fov = 1;
    static const unsigned int max_amc = 12;

    uint64_t data_;
  };

  class Trailer {
  public:
    Trailer(const uint64_t *data) : data_(data[0]) {}
    Trailer(unsigned int blk, unsigned int lv1, unsigned int bx);

    inline unsigned int getCRC() const { return (data_ >> CRC_shift) & CRC_mask; };
    inline unsigned int getBlock() const { return (data_ >> BlkNo_shift) & BlkNo_mask; };
    inline unsigned int getLV1ID() const { return (data_ >> LV1_shift) & LV1_mask; };
    inline unsigned int getBX() const { return (data_ >> BX_shift) & BX_mask; };

    uint64_t raw() const { return data_; };
    bool check(unsigned int crc, unsigned int block, unsigned int lv1_id, unsigned int bx) const;
    static void writeCRC(const uint64_t *start, uint64_t *end);

  private:
    static const unsigned int CRC_shift = 32;
    static const unsigned int CRC_mask = 0xffffffff;
    static const unsigned int BlkNo_shift = 20;
    static const unsigned int BlkNo_mask = 0xff;
    static const unsigned int LV1_shift = 12;
    static const unsigned int LV1_mask = 0xff;
    static const unsigned int BX_shift = 0;
    static const unsigned int BX_mask = 0xfff;

    uint64_t data_;
  };

  class Packet {
  public:
    Packet() {}

    unsigned int blocks() const;
    unsigned int size() const;

    void add(unsigned int amc_no,
             unsigned int board,
             unsigned int lv1id,
             unsigned int orbit,
             unsigned int bx,
             const std::vector<uint64_t> &load,
             unsigned int user = 0);
    bool parse(const uint64_t *start,
               const uint64_t *data,
               unsigned int size,
               unsigned int lv1,
               unsigned int bx,
               bool legacy_mc = false,
               bool mtf7_mode = false);
    bool write(const edm::Event &ev, unsigned char *ptr, unsigned int skip, unsigned int size) const;

    inline const std::vector<amc::Packet> &payload() const { return payload_; };

  private:
    Header header_;
    std::vector<amc::Packet> payload_;
  };
}  // namespace amc13

#endif