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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
#ifndef DataFormats_GEMDigi_GEMOptoHybrid_h
#define DataFormats_GEMDigi_GEMOptoHybrid_h
#include "GEMVFAT.h"
#include <vector>
class GEMOptoHybrid {
public:
union GEBchamberHeader {
uint64_t word;
// v301 dataformat
struct {
uint64_t : 10; // unused
uint64_t BxmVvV : 1; // 1st bit BX mismatch VFAT vs VFAT
uint64_t BxmAvV : 1; // BX mismatch AMC vs VFAT
uint64_t OOScVvV : 1; // Out of Sync (EC mismatch) VFAT vs VFAT
uint64_t OOScAvV : 1; // Out of Sync (EC mismatch) AMC vs VFAT
uint64_t Inv : 1; // Invalid event
uint64_t EvtSzW : 1; // Event size warning
uint64_t L1aNF : 1; // L1A FIFO near full
uint64_t InNF : 1; // Input FIFO near full
uint64_t EvtNF : 1; // Event FIFO near full
uint64_t EvtSzOFW : 1; // Event size overflow
uint64_t L1aF : 1; // L1A FIFO full
uint64_t InF : 1; // Input FIFO full
uint64_t EvtF : 1; // Event FIFO full
uint64_t VfWdCnt : 12; // VFAT word count (in number of 64-bit words)
uint64_t InputID : 5; // Input link ID
uint64_t CALIB_CHAN : 7; // Calibration channel number
uint64_t : 17; // unused
};
// v302 dataformat
struct {
uint64_t : 10; // unused
uint64_t BxmVvVv302 : 1; // 1st bit BX mismatch VFAT vs VFAT
uint64_t BxmAvVv302 : 1; // BX mismatch AMC vs VFAT
uint64_t OOScVvVv302 : 1; // Out of Sync (EC mismatch) VFAT vs VFAT
uint64_t OOScAvVv302 : 1; // Out of Sync (EC mismatch) AMC vs VFAT
uint64_t InvV302 : 1; // Invalid event
uint64_t EvtSzWv302 : 1; // Event size warning
uint64_t : 1; // unused
uint64_t InNFv302 : 1; // Input FIFO near full
uint64_t EvtNFv302 : 1; // Event FIFO near full
uint64_t EvtSzOFWv302 : 1; // Event size overflow
uint64_t : 1; // unused
uint64_t InFv302 : 1; // Input FIFO full
uint64_t EvtFv302 : 1; // Event FIFO full
uint64_t VfWdCntV302 : 12; // VFAT word count (in number of 64-bit words)
uint64_t InputIDv302 : 5; // Input link ID
uint64_t CALIB_CHANv302 : 7; // Calibration channel number
uint64_t : 17; // unused
};
};
union GEBchamberTrailer {
uint64_t word;
// v301 dataformat
struct {
uint64_t ecOH : 20; // NOT USED - OptoHybrid event counter
uint64_t bcOH : 13; // NOT USED - OptoHybrid bunch crossing
uint64_t InUfw : 1; // Input FIFO underflow
uint64_t SkD : 1; // NOT USED - Stuck data
uint64_t EvUfw : 1; // NOT USED - Event FIFO underflow
uint64_t VfWdCntT : 12; // VFAT word count (in number of 64-bit words)
uint64_t crc16 : 16; // CRC of OptoHybrid data (currently not available – filled with 0)
};
// v302 dataformat
struct {
uint64_t VFATMask : 24; // Enabled VFAT, Set 1 if the VFAT is enabled
uint64_t ZSMask : 24; // Zero-suppressed VFAT, Set 1 if the VFAT payload has been zero-suppressed
uint64_t : 3; // unused
uint64_t InUfwV302 : 1; // Input FIFO underflow
uint64_t VfWdCntTv302 : 12; // VFAT word count (in number of 64-bit words)
};
};
GEMOptoHybrid() : ver_(0), ch_(0), ct_(0), existVFATs_(0) {}
~GEMOptoHybrid() { vfatd_.clear(); }
void setVersion(uint8_t i) { ver_ = i; }
uint8_t version() const { return ver_; }
//!Read chamberHeader from the block.
void setChamberHeader(uint64_t word) { ch_ = word; }
void setChamberHeader(uint16_t vfatWordCnt, uint8_t inputID) {
GEBchamberHeader u{0};
u.VfWdCnt = vfatWordCnt;
u.InputID = inputID;
ch_ = u.word;
}
uint64_t getChamberHeader() const { return ch_; }
//!Read chamberTrailer from the block.
void setChamberTrailer(uint64_t word) { ct_ = word; }
void setChamberTrailer(uint32_t ecOH, uint16_t bcOH, uint16_t vfatWordCntT) {
GEBchamberTrailer u{0};
u.ecOH = ecOH;
u.bcOH = bcOH;
u.VfWdCntT = vfatWordCntT;
ct_ = u.word;
}
uint64_t getChamberTrailer() const { return ct_; }
// v301
uint16_t vfatWordCnt() const {
if (ver_ == 0)
return GEBchamberHeader{ch_}.VfWdCnt;
return GEBchamberHeader{ch_}.VfWdCntV302;
}
uint8_t inputID() const {
if (ver_ == 0)
return GEBchamberHeader{ch_}.InputID;
return GEBchamberHeader{ch_}.InputIDv302;
}
uint16_t vfatWordCntT() const {
if (ver_ == 0)
return GEBchamberTrailer{ct_}.VfWdCntT;
return GEBchamberTrailer{ct_}.VfWdCntTv302;
}
bool bxmVvV() const { return GEBchamberHeader{ch_}.BxmVvV; }
bool bxmAvV() const { return GEBchamberHeader{ch_}.BxmAvV; }
bool oOScVvV() const { return GEBchamberHeader{ch_}.OOScVvV; }
bool oOScAvV() const { return GEBchamberHeader{ch_}.OOScAvV; }
bool inv() const { return GEBchamberHeader{ch_}.Inv; }
bool evtSzW() const { return GEBchamberHeader{ch_}.EvtSzW; }
bool inNF() const { return GEBchamberHeader{ch_}.InNF; }
bool evtNF() const { return GEBchamberHeader{ch_}.EvtNF; }
bool evtSzOFW() const { return GEBchamberHeader{ch_}.EvtSzOFW; }
bool inF() const { return GEBchamberHeader{ch_}.InF; }
bool evtF() const { return GEBchamberHeader{ch_}.EvtF; }
bool inUfw() const {
if (ver_ == 0)
return GEBchamberTrailer{ct_}.InUfw;
return GEBchamberTrailer{ct_}.InUfwV302;
}
bool noVFAT() const { return false; } // to be removed
bool stuckData() const { return false; } // to be removed
bool evUfw() const { return false; } // to be removed
// v301
bool l1aNF() const { return GEBchamberHeader{ch_}.L1aNF; }
bool l1aF() const { return GEBchamberHeader{ch_}.L1aF; }
// v302
uint32_t vfatMask() const { return GEBchamberTrailer{ct_}.VFATMask; }
uint32_t zsMask() const { return GEBchamberTrailer{ct_}.ZSMask; }
//!Adds VFAT data to the vector
void addVFAT(GEMVFAT v) {
existVFATs_ = existVFATs_ | (0x1 << v.vfatId());
vfatd_.push_back(v);
}
//!Returns the vector of VFAT data
const std::vector<GEMVFAT>* vFATs() const { return &vfatd_; }
uint32_t existVFATs() const { return existVFATs_; }
//!Clear the vector rof VFAT data
void clearVFATs() { vfatd_.clear(); }
static const int sizeGebID = 5;
private:
uint8_t ver_; // Data Format version
uint64_t ch_; // GEBchamberHeader
uint64_t ct_; // GEBchamberTrailer
uint32_t existVFATs_;
std::vector<GEMVFAT> vfatd_;
};
#endif
|