diff --git a/README.md b/README.md index cbd4929a355eaf3330d0429e0e9fe522c571b963..442afc5f8db32a60c56f502aab3bfcc05053f18b 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ tox -e debug tests.requests.test_prometheus ``` ## Releasenotes +- 0.15.2 - Statistics filenames: added antennafield, moved subband to the end - 0.15.1 - Infer device names and default port from the specified antenna-field name - 0.15.0 - Add all_connected method to MultiStationObservation - 0.14.8 - Optimizing hdf dictionary writing to cause less memory and IO overhead diff --git a/VERSION b/VERSION index e815b861f023432f2500015179faa26fdaba7f9e..4312e0d0cae3a96e9f4a9be98e59e8468f39e1a8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.15.1 +0.15.2 diff --git a/lofar_station_client/statistics/writer/hdf5.py b/lofar_station_client/statistics/writer/hdf5.py index 20da109d14b41a3c2b30a0ba3084e5ae5f2f19dd..21c113741c0909b77a66f93e680ad4dba9a5484a 100644 --- a/lofar_station_client/statistics/writer/hdf5.py +++ b/lofar_station_client/statistics/writer/hdf5.py @@ -165,6 +165,13 @@ class HDF5Writer(ABC): self.digitalbeam_device = devices["digitalbeam"] self.stationmanager_device = devices["stationmanager"] + # Distill antennafield name, if any + self.antennafield = ( + self.antennafield_device.dev_name().split("/")[2] + if self.antennafield_device + else "unknown" + ) + # By default, select all the values from SDP self.antenna_selection: List[int] = None self.antenna_sdp_mapping = None @@ -452,7 +459,9 @@ class HDF5Writer(ABC): def next_filename(self, timestamp, suffix=".h5"): """Returns next h5 file based on timestamp""" time_str = str(timestamp.strftime("%Y-%m-%d-%H-%M-%S")) - return f"{self.file_location}/{self.mode}_{time_str}{suffix}" + return ( + f"{self.file_location}/{self.mode}_{time_str}_{self.antennafield}{suffix}" + ) def process_packet(self, packet): """ @@ -616,8 +625,10 @@ class XstHdf5Writer(HDF5Writer): def next_filename(self, timestamp, suffix=".h5"): time_str = str(timestamp.strftime("%Y-%m-%d-%H-%M-%S")) return ( - f"{self.file_location}/{self.mode}_SB{self.subband_index}_" - f"{time_str}{suffix}" + f"{self.file_location}/" + f"{self.mode}_{time_str}" + f"_{self.antennafield}_SB{self.subband_index}" + f"{suffix}" ) def hdf5_matrix_header(self, statistics_packet_header: dict) -> dict: diff --git a/tests/statistics/test_writer.py b/tests/statistics/test_writer.py index 762ff270457a685cf6a44ea1aa14c88ea5dbaf95..b20654ecbd937f9f660546f7d098123e9de32f24 100644 --- a/tests/statistics/test_writer.py +++ b/tests/statistics/test_writer.py @@ -62,7 +62,7 @@ class TestStatisticsReaderWriterSST(TestStatisticsReaderWriter): """TestStatistics class for SST-mode""" def _run_writer_reader( - self, tmpdir: str, writer_argv: list + self, tmpdir: str, writer_argv: list, antennafield: str = "LBA" ) -> Tuple[StatisticsData, StatisticsFileHeader]: """Run the statistics writer with the given arguments, and read and return the output.""" @@ -84,13 +84,13 @@ class TestStatisticsReaderWriterSST(TestStatisticsReaderWriter): entry.main() # check if file was written - self.assertTrue(isfile(f"{tmpdir}/SST_2021-09-20-12-17-40.h5")) + self.assertTrue(isfile(f"{tmpdir}/SST_2021-09-20-12-17-40_{antennafield}.h5")) # default arguments for statistics reader default_reader_sys_argv = [ sys.argv[0], "--files", - f"{tmpdir}/SST_2021-09-20-12-17-40.h5", + f"{tmpdir}/SST_2021-09-20-12-17-40_{antennafield}.h5", "--start_time", "2021-09-20#07:40:08.937+00:00", "--end_time", @@ -145,7 +145,7 @@ class TestStatisticsReaderWriterSST(TestStatisticsReaderWriter): "--no-tango", ] - _ = self._run_writer_reader(tmpdir, writer_argv) + _ = self._run_writer_reader(tmpdir, writer_argv, antennafield="unknown") def test_SST_statistics_with_device_in_off(self): with TemporaryDirectory() as tmpdir: @@ -198,13 +198,13 @@ class TestStatisticsReaderWriterBST(TestStatisticsReaderWriter): entry.main() # check if file was written - self.assertTrue(isfile(f"{tmpdir}/BST_2022-05-20-11-08-44.h5")) + self.assertTrue(isfile(f"{tmpdir}/BST_2022-05-20-11-08-44_LBA.h5")) # default arguments for statistics reader default_reader_sys_argv = [ sys.argv[0], "--files", - f"{tmpdir}/BST_2022-05-20-11-08-44.h5", + f"{tmpdir}/BST_2022-05-20-11-08-44_LBA.h5", "--start_time", "2021-09-20#07:40:08.937+00:00", "--end_time", @@ -252,7 +252,7 @@ class TestStatisticsReaderWriterBST(TestStatisticsReaderWriter): entry.main() # check if file was written - self.assertTrue(isfile(f"{tmpdir}/BST_2022-05-20-11-08-44.h5")) + self.assertTrue(isfile(f"{tmpdir}/BST_2022-05-20-11-08-44_LBA.h5")) class TestStatisticsWriterXST(TestStatisticsReaderWriter): @@ -275,10 +275,12 @@ class TestStatisticsWriterXST(TestStatisticsReaderWriter): entry.main() # check if file was written - self.assertTrue(isfile(f"{tmpdir}/XST_SB102_2021-09-13-13-21-32.h5")) + self.assertTrue( + isfile(f"{tmpdir}/XST_2021-09-13-13-21-32_LBA_SB102.h5") + ) # validate HDF5 content - with h5py.File(f"{tmpdir}/XST_SB102_2021-09-13-13-21-32.h5") as f: + with h5py.File(f"{tmpdir}/XST_2021-09-13-13-21-32_LBA_SB102.h5") as f: # validate header self.assertIn("station_version", dict(f.attrs)) self.assertIn("writer_version", dict(f.attrs)) @@ -324,8 +326,12 @@ class TestStatisticsWriterXST(TestStatisticsReaderWriter): entry.main() # check if files were written - self.assertTrue(isfile(f"{tmpdir}/XST_SB102_2021-09-13-13-21-32.h5")) - self.assertTrue(isfile(f"{tmpdir}/XST_SB103_2021-09-13-13-21-32.h5")) + self.assertTrue( + isfile(f"{tmpdir}/XST_2021-09-13-13-21-32_LBA_SB102.h5") + ) + self.assertTrue( + isfile(f"{tmpdir}/XST_2021-09-13-13-21-32_LBA_SB103.h5") + ) def test_xst_with_antennafield(self): with TemporaryDirectory() as tmpdir: @@ -348,10 +354,12 @@ class TestStatisticsWriterXST(TestStatisticsReaderWriter): entry.main() # check if file was written - self.assertTrue(isfile(f"{tmpdir}/XST_SB102_2021-09-13-13-21-32.h5")) + self.assertTrue( + isfile(f"{tmpdir}/XST_2021-09-13-13-21-32_LBA_SB102.h5") + ) # validate HDF5 content - with h5py.File(f"{tmpdir}/XST_SB102_2021-09-13-13-21-32.h5") as f: + with h5py.File(f"{tmpdir}/XST_2021-09-13-13-21-32_LBA_SB102.h5") as f: # check extra header fields provided by the AntennaField self.assertIn("antenna_names", dict(f.attrs)) self.assertIn("antenna_quality", dict(f.attrs)) diff --git a/tests/test_devices.py b/tests/test_devices.py index c0a0bee77dbd17be4465db3d089044f069b7217f..e11cc9b89bb1200806a061404fe717974ba87010 100644 --- a/tests/test_devices.py +++ b/tests/test_devices.py @@ -306,6 +306,9 @@ class FakeAntennaFieldDeviceProxy: def name(self): return self._name + def dev_name(self): + return self._name + class FakeOffAntennaFieldDeviceProxy: """DeviceProxy that mocks access to an Off AntennaField device.""" @@ -316,6 +319,9 @@ class FakeOffAntennaFieldDeviceProxy: def name(self): return self._name + def dev_name(self): + return self._name + def __getattr__(self, attrname): raise DevFailed("Device is off")