Files
eos/tests/mock_data.py

65 lines
2.4 KiB
Python

"""
Generate a mock dataset in memory for running unit tests.
"""
import h5py
import numpy as np
MOCK_METADATA = {
'title': 'Testdata',
'proposal_id': 'none',
'user/name': 'test user',
'user/email': 'test@user.de',
'sample/name': 'test sample',
'sample/model': 'air | Fe 12 | Si',
'Amor/source/name': 'SINQ',
'start_time': '2025-01-01 00:00:01',
}
MOCK_META_TYPED = {
'Amor/chopper/pair_separation': (1000.0, np.float32),
'Amor/detector/transformation/distance': (4000.0, np.float64),
'Amor/instrument_control_parameters/kappa': (1000.0, np.float64),
'Amor/instrument_control_parameters/kappa_offset': (1000.0, np.float64),
'Amor/instrument_control_parameters/div': (1.6, np.float64),
'Amor/chopper/ch1_trigger_phase': (-9.1, np.float64),
'Amor/chopper/ch2_trigger_phase': (6.75, np.float64),
'Amor/chopper/ch2_trigger/event_time_zero': ([0.0]*10, np.uint64),
'Amor/chopper/ch2_trigger/event_time_offset': ([0.0]*10, np.uint32),
'Amor/chopper/rotation_speed': (500.0, np.float64),
'Amor/chopper/phase': (0.0, np.float64),
'Amor/polarization/configuration/value': (0.0, np.float64),
}
def mock_data(mu=1.0, nu=2.0):
hdf = h5py.File.in_memory() # requires h5py >=3.13
ds = hdf.create_group('entry1')
for key, value in MOCK_METADATA.items():
ds.create_dataset(key, data=np.array([value.encode('utf-8')]))
for key, (value, dtype) in MOCK_META_TYPED.items():
if type(value) is list:
ds.create_dataset(key, data=np.array(value), dtype=dtype)
else:
ds.create_dataset(key, data=np.array([value]), dtype=dtype)
ds.create_dataset('Amor/instrument_control_parameters/mu', np.array([mu]), dtype=np.float64)
ds.create_dataset('Amor/instrument_control_parameters/nu', np.array([nu]), dtype=np.float64)
return hdf
def compare_with_real_data(fname):
hdf = h5py.File(fname, 'r')
ds = hdf['entry1']
for key, value in MOCK_METADATA.items():
try:
ds[key][0].decode('utf-8')
except KeyError:
print(f'/entry1/{key} does not exist in file')
for key, (value, dtype) in MOCK_META_TYPED.items():
try:
item = ds[key]
except KeyError:
print(f'/entry1/{key} does not exist in file')
else:
if item.dtype != dtype:
print(f'/entry1/{key} does not match {dtype}, dataset is {item.dtype}')