89void ReadEventFile(IReader &loader, IEventHandler &handler, IProgress &progress, int32_t def_clock_scale,
90 bool use_tx_chopper) {
93 if (!loader.read(
reinterpret_cast<char *
>(&hdr_base),
sizeof(hdr_base)))
94 throw std::runtime_error(
"unable to load EventFileHeader-Base");
97 if (!loader.read(
reinterpret_cast<char *
>(&hdr_packed),
sizeof(hdr_packed)))
98 throw std::runtime_error(
"unable to load EventFileHeader-Packed");
101 throw std::runtime_error(
"bad magic number");
104 char txtBuffer[255] = {};
105 snprintf(txtBuffer,
sizeof(txtBuffer),
"invalid file (only format_number=%08Xh or lower)",
107 throw std::runtime_error(txtBuffer);
111 throw std::runtime_error(
"only packed binary format is supported");
113 if (hdr_base.
clock_scale == 0 && def_clock_scale == 0)
114 throw std::runtime_error(
"clock scale cannot be zero");
128 double scale_microsec = hdr_base.
clock_scale / 1000.0;
131 scale_microsec = def_clock_scale / 1000.0;
136 int64_t primary_time = 0;
137 int64_t auxillary_time = 0;
138 bool primary_ok =
false;
139 bool auxillary_ok =
false;
142 uint32_t
x = 0,
y = 0, v = 0, w = 0,
144 uint32_t *ptr_val[
NVAL] = {&
x, &
y, &v, &w, &wa};
158 int32_t nbits_val_oob[
NVAL] = {};
164 int32_t nbits_val = 0;
165 int32_t nbits_val_filled = 0;
166 int32_t nbits_dt_filled = 0;
170 int32_t oob_event = 0,
176 bool event_ended =
false;
182 if (!loader.read(
reinterpret_cast<char *
>(&ch), 1))
185 int32_t nbits_ch_used = 0;
195 oob_event = (ch & 1);
205 for (ind_val = 0; ind_val <
NVAL; ind_val++)
206 *ptr_val[ind_val] = 0;
209 nbits_val_filled = 0;
218 throw std::runtime_error(
"Failure in event decoding");
233 nbits_val_oob[0] = (ch & 0xC0) >> 3;
242 nbits_val_oob[1] = (ch & 0x03) << 3;
243 nbits_val_oob[2] = (ch & 0x0C) << 1;
244 nbits_val_oob[3] = (ch & 0x30) >> 1;
245 nbits_val_oob[4] = (ch & 0xC0) >> 3;
255 nbits_val = (oob_event ? nbits_val_oob[ind_val] : nbits_val_neutron[ind_val]);
257 nbits_val_filled = 0;
260 int32_t nbits_val_to_fill = (nbits_val - nbits_val_filled);
261 if ((8 - nbits_ch_used) >= nbits_val_to_fill) {
262 *ptr_val[ind_val] |= ((ch >> nbits_ch_used) & ((1 << nbits_val_to_fill) - 1)) << nbits_val_filled;
263 nbits_val_filled = 0;
264 nbits_ch_used += nbits_val_to_fill;
267 *ptr_val[ind_val] |= (ch >> nbits_ch_used) << nbits_val_filled;
268 nbits_val_filled += (8 - nbits_ch_used);
272 }
while ((ind_val <
NVAL) && (nbits_ch_used < 8));
278 if (nbits_ch_used == 8)
282 if ((8 - nbits_ch_used) <= 2) {
283 dt |= (ch >> nbits_ch_used) << nbits_dt_filled;
284 nbits_dt_filled += (8 - nbits_ch_used);
285 }
else if ((ch & 0xC0) == 0xC0) {
286 dt |= ((ch & 0x3F) >> nbits_ch_used) << nbits_dt_filled;
287 nbits_dt_filled += (6 - nbits_ch_used);
289 dt |= (ch >> nbits_ch_used) << nbits_dt_filled;
290 nbits_dt_filled += (8 - nbits_ch_used);
302 auxillary_time += dt;
306 bool frame_start_event = (oob_en ? (oob_event && c == -2) : (
x == 0 &&
y == 0 && dt == -1));
308 if (oob_en || !frame_start_event) {
312 if (!use_tx_chopper &&
x == 0) {
316 if (use_tx_chopper &&
x == 1) {
324 if (primary_ok && auxillary_ok)
325 handler.addEvent(
x,
y,
static_cast<double>(primary_time) * scale_microsec,
326 static_cast<double>(auxillary_time) * scale_microsec);
330 if (frame_start_event) {
343 progress.update(loader.selected_position());