From 74748c4e47f8d09aae08c97f932c37079e4c7b55 Mon Sep 17 00:00:00 2001 From: mancini <mancini@astron.nl> Date: Thu, 11 Jul 2019 16:03:55 +0200 Subject: [PATCH] SSB-47: implemented storing in hdf5 file --- .../lib/datacontainers/calibration_table.py | 11 +++++++++- .../test/t_calibration_table.py | 21 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py b/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py index 5c08bb9b19c..28f66249364 100644 --- a/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py +++ b/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py @@ -4,7 +4,7 @@ from re import fullmatch from struct import iter_unpack, pack from typing import BinaryIO from typing import List - +from h5py import File from dataclasses import dataclass, asdict from numpy import empty as empty_ndarray, ndarray, fromiter as array_from_iter, float64 @@ -126,6 +126,15 @@ class CalibrationTable: data_packed = pack('%sd' % len(data_flattened), *data_flattened) f_stream.write(data_packed) + def store_to_hdf(self, file_descriptor: File, uri: str): + if uri not in file_descriptor: + file_descriptor[uri] = self.data + for key, value in asdict(self).items(): + if key is 'data': + continue + file_descriptor[uri].attrs[key] = value + file_descriptor.flush() + def store_to_file(self, file_path): with open(file_path, 'wb') as file_stream: self.__serialize_header(file_stream) diff --git a/CAL/CalibrationCommon/test/t_calibration_table.py b/CAL/CalibrationCommon/test/t_calibration_table.py index f833e331913..4f6de069da7 100644 --- a/CAL/CalibrationCommon/test/t_calibration_table.py +++ b/CAL/CalibrationCommon/test/t_calibration_table.py @@ -1,8 +1,11 @@ import unittest from lofar.calibration.common.datacontainers.calibration_table import CalibrationTable, UnvalidFileException - +from h5py import File as H5File import logging from tempfile import NamedTemporaryFile +from numpy.testing import assert_array_equal +from numpy import array + CALIBRATION_TABLE_FILENAME = 't_calibration_table.in_CalTable-401-HBA-110_190.dat' @@ -29,6 +32,22 @@ class TestCalibrationTable(unittest.TestCase): stored_calibration_table = CalibrationTable.load_from_file(temp_file.name) self.assertEqual(test_calibration_table.observation_station, stored_calibration_table.observation_station) + assert_array_equal(test_calibration_table.data, + stored_calibration_table.data) + + def test_storing_to_hdf(self): + with NamedTemporaryFile('w+b') as temp_file: + h5_file = H5File(temp_file.name, 'w') + test_calibration_table = CalibrationTable.load_from_file(CALIBRATION_TABLE_FILENAME) + + test_calibration_table.store_to_hdf(h5_file, '/calibration_table') + h5_file.close() + h5_file = H5File(temp_file.name, 'r') + self.assertEqual( + h5_file['/calibration_table'].attrs['observation_station'], + 'CS401' + ) + assert_array_equal(array(h5_file['/calibration_table']), test_calibration_table.data) if __name__ == '__main__': -- GitLab