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