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