Implement monitor da00 format as fallback timing reference
Unit Testing / test (3.10) (push) Successful in 59s
Unit Testing / test (3.12) (push) Successful in 58s
Unit Testing / test (3.9) (push) Successful in 56s
Unit Testing / test (3.11) (push) Successful in 1m6s
Unit Testing / test (3.8) (push) Successful in 1m5s

This commit is contained in:
2026-05-19 09:43:32 +02:00
parent cfea82aa3f
commit 4149424ed0
2 changed files with 13 additions and 8 deletions
+5
View File
@@ -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)])
+8 -8
View File
@@ -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