def test_write_virtual(mock_fxe_raw_run): with TemporaryDirectory() as td: new_file = osp.join(td, 'test.h5') with RunDirectory(mock_fxe_raw_run) as run: run.write_virtual(new_file) assert_isfile(new_file) with h5py.File(new_file) as f: ds = f['CONTROL/SPB_XTD9_XGM/DOOCS/MAIN/beamPosition/ixPos/value'] assert ds.is_virtual with H5File(new_file) as f: np.testing.assert_array_equal( f.train_ids, np.arange(10000, 10480, dtype=np.uint64)) assert 'SPB_XTD9_XGM/DOOCS/MAIN' in f.control_sources assert 'SPB_XTD9_XGM/DOOCS/MAIN:output' in f.instrument_sources s = f.get_series('SPB_XTD9_XGM/DOOCS/MAIN', 'beamPosition.ixPos.value') # This should have concatenated the two sequence files (400 + 80) assert len(s) == 480 a = f.get_array('SPB_XTD9_XGM/DOOCS/MAIN:output', 'data.intensityTD') assert a.shape == (480, 1000)
def test_iterate_trains(mock_agipd_data): with H5File(mock_agipd_data) as f: for train_id, data in islice(f.trains(), 10): assert train_id in range(10000, 10250) assert 'SPB_DET_AGIPD1M-1/DET/7CH0:xtdf' in data.keys() assert len(data) == 1 assert 'image.data' in data['SPB_DET_AGIPD1M-1/DET/7CH0:xtdf']
def test_iterate_trains_fxe(mock_fxe_control_data): with H5File(mock_fxe_control_data) as f: for train_id, data in islice(f.trains(), 10): assert train_id in range(10000, 10400) assert 'SA1_XTD2_XGM/DOOCS/MAIN' in data.keys() assert 'beamPosition.ixPos.value' in data[ 'SA1_XTD2_XGM/DOOCS/MAIN']
def test_iterate_file_select_trains(mock_fxe_control_data): with H5File(mock_fxe_control_data) as f: tids = [tid for (tid, _) in f.trains(train_range=by_id[:10003])] assert tids == [10000, 10001, 10002] tids = [tid for (tid, _) in f.trains(train_range=by_index[-2:])] assert tids == [10398, 10399]
def test_filter_device(): dev_filter_1 = { 'SPB_XTD9_XGM/XGM/DOOCS': {'pulseEnergy.pulseEnergy.value', 'current.right.output.value'} } dev_filter_2 = {''} dev_filter_3 = { 'SPB_XTD9_XGM/XGM/DOOCS': {}, 'SA1_XTD2_XGM/XGM/DOOCS': {'pulseEnergy.pulseEnergy.value'} } with H5File(RUNPATH_SLOW + '/RAW-R0115-DA01-S00000.h5') as f: _, data = f.train_from_index(500, devices=dev_filter_1) assert len(data) == 1 assert 'SPB_XTD9_XGM/XGM/DOOCS' in data xgm = data['SPB_XTD9_XGM/XGM/DOOCS'] assert len(xgm) == 3 # metadata, pulseEnergy, current assert 'pulseEnergy.pulseEnergy.value' in xgm # assert xgm['pulseEnergy.pulseEnergy.value'] == approx(0.06392462, rel=1e-7) # assert xgm['current.right.output.value'] == approx(-7.968561e-15, rel=1e-6) _, data = f.train_from_index(0, devices=dev_filter_2) assert len(data) == 0 _, data = f.train_from_index(0, devices=dev_filter_3) assert len(data) == 2 assert len(data['SPB_XTD9_XGM/XGM/DOOCS']) == 77 assert len(data['SA1_XTD2_XGM/XGM/DOOCS']) == 2
def test_iterate_trains(): with H5File(FILEPATH) as f: for train_id, data in f.trains(): print(train_id) assert train_id in range(1455918683, 1455918703) assert 'FXE_DET_LPD1M-1/DET/0CH0:xtdf' in data.keys() assert len(data) == 1 assert len(data['FXE_DET_LPD1M-1/DET/0CH0:xtdf']) == 21
def test_get_train_per_index(): with H5File(FILEPATH) as f: train, data = f.train_from_index(0) assert data is not None assert train == 1455918683 with pytest.raises(ValueError) as info: data, _, _ = f.train_from_index(20) # index out of range print(info)
def test_file_get_array(mock_fxe_control_data): with H5File(mock_fxe_control_data) as f: arr = f.get_array('FXE_XAD_GEC/CAM/CAMERA:daqOutput', 'data.image.pixels') assert isinstance(arr, DataArray) assert arr.dims == ('trainId', 'dim_0', 'dim_1') assert arr.shape == (400, 255, 1024) assert arr.coords['trainId'][0] == 10000
def test_lsxfel_file(mock_lpd_data, capsys): with H5File(mock_lpd_data) as f: img_ds, index = lsxfel.find_image(f) assert img_ds.ndim == 4 assert index['first'].shape == (480, ) lsxfel.summarise_file(mock_lpd_data) out, err = capsys.readouterr() assert "480 trains, 128 frames/train" in out
def test_read_metadata(): with H5File(FILEPATH) as f: _, data1 = f.train_from_index(0) sleep(2) _, data2 = f.train_from_index(0) assert 'metadata' in data1['FXE_DET_LPD1M-1/DET/0CH0:xtdf'] assert data1['FXE_DET_LPD1M-1/DET/0CH0:xtdf']['metadata']['timestamp']['tid'] == 1455918683 assert data1['FXE_DET_LPD1M-1/DET/0CH0:xtdf']['metadata']['timestamp']['sec'] != data2['FXE_DET_LPD1M-1/DET/0CH0:xtdf']['metadata']['timestamp']['sec'] assert data1['FXE_DET_LPD1M-1/DET/0CH0:xtdf']['metadata']['source'] == 'FXE_DET_LPD1M-1/DET/0CH0:xtdf'
def test_get_train_per_id(): with H5File(FILEPATH) as f: train, data = f.train_from_id(1455918700) print(data) assert data is not None assert train == 1455918700 with pytest.raises(KeyError) as info: data = f.train_from_id(1234) # train id not in file print(info)
def test_get_train_bad_device_name(mock_spb_control_data_badname): # Check that we can handle devices which don't have the standard Karabo # name structure A/B/C. with H5File(mock_spb_control_data_badname) as f: train_id, data = f.train_from_id(10004) assert train_id == 10004 assert 'SPB_IRU_SIDEMIC_CAM:daqOutput' in data assert 'data.image.dims' in data['SPB_IRU_SIDEMIC_CAM:daqOutput'] dims = data['SPB_IRU_SIDEMIC_CAM:daqOutput']['data.image.dims'] assert list(dims) == [1000, 1000]
def test_file_get_array_missing_trains(mock_sa3_control_data): with H5File(mock_sa3_control_data) as f: sel = f.select_trains(by_index[:6]) arr = sel.get_array('SA3_XTD10_IMGFEL/CAM/BEAMVIEW2:daqOutput', 'data.image.dims') assert isinstance(arr, DataArray) assert arr.dims == ('trainId', 'dim_0') assert arr.shape == (3, 2) np.testing.assert_array_less(arr.coords['trainId'], 10006) np.testing.assert_array_less(10000, arr.coords['trainId'])
def test_file_get_array_control_roi(mock_sa3_control_data): with H5File(mock_sa3_control_data) as f: sel = f.select_trains(by_index[:6]) arr = sel.get_array( 'SA3_XTD10_VAC/DCTRL/D6_APERT_IN_OK', 'interlock.a1.AActCommand.value', roi=by_index[:25], ) assert isinstance(arr, DataArray) assert arr.shape == (6, 25) assert arr.coords['trainId'][0] == 10000
def test_iterate_trains_require_all(mock_sa3_control_data): with H5File(mock_sa3_control_data) as f: trains_iter = f.trains(devices=[('*/CAM/BEAMVIEW:daqOutput', 'data.image.dims')], require_all=True) tids = [t for (t, _) in trains_iter] assert tids == [] trains_iter = f.trains(devices=[('*/CAM/BEAMVIEW:daqOutput', 'data.image.dims')], require_all=False) tids = [t for (t, _) in trains_iter] assert tids != []
def test_file_get_series_instrument(mock_agipd_data): with H5File(mock_agipd_data) as f: s = f.get_series('SPB_DET_AGIPD1M-1/DET/7CH0:xtdf', 'header.linkId') assert isinstance(s, pd.Series) assert len(s) == 250 assert s.index[0] == 10000 # Multiple readings per train s2 = f.get_series('SPB_DET_AGIPD1M-1/DET/7CH0:xtdf', 'image.status') assert isinstance(s2, pd.Series) assert isinstance(s2.index, pd.MultiIndex) assert len(s2) == 16000 assert len(s2.loc[10000:10004]) == 5 * 64
def test_get_file_info(): with H5File(FILEPATH) as f: trains = f.train_ids train_count = len(trains) devices = f.devices sources = f.sources print('train ids:', trains) print('count: ', train_count) print('devices: ', devices) print('data_sources: ', sources) assert 1455918683 in trains assert 1234 not in trains assert train_count == 20 assert 'FXE_DET_LPD1M-1/DET/0CH0:xtdf/detector' in devices assert 'INSTRUMENT/FXE_DET_LPD1M-1/DET/0CH0:xtdf/detector' in sources
def test_iterate_trains_select_keys(mock_fxe_control_data): sel = { 'SA1_XTD2_XGM/DOOCS/MAIN': { 'beamPosition.ixPos.value', 'beamPosition.ixPos.timestamp', } } with H5File(mock_fxe_control_data) as f: for train_id, data in islice(f.trains(devices=sel), 10): assert train_id in range(10000, 10400) assert 'SA1_XTD2_XGM/DOOCS/MAIN' in data.keys() assert 'beamPosition.ixPos.value' in data[ 'SA1_XTD2_XGM/DOOCS/MAIN'] assert 'beamPosition.ixPos.timestamp' in data[ 'SA1_XTD2_XGM/DOOCS/MAIN'] assert 'beamPosition.iyPos.value' not in data[ 'SA1_XTD2_XGM/DOOCS/MAIN'] assert 'SA3_XTD10_VAC/TSENS/S30160K' not in data
def test_write_selected(mock_fxe_raw_run): with TemporaryDirectory() as td: new_file = osp.join(td, 'test.h5') with RunDirectory(mock_fxe_raw_run) as run: run.select('SPB_XTD9_XGM/*').write(new_file) assert_isfile(new_file) with H5File(new_file) as f: assert f.control_sources == {'SPB_XTD9_XGM/DOOCS/MAIN'} assert f.instrument_sources == {'SPB_XTD9_XGM/DOOCS/MAIN:output'} s = f.get_series('SPB_XTD9_XGM/DOOCS/MAIN', 'beamPosition.ixPos.value') # This should have concatenated the two sequence files (400 + 80) assert len(s) == 480 a = f.get_array('SPB_XTD9_XGM/DOOCS/MAIN:output', 'data.intensityTD') assert a.shape == (480, 1000)
def test_file_get_series_instrument(mock_agipd_data): with H5File(mock_agipd_data) as f: s = f.get_series('SPB_DET_AGIPD1M-1/DET/7CH0:xtdf', 'header.linkId') assert isinstance(s, pd.Series) assert len(s) == 250 assert s.index[0] == 10000 # Multiple readings per train s2 = f.get_series('SPB_DET_AGIPD1M-1/DET/7CH0:xtdf', 'image.status') assert isinstance(s2, pd.Series) assert isinstance(s2.index, pd.MultiIndex) assert len(s2) == 16000 assert len(s2.loc[10000:10004]) == 5 * 64 sel = f.select_trains(by_index[5:10]) s3 = sel.get_series('SPB_DET_AGIPD1M-1/DET/7CH0:xtdf', 'image.status') assert isinstance(s3, pd.Series) assert isinstance(s3.index, pd.MultiIndex) assert len(s3) == 5 * 64 np.testing.assert_array_equal(s3.index.get_level_values(0), np.arange(10005, 10010).repeat(64))
def test_detector_info_oldfmt(mock_agipd_data): with H5File(mock_agipd_data) as f: di = f.detector_info('SPB_DET_AGIPD1M-1/DET/7CH0:xtdf') assert di['dims'] == (512, 128) assert di['frames_per_train'] == 64 assert di['total_frames'] == 16000
def test_detector_info(mock_lpd_data): with H5File(mock_lpd_data) as f: di = f.detector_info() assert di['dims'] == (256, 256) assert di['frames_per_train'] == 128 assert di['total_frames'] == 128 * 480
def test_detector_info_oldfmt(mock_agipd_data): with H5File(mock_agipd_data) as f: di = f.detector_info() assert di['dims'] == (512, 128) assert di['frames_per_train'] == 64 assert di['total_frames'] == 16000
def test_file_get_series_control(mock_fxe_control_data): with H5File(mock_fxe_control_data) as f: s = f.get_series('SA1_XTD2_XGM/DOOCS/MAIN', "beamPosition.iyPos.value") assert isinstance(s, pd.Series) assert len(s) == 400 assert s.index[0] == 10000
def test_train_info(mock_lpd_data, capsys): with H5File(mock_lpd_data) as f: f.train_info(10004) out, err = capsys.readouterr() assert "Devices" in out assert "FXE_DET_LPD1M-1/DET/0CH0:xtdf" in out
def test_open_file_format_1_0(mock_sa3_control_data_fmt_1_0): f = H5File(mock_sa3_control_data_fmt_1_0) file_access = f.files[0] assert file_access.format_version == '1.0' assert 'SA3_XTD10_VAC/TSENS/S30180K' in f.control_sources
def test_detector_info(mock_lpd_data): with H5File(mock_lpd_data) as f: di = f.detector_info('FXE_DET_LPD1M-1/DET/0CH0:xtdf') assert di['dims'] == (256, 256) assert di['frames_per_train'] == 128 assert di['total_frames'] == 128 * 480
def test_H5File(): f = H5File(FILEPATH) assert f.file.filename == FILEPATH assert len(f.train_ids) == 20 f.close()