diff --git a/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py b/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py index e4c406e1054de78c4a9aa7571160f843fd969f63..5c08bb9b19c166bcf94abf83083eb5f5b0209105 100644 --- a/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py +++ b/CAL/CalibrationCommon/lib/datacontainers/calibration_table.py @@ -1,7 +1,7 @@ import logging from datetime import datetime from re import fullmatch -from struct import iter_unpack +from struct import iter_unpack, pack from typing import BinaryIO from typing import List @@ -12,7 +12,10 @@ logger = logging.getLogger(__name__) __MAX_HEADER_LINES = 100 __HEADER_LINE_PATTERN = '(^[A-z]*\.[A-z]*\.[A-z]*\s=\s.*$)|(^[A-z]*\.[A-z]*\s=\s.*$)' - +__FREQUENCIES = 512 +__FLOATS_PER_FREQUENCY = 2 +__N_ANTENNAS_DUTCH = 96 +__N_ANTENNAS_INTERNATIONAL = 192 _ATTRIBUTE_NAME_TO_SERIALIZED_NAME = { 'observation_station': 'CalTableHeader.Observation.Station', 'observation_mode': 'CalTableHeader.Observation.Mode', @@ -50,19 +53,13 @@ def _extract_header(fstream: BinaryIO): value = value.strip() header[key] = value else: - logger.error('unrecognized line %s', line) - raise UnvalidFileException('unrecognized line %s' % line) + logger.error('unrecognized line \"%s\"', line) + raise UnvalidFileException('unrecognized line \"%s\"' % line) if len(header) == 0: raise UnvalidFileException('empty header') return header -__FREQUENCIES = 512 -__FLOATS_PER_FREQUENCY = 2 -__N_ANTENNAS_DUTCH = 96 -__N_ANTENNAS_INTERNATIONAL = 192 - - def parse_data(data_buffer): data = array_from_iter(map(lambda x: x[0], iter_unpack('d', data_buffer)), dtype=float) n_antennas = data.shape[0] // __FREQUENCIES // __FLOATS_PER_FREQUENCY @@ -108,7 +105,7 @@ class CalibrationTable: return calibration_table def __serialize_header(self, f_stream: BinaryIO): - f_stream.write(b'HeaderStart') + f_stream.write(b'HeaderStart\n') for key, value in asdict(self).items(): if key is 'data': @@ -118,17 +115,18 @@ class CalibrationTable: serialized_line = '{} = {}\n'.format(serialized_name, value).encode('utf8') f_stream.write(serialized_line) - f_stream.write(b'HeaderStop') + f_stream.write(b'HeaderStop\n') def __serialize_data(self, f_stream: BinaryIO): dimensions = list(self.data.shape) + [2] - data_flatten = empty_ndarray(dimensions, dtype=float64) - data_flatten[:, :, 0] = self.data.real - data_flatten[:, :, 1] = self.data.imag - data_flattened = data_flatten.flatten().tolist() - f_stream.write() - + data_reshaped = empty_ndarray(dimensions, dtype=float64) + data_reshaped[:, :, 0] = self.data.real + data_reshaped[:, :, 1] = self.data.imag + data_flattened = data_reshaped.flatten() + data_packed = pack('%sd' % len(data_flattened), *data_flattened) + f_stream.write(data_packed) 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)