11 #include "STMDAQ-TestBeam/utils/Hex.hh"
14 #include "STMDAQ-TestBeam/processData/formEvents.hh"
20 formEvents::formEvents(uint64_t buffer_len)
23 for(
int i = 0; i < CHNUM; i++)
25 event_data[i] =
new int16_t[buffer_len];
30 uint64_t formEvents::get_events(
int chan,
36 if(data_len % MAX_PACKET_LEN != 0)
38 Logger::Instance()->write(
40 "formEvents::get_events : Packet sizes incorrect! Channel = " +
41 std::to_string(chan) +
". Data size = " + std::to_string(data_len) +
42 " % MAX_PACKET_LEN = " + std::to_string(data_len % MAX_PACKET_LEN));
46 event_counter[chan] = 0;
47 acc_event_size[chan] = 0;
52 while(count < data_len)
55 uint64_t packet_start = count;
58 uint16_t leftInPacket = MAX_PACKET_LEN - fw_pHdr_Len;
60 while(leftInPacket > fw_tHdr_Len)
63 uint64_t hdr_start_loc = packet_start + MAX_PACKET_LEN - leftInPacket;
66 if((uint16_t)(
data[hdr_start_loc] & 0xFFFF) == BEEF and
67 (uint16_t)(
data[hdr_start_loc + 1] & 0xFFFF) == DEAD and
68 (uint16_t)(
data[hdr_start_loc + 2] & 0xFFFF) == BEEF and
69 (uint16_t)(
data[hdr_start_loc + 3] & 0xFFFF) == DEAD)
72 leftInPacket = dva.check_dead_beef(
data, packet_start, leftInPacket);
79 chan, event_data[chan], acc_event_size[chan] /
sizeof(int16_t));
82 return event_counter[chan];
86 uint64_t event_len_loc = hdr_start_loc + fw_tHdr::EvInPacket;
89 uint16_t event_len =
data[event_len_loc];
92 uint16_t tot_event_len =
data[hdr_start_loc + fw_tHdr::EvLen];
95 uint64_t event_num = dva.get_event_number(
data, hdr_start_loc);
98 uint64_t EWT = dva.get_event_number(
data, hdr_start_loc);
104 event_number = event_num;
107 if(first_event[chan])
110 current_event_num[chan] = event_num;
113 memcpy(current_event_data[chan], &
data[hdr_start_loc], fw_tHdr_Size);
116 current_event_size[chan] += fw_tHdr_Size;
119 first_event[chan] =
false;
123 leftInPacket -= fw_tHdr_Len;
125 if(event_num != current_event_num[chan])
144 uint32_t size_to_copy = fw_tHdr_Size + event_len *
sizeof(int16_t);
147 memcpy(current_event_data[chan], &
data[hdr_start_loc], size_to_copy);
150 current_event_size[chan] += size_to_copy;
153 current_event_len[chan] += event_len;
156 current_event_num[chan] = event_num;
163 uint32_t size_to_copy = event_len *
sizeof(int16_t);
166 memcpy(¤t_event_data[chan][fw_tHdr_Len + current_event_len[chan]],
167 &
data[hdr_start_loc + fw_tHdr_Len],
171 current_event_size[chan] += size_to_copy;
174 current_event_len[chan] += event_len;
178 leftInPacket -= event_len;
183 count += MAX_PACKET_LEN;
188 if(event_counter[chan] > 0)
191 pushq->push(chan, event_data[chan], acc_event_size[chan] /
sizeof(int16_t));
194 return event_counter[chan];
198 void formEvents::store_event(
int chan)
201 uint16_t event_len_check =
202 (current_event_size[chan] - fw_tHdr_Size) /
sizeof(int16_t);
205 if(event_len_check != current_event_len[chan])
207 Logger::Instance()->write(
209 "ERROR in formEvents::get_events! Chan = " + std::to_string(chan) +
210 ". Event number = " + std::to_string(current_event_num[chan]) +
211 ". Stored event length = " + std::to_string(event_len_check) +
212 ". Given event length = " + std::to_string(current_event_len[chan]) +
217 uint16_t hdr_event_len = current_event_data[chan][fw_tHdr::EvLen];
218 if(hdr_event_len != current_event_len[chan])
220 Logger::Instance()->write(
222 "ERROR in formEvents::get_events! Chan = " + std::to_string(chan) +
223 ". Event number = " + std::to_string(current_event_num[chan]) +
224 ". Stored event length = " + std::to_string(event_len_check) +
225 ". Given event length = " + std::to_string(hdr_event_len) +
".");
229 current_event_data[chan][fw_tHdr::EvStart] = 0;
232 current_event_data[chan][fw_tHdr::EvInPacket] = current_event_len[chan];
256 event_number = current_event_num[chan];
258 int16_t on_spill_flag = current_event_data[chan][tHdr_vars.EM_2_DRTDC] & 0x1;
261 event_count[chan] += 1;
262 if(on_spill_flag == 1 or current_event_len[chan] < 20000)
264 on_spill_count[chan] += 1;
268 off_spill_count[chan] += 1;
272 acc_event_size[chan] += current_event_size[chan];
276 (acc_event_size[chan] - current_event_size[chan]) /
sizeof(int16_t);
279 &event_data[chan][copy_loc], current_event_data[chan], current_event_size[chan]);
282 event_counter[chan]++;
285 current_event_len[chan] = 0;
286 current_event_size[chan] = 0;