2 #include "Mu2e-STMDAQ/config/stm_data.hh"
5 STMdata::STMdata(
Config& cfg_,
const std::shared_ptr<AsyncLogger>& logger_)
8 , master_config(cfg, logger)
10 fw_config(cfg, logger)
12 mu2e_config(cfg, logger, fw_config)
14 udp_config(cfg, logger, master_config)
16 zs_config(cfg, logger, master_config, fw_config, mu2e_config)
18 prescale_config(cfg, logger)
20 write_config(cfg, logger)
22 buffer_config(cfg, logger, fw_config, mu2e_config, zs_config, MAX_PACKET_SIZE)
25 cfg, logger, fw_config, buffer_config, MAX_PACKET_LEN - pHdr_Len - fw_eHdr_len)
27 mwd_config(cfg, logger, fw_config, baseline_config)
29 pulseheight_config(cfg, logger, fw_config, baseline_config)
31 tcp_config(cfg, logger, master_config)
33 dqm_config(cfg, logger, fw_config)
38 uint32_t STMdata::make_uint32_t(int16_t p0, int16_t p1)
40 uint32_t value =
static_cast<uint32_t
>(
static_cast<uint16_t
>(p1)) << 16;
41 value |=
static_cast<uint16_t
>(p0);
46 uint64_t STMdata::make_uint64_t(int16_t p0, int16_t p1, int16_t p2, int16_t p3)
48 uint64_t value = (
static_cast<uint64_t
>(
static_cast<uint16_t
>(p3)) << 48) |
49 (
static_cast<uint64_t
>(
static_cast<uint16_t
>(p2)) << 32) |
50 (
static_cast<uint64_t
>(
static_cast<uint16_t
>(p1)) << 16) |
51 static_cast<uint64_t
>(
static_cast<uint16_t
>(p0));
56 std::vector<int16_t> STMdata::split_uint32_t(uint32_t value)
58 std::vector<int16_t> split_value(2);
59 split_value[0] =
static_cast<int16_t
>((value >> 0) & 0xFFFF);
60 split_value[1] =
static_cast<int16_t
>((value >> 16) & 0xFFFF);
65 std::vector<int16_t> STMdata::split_uint64_t(uint64_t value)
67 std::vector<int16_t> split_value(4);
68 split_value[0] =
static_cast<int16_t
>((value >> 0) & 0xFFFF);
69 split_value[1] =
static_cast<int16_t
>((value >> 16) & 0xFFFF);
70 split_value[2] =
static_cast<int16_t
>((value >> 32) & 0xFFFF);
71 split_value[3] =
static_cast<int16_t
>((value >> 48) & 0xFFFF);
76 uint64_t STMdata::get_ADCclock(int16_t*
data, uint64_t hdr_index)
78 uint64_t ADCclock = make_uint64_t(
data[hdr_index + fw_eHdr.ADCclk_0],
79 data[hdr_index + fw_eHdr.ADCclk_1],
80 data[hdr_index + fw_eHdr.ADCclk_2],
81 data[hdr_index + fw_eHdr.ADCclk_3]);
86 uint64_t STMdata::get_event_number(int16_t*
data, uint64_t hdr_index)
88 uint64_t event_number = make_uint64_t(
data[hdr_index + fw_eHdr.EvNum_0],
89 data[hdr_index + fw_eHdr.EvNum_1],
90 data[hdr_index + fw_eHdr.EvNum_2],
96 uint64_t STMdata::get_EWT(int16_t*
data, uint64_t hdr_index)
98 uint64_t EWT = make_uint64_t(
data[hdr_index + fw_eHdr.EWT_0],
99 data[hdr_index + fw_eHdr.EWT_1],
100 data[hdr_index + fw_eHdr.EWT_2],
106 uint16_t STMdata::check_dead_beef(int16_t*
data,
107 uint64_t packet_start,
108 uint16_t leftInPacket)
111 uint32_t pnum = (uint16_t)
data[packet_start + 1] << 16 | (uint16_t)
data[packet_start];
114 while(leftInPacket != 0)
117 int loc = packet_start + MAX_PACKET_LEN - leftInPacket;
119 if((uint16_t)(
data[loc] & 0xFFFF) != BEEF and
120 (uint16_t)(
data[loc + 1] & 0xFFFF) != DEAD)
124 logger->log(
"ERROR! End of packet " + std::to_string(pnum) +
125 " not filled with 0xDEADBEEF!!",
131 std::cout <<
"ERROR! End of packet " << pnum
132 <<
" not filled with 0xDEADBEEF!!" << std::endl;
144 uint64_t STMdata::get_event_mode(int16_t*
data, uint64_t hdr_index)
147 uint16_t EM0 =
static_cast<uint16_t
>(
data[hdr_index + fw_eHdr.EM_0]);
148 uint16_t EM1 =
static_cast<uint16_t
>(
data[hdr_index + fw_eHdr.EM_1]);
149 uint16_t EM2 =
static_cast<uint16_t
>(
data[hdr_index + fw_eHdr.EM_2_DRTDC]);
152 uint8_t byte0 = EM0 & 0xFF;
153 uint8_t byte1 = (EM0 >> 8) & 0xFF;
154 uint8_t byte2 = EM1 & 0xFF;
155 uint8_t byte3 = (EM1 >> 8) & 0xFF;
156 uint8_t byte4 = EM2 & 0xFF;
160 EM |=
static_cast<uint64_t
>(byte3) << 32;
161 EM |=
static_cast<uint64_t
>(byte2) << 24;
162 EM |=
static_cast<uint64_t
>(byte1) << 16;
163 EM |=
static_cast<uint64_t
>(byte0) << 8;
164 EM |=
static_cast<uint64_t
>(byte4);
170 uint64_t STMdata::get_Ch_DTCclk(int16_t*
data, uint64_t hdr_index)
172 uint64_t Ch_DTCclk = make_uint64_t(
data[hdr_index + fw_eHdr.Ch_DTCclk_0],
173 data[hdr_index + fw_eHdr.DTCclk_1],
174 data[hdr_index + fw_eHdr.DTCclk_2],
175 data[hdr_index + fw_eHdr.DTCclk_3]);
180 uint16_t STMdata::get_channel(int16_t*
data, uint64_t hdr_index)
182 return static_cast<uint16_t
>(
data[hdr_index + fw_eHdr.Ch_DTCclk_0]) & 0x00FF;
186 uint64_t STMdata::get_DTCclock(int16_t*
data, uint64_t hdr_index)
188 uint64_t Ch_DTCclk = get_Ch_DTCclk(
data, hdr_index);
189 uint64_t DTCclock = Ch_DTCclk >> 8;
194 sw_event_header STMdata::create_sw_eHdr(int16_t*
data, uint64_t hdr_index)
197 sw_event_header hdr{};
200 hdr[sw_eHdr.anchor_start] = sw_eHdr.anchor;
203 hdr[sw_eHdr.EWT_0] =
data[hdr_index + fw_eHdr.EWT_0];
204 hdr[sw_eHdr.EWT_1] =
data[hdr_index + fw_eHdr.EWT_1];
205 hdr[sw_eHdr.EWT_2] =
data[hdr_index + fw_eHdr.EWT_2];
208 hdr[sw_eHdr.ADCclk_0] =
data[hdr_index + fw_eHdr.ADCclk_0];
209 hdr[sw_eHdr.ADCclk_1] =
data[hdr_index + fw_eHdr.ADCclk_1];
210 hdr[sw_eHdr.ADCclk_2] =
data[hdr_index + fw_eHdr.ADCclk_2];
211 hdr[sw_eHdr.ADCclk_3] =
data[hdr_index + fw_eHdr.ADCclk_3];
214 hdr[sw_eHdr.Ch_DTCclk_0] =
data[hdr_index + fw_eHdr.Ch_DTCclk_0];
215 hdr[sw_eHdr.DTCclk_1] =
data[hdr_index + fw_eHdr.DTCclk_1];
216 hdr[sw_eHdr.DTCclk_2] =
data[hdr_index + fw_eHdr.DTCclk_2];
217 hdr[sw_eHdr.DTCclk_3] =
data[hdr_index + fw_eHdr.DTCclk_3];
220 hdr[sw_eHdr.EM_0] =
data[hdr_index + fw_eHdr.EM_0];
221 hdr[sw_eHdr.EM_1] =
data[hdr_index + fw_eHdr.EM_1];
222 hdr[sw_eHdr.EM_2_DRTDC] =
data[hdr_index + fw_eHdr.EM_2_DRTDC];
225 hdr[sw_eHdr.anchor_end] = sw_eHdr.anchor;
231 sw_event_header STMdata::create_sw_eHdr(uint64_t EWT,
237 sw_event_header hdr{};
239 hdr[sw_eHdr.anchor_start] = sw_eHdr.anchor;
241 auto ewt_words = split_uint64_t(EWT);
242 auto adc_words = split_uint64_t(ADCclk);
243 auto chdtc_words = split_uint64_t(Ch_DTCclk);
244 auto em_words = split_uint64_t(EM);
246 hdr[sw_eHdr.EWT_0] = ewt_words[0];
247 hdr[sw_eHdr.EWT_1] = ewt_words[1];
248 hdr[sw_eHdr.EWT_2] = ewt_words[2];
250 hdr[sw_eHdr.ADCclk_0] = adc_words[0];
251 hdr[sw_eHdr.ADCclk_1] = adc_words[1];
252 hdr[sw_eHdr.ADCclk_2] = adc_words[2];
253 hdr[sw_eHdr.ADCclk_3] = adc_words[3];
255 hdr[sw_eHdr.Ch_DTCclk_0] = chdtc_words[0];
256 hdr[sw_eHdr.DTCclk_1] = chdtc_words[1];
257 hdr[sw_eHdr.DTCclk_2] = chdtc_words[2];
258 hdr[sw_eHdr.DTCclk_3] = chdtc_words[3];
260 hdr[sw_eHdr.EM_0] = em_words[0];
261 hdr[sw_eHdr.EM_1] = em_words[1];
262 hdr[sw_eHdr.EM_2_DRTDC] = em_words[2];
264 hdr[sw_eHdr.anchor_end] = sw_eHdr.anchor;