diff --git a/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py b/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py index d8932263df5079790e14cdd988f73c3224e8c53a..2d98e2fce13730e2e02ea49316c29fe2dd693b1f 100644 --- a/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py +++ b/tangostationcontrol/tangostationcontrol/integration_test/default/statistics/test_writer_sst.py @@ -46,6 +46,45 @@ class TestStatisticsWriterSST(BaseIntegrationTestCase): self.assertIsNotNone(self.recv_proxy.RCU_Band_Select_R) self.assertIsNotNone(self.recv_proxy.RCU_DTH_on_R) + def test_header_info(self): + """ Test whether the header info are inserted and collected in the proper way""" + with TemporaryDirectory() as tmpdir: + new_sys_argv = [ + sys.argv[0], + "--mode", "SST", + "--no-tango", + "--file", join( + dirname(dirname(dirname(dirname(__file__)))), + "test/statistics", "SDP_SST_statistics_packets.bin" + ), + "--output_dir", tmpdir + ] + + with mock.patch.object(entry.sys, 'argv', new_sys_argv): + with self.assertRaises(SystemExit): + entry.main() + + # check if file was written + self.assertTrue(isfile(f"{tmpdir}/SST_2021-09-20-12-17-40.h5")) + + # test statistics reader + new_sys_argv = [ + sys.argv[0], + "--files", f"{tmpdir}/SST_2021-09-20-12-17-40.h5", + "--start_time", "2021-09-20#07:40:08.937+00:00", + "--end_time", "2021-10-04#07:50:08.937+00:00" + ] + with mock.patch.object(reader.sys, 'argv', new_sys_argv): + stat_parser = reader.setup_stat_parser() + SSTstatistics = stat_parser.list_statistics() + self.assertIsNotNone(SSTstatistics) + stat = stat_parser.get_statistic( + '2021-09-20T12:17:40.000+00:00' + ) + self.assertIsNotNone(stat) + self.assertEqual("0.1", stat.station_version_id) + self.assertEqual("0.1", stat.writer_version_id) + def test_insert_tango_SST_statistics(self): self.assertEqual(DevState.ON, self.recv_proxy.state()) collector = StationSSTCollector(device=self.recv_proxy) diff --git a/tangostationcontrol/tangostationcontrol/statistics/reader.py b/tangostationcontrol/tangostationcontrol/statistics/reader.py index cb9370fd206440de37f31bdbaae7218f71470726..eb1594540554b443ec232bee33ffbc67a1cb4722 100644 --- a/tangostationcontrol/tangostationcontrol/statistics/reader.py +++ b/tangostationcontrol/tangostationcontrol/statistics/reader.py @@ -156,7 +156,7 @@ class statistics_data: # we will be creating potentially tens of thousands of these object. Using __slots__ makes them faster and uses less memory. At the cost of # having to list all self attributes here. - __slots__ = ("version_id", "timestamp", "station_id", "source_info_t_adc", "source_info_subband_calibrated_flag", "source_info_payload_error", + __slots__ = ("version_id", "station_version_id", "writer_version_id", "timestamp", "station_id", "source_info_t_adc", "source_info_subband_calibrated_flag", "source_info_payload_error", "source_info_payload_error", "source_info_payload_error", "source_info_nyquist_zone_index", "source_info_gn_index", "source_info_fsub_type", "source_info_beam_repositioning_flag", "source_info_antenna_band_index", "source_info__raw", "observation_id", "nof_statistics_per_packet", "nof_signal_inputs", "nof_bytes_per_statistic", "marker", "integration_interval_raw", @@ -169,6 +169,10 @@ class statistics_data: # get all the general header info self.version_id = file[group_key].attrs["version_id"] self.station_id = file[group_key].attrs["station_id"] + + # get software version info + self.station_version_id = file[group_key].attrs["station_version_id"] + self.writer_version_id = file[group_key].attrs["writer_version_id"] # convert string timestamp to datetime object self.timestamp = datetime.datetime.fromisoformat(file[group_key].attrs["timestamp"]) diff --git a/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION b/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION new file mode 100644 index 0000000000000000000000000000000000000000..49d59571fbf6e077eece30f8c418b6aad15e20b0 --- /dev/null +++ b/tangostationcontrol/tangostationcontrol/statistics/writer/VERSION @@ -0,0 +1 @@ +0.1 diff --git a/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py b/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py index 4ac9dd9d451ae77a93b0f5f0d848d4de138cfd8c..a22c909fd5ec461e449094003297c1adbda9e451 100644 --- a/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py +++ b/tangostationcontrol/tangostationcontrol/statistics/writer/hdf5.py @@ -10,6 +10,7 @@ from abc import ABC, abstractmethod from datetime import datetime, timedelta import logging +import os # python hdf5 import h5py @@ -33,6 +34,19 @@ __all__ = [ "SstHdf5Writer", "BstHdf5Writer", ] +def _get_lsc_version() -> str: + """ Retrieve the Lofar Station Control software version """ + filepath = os.path.join(os.path.realpath('../'), 'tangostationcontrol/VERSION') + with open(filepath) as f: + version = f.readline().strip() + return version or "" + +def _get_writer_version() -> str: + """ Retrieve the Statistics Writer software version """ + filepath = os.path.join(os.path.dirname(__file__), 'VERSION') + with open(filepath) as f: + version = f.readline().strip() + return version or "" class HDF5Writer(ABC): SST_MODE = "SST" @@ -67,6 +81,10 @@ class HDF5Writer(ABC): # writer is in (SST,XST,BST) self.mode = statistics_mode.upper() + # software version + self.station_version_id = _get_lsc_version() + self.writer_version_id = _get_writer_version() + # Set device if any, defaults to None self.device = device @@ -207,6 +225,10 @@ class HDF5Writer(ABC): timespec="milliseconds" ) + # store software version entries + header["station_version_id"] = self.station_version_id + header["writer_version_id"] = self.writer_version_id + # Stores the header of the packet received for this matrix as a list of # attributes for k, v in header.items():