From 4149424ed08a10da160ba7a40a4d6acb35a9be4c Mon Sep 17 00:00:00 2001 From: Artur Glavic Date: Tue, 19 May 2026 09:43:32 +0200 Subject: [PATCH] Implement monitor da00 format as fallback timing reference --- eos/event_data_types.py | 5 +++++ eos/file_reader.py | 16 ++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/eos/event_data_types.py b/eos/event_data_types.py index 2ccfbf6..d480ba8 100644 --- a/eos/event_data_types.py +++ b/eos/event_data_types.py @@ -29,6 +29,11 @@ class AmorTiming: chopperPhase: float tau: float +@dataclass +class DA00EventBuffer: + signal: np.ndarray + time: np.ndarray + # Structured datatypes used for event streams EVENT_TYPE = np.dtype([('tof', np.float64), ('pixelID', np.uint32), ('mask', np.int32)]) PACKET_TYPE = np.dtype([('start_index', np.uint32), ('time', np.int64)]) diff --git a/eos/file_reader.py b/eos/file_reader.py index d8e37c9..ad30f68 100644 --- a/eos/file_reader.py +++ b/eos/file_reader.py @@ -7,7 +7,6 @@ import sys import h5py import numpy as np import logging -import subprocess from datetime import datetime @@ -17,7 +16,7 @@ from orsopy.fileio.model_language import SampleModel from . import const, compat from .header import Header from .event_data_types import AmorGeometry, AmorTiming, AmorEventStream, LOG_TYPE, PACKET_TYPE, EVENT_TYPE, PULSE_TYPE, \ - PC_TYPE + PC_TYPE, DA00EventBuffer try: import zoneinfo @@ -75,7 +74,7 @@ class AmorHeader: data=('entry1/detector/data', None), # data group used to load events from trigger=('entry1/detector/trigger', float), - monitor=('entry1/detector/monitor', float), + monitor=('entry1/beam_monitor', None), # special data group (da00 flat-buffer scheme) proton_current=('entry1/detector/proton_current', float), acquisition_filter=('entry1/detector/acquisition_filter', int), ) @@ -147,6 +146,9 @@ class AmorHeader: return output, unit else: return output + elif hdfgrp.attrs.get('writer_module', None) == 'da00': + # da00 float-buffer stream data + return DA00EventBuffer(signal=hdfgrp['signal'][:], time=hdfgrp['time'][:]) elif dtype is str: return self.read_string(hdf_path) else: @@ -455,11 +457,11 @@ class AmorEventData(AmorHeader): events.pixelID = data_group['event_id'][self.first_index:self.last_index+1] events.mask = 0 + self._monitor = self.rv('monitor', default=None) pulses = self.read_chopper_trigger_stream(packets) current = self.read_proton_current_stream(packets) # read parameter logs not present in old files to ensure they are in self._log_keys if they exist - _monitor = self.rv('monitor', default=None) _acquisition_filter = self.rv('acquisition_filter', default=None) self.data = AmorEventStream(events, packets, pulses, current) @@ -519,10 +521,8 @@ class AmorEventData(AmorHeader): pulseTimeS = chopper1TriggerTime else: logging.critical(' No chopper trigger data available, using event steram instead, pulse filtering will fail!') - data_group = self.hdf[self.hdf_paths['data'][0]] - startTime = np.array(data_group['event_time_zero'][0], dtype=np.int64) - stopTime = np.array(data_group['event_time_zero'][-2], dtype=np.int64) - pulseTimeS = np.arange(startTime, stopTime, self.timing.tau*1e9, dtype=np.int64) + startTime = np.array(self._monitor.time[0], dtype=np.int64) + pulseTimeS = self._monitor.time pulses = np.recarray(pulseTimeS.shape, dtype=PULSE_TYPE) pulses.time = pulseTimeS pulses.monitor = 1. # default is monitor pulses as it requires no calculation