From 10be3fb8ebb95635e31ba27e5686052fcb2e9ab6 Mon Sep 17 00:00:00 2001
From: mancini <mancini@astron.nl>
Date: Thu, 11 Jul 2019 17:04:31 +0200
Subject: [PATCH] SSB-47: loading calibration tables in directory

---
 .../lib/datacontainers/calibration_table.py   | 26 ++++++++++++++++---
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py b/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py
index 28f66249364..65b597a648b 100644
--- a/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py
+++ b/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py
@@ -5,8 +5,10 @@ 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
+from os import path
+from dataclasses import dataclass, asdict, field
+from numpy import empty as empty_ndarray, ndarray, fromiter as array_from_iter, float64, array_equal
+from glob import glob
 
 logger = logging.getLogger(__name__)
 
@@ -16,6 +18,8 @@ __FREQUENCIES = 512
 __FLOATS_PER_FREQUENCY = 2
 __N_ANTENNAS_DUTCH = 96
 __N_ANTENNAS_INTERNATIONAL = 192
+__CALIBRATION_TABLE_FILENAME_PATTERN = '*CalTable-???-???-???_???.dat'
+
 _ATTRIBUTE_NAME_TO_SERIALIZED_NAME = {
     'observation_station': 'CalTableHeader.Observation.Station',
     'observation_mode': 'CalTableHeader.Observation.Mode',
@@ -77,7 +81,7 @@ def parse_data(data_buffer):
     return complex_data
 
 
-@dataclass(init=True, repr=True, frozen=True)
+@dataclass(init=True, repr=True, frozen=True, eq=True)
 class CalibrationTable:
     observation_station: str
     observation_mode: str
@@ -89,7 +93,7 @@ class CalibrationTable:
     calibration_name: str
     calibration_date: datetime
     calibration_ppsdelay: List[int]
-    data: ndarray
+    data: ndarray = field(compare=False)
     comment: str = ''
 
     @staticmethod
@@ -131,11 +135,25 @@ class CalibrationTable:
             file_descriptor[uri] = self.data
         for key, value in asdict(self).items():
             if key is 'data':
+                # skipping field data
                 continue
             file_descriptor[uri].attrs[key] = value
         file_descriptor.flush()
 
+    def __eq__(self, other):
+        return super().__eq__(other) and array_equal(self.data, other.data)
+
+
     def store_to_file(self, file_path):
         with open(file_path, 'wb') as file_stream:
             self.__serialize_header(file_stream)
             self.__serialize_data(file_stream)
+
+
+def read_calibration_tables_in_directory(directory_path: str):
+    if not path.isdir(directory_path):
+        raise NotADirectoryError(directory_path)
+    files = path.join(directory_path, __CALIBRATION_TABLE_FILENAME_PATTERN)
+
+    return [CalibrationTable.load_from_file(file_path)
+            for file_path in glob(files, recursive=False)]
-- 
GitLab