diff --git a/csaxs_bec/devices/epics/eiger9m_csaxs.py b/csaxs_bec/devices/epics/eiger9m_csaxs.py index 3e818a3..f7b407f 100644 --- a/csaxs_bec/devices/epics/eiger9m_csaxs.py +++ b/csaxs_bec/devices/epics/eiger9m_csaxs.py @@ -163,15 +163,15 @@ class Eiger9MSetup(CustomDetectorMixin): def prepare_data_backend(self) -> None: """Prepare the data backend for the scan""" - self.parent.filepath = self.parent.filewriter.compile_full_filename( - f"{self.parent.name}.h5" - ) - self.filepath_exists(self.parent.filepath) + self.parent.filepath.set( + self.parent.filewriter.compile_full_filename(f"{self.parent.name}.h5") + ).wait() + self.filepath_exists(self.parent.filepath.get()) self.stop_detector_backend() try: self.std_client.start_writer_async( { - "output_file": self.parent.filepath, + "output_file": self.parent.filepath.get(), "n_images": int( self.parent.scaninfo.num_points * self.parent.scaninfo.frames_per_trigger ), @@ -198,6 +198,10 @@ class Eiger9MSetup(CustomDetectorMixin): def on_unstage(self) -> None: """Unstage the detector""" + pass + + def on_complete(self) -> None: + """Complete the detector""" self.finished(timeout=self.parent.TIMEOUT_FOR_SIGNALS) self.publish_file_location(done=True, successful=True) diff --git a/csaxs_bec/devices/epics/falcon_csaxs.py b/csaxs_bec/devices/epics/falcon_csaxs.py index 83ddb6c..0ab1018 100644 --- a/csaxs_bec/devices/epics/falcon_csaxs.py +++ b/csaxs_bec/devices/epics/falcon_csaxs.py @@ -177,10 +177,10 @@ class FalconSetup(CustomDetectorMixin): def prepare_data_backend(self) -> None: """Prepare data backend for acquisition""" - self.parent.filepath = self.parent.filewriter.compile_full_filename( - f"{self.parent.name}.h5" - ) - file_path, file_name = os.path.split(self.parent.filepath) + self.parent.filepath.set( + self.parent.filewriter.compile_full_filename(f"{self.parent.name}.h5") + ).wait() + file_path, file_name = os.path.split(self.parent.filepath.get()) self.parent.hdf5.file_path.put(file_path) self.parent.hdf5.file_name.put(file_name) self.parent.hdf5.file_template.put("%s%s") @@ -214,6 +214,10 @@ class FalconSetup(CustomDetectorMixin): def on_unstage(self) -> None: """Unstage detector and backend""" + pass + + def on_complete(self) -> None: + """Complete detector and backend""" self.finished(timeout=self.parent.TIMEOUT_FOR_SIGNALS) self.publish_file_location(done=True, successful=True) diff --git a/csaxs_bec/devices/epics/mcs_csaxs.py b/csaxs_bec/devices/epics/mcs_csaxs.py index fa355a2..2969a85 100644 --- a/csaxs_bec/devices/epics/mcs_csaxs.py +++ b/csaxs_bec/devices/epics/mcs_csaxs.py @@ -187,6 +187,10 @@ class MCSSetup(CustomDetectorMixin): def on_unstage(self) -> None: """Unstage detector""" + pass + + def on_complete(self) -> None: + """Complete detector""" self.finished(timeout=self.parent.TIMEOUT_FOR_SIGNALS) def finished(self, timeout: int = 5) -> None: diff --git a/csaxs_bec/devices/epics/pilatus_csaxs.py b/csaxs_bec/devices/epics/pilatus_csaxs.py index 6330a98..b4f8d09 100644 --- a/csaxs_bec/devices/epics/pilatus_csaxs.py +++ b/csaxs_bec/devices/epics/pilatus_csaxs.py @@ -127,7 +127,9 @@ class PilatusSetup(CustomDetectorMixin): self.stop_detector_backend() - self.parent.filepath = self.parent.filewriter.compile_full_filename("pilatus_2.h5") + self.parent.filepath.set( + self.parent.filewriter.compile_full_filename("pilatus_2.h5") + ).wait() self.parent.cam.file_path.put("/dev/shm/zmq/") self.parent.cam.file_name.put( f"{self.parent.scaninfo.username}_2_{self.parent.scaninfo.scan_number:05d}" @@ -320,6 +322,10 @@ class PilatusSetup(CustomDetectorMixin): def on_unstage(self) -> None: """Unstage the detector""" + pass + + def on_complete(self) -> None: + """Complete the scan""" self.finished(timeout=self.parent.TIMEOUT_FOR_SIGNALS) self.publish_file_location( done=True, successful=True, metadata={"input_path": self.parent.filepath_raw} diff --git a/tests/tests_devices/test_eiger9m_csaxs.py b/tests/tests_devices/test_eiger9m_csaxs.py index a8c8a89..04af331 100644 --- a/tests/tests_devices/test_eiger9m_csaxs.py +++ b/tests/tests_devices/test_eiger9m_csaxs.py @@ -225,7 +225,7 @@ def test_stage( mock_det.stopped = stopped mock_det.cam.detector_state._read_pv.mock_data = detector_state with mock.patch.object(mock_det.custom_prepare, "prepare_data_backend") as mock_prep_fw: - mock_det.filepath = scaninfo["filepath"] + mock_det.filepath.set(scaninfo["filepath"]).wait() if expected_exception: with pytest.raises(Exception): mock_det.timeout = 0.1 @@ -314,7 +314,7 @@ def test_prepare_detector_backend(mock_det, scaninfo, daq_status, expected_excep @pytest.mark.parametrize("stopped, expected_exception", [(False, False), (True, True)]) -def test_unstage(mock_det, stopped, expected_exception): +def test_complete(mock_det, stopped, expected_exception): with ( mock.patch.object(mock_det.custom_prepare, "finished") as mock_finished, mock.patch.object( @@ -323,10 +323,10 @@ def test_unstage(mock_det, stopped, expected_exception): ): mock_det.stopped = stopped if expected_exception: - mock_det.unstage() + mock_det.complete() assert mock_det.stopped is True else: - mock_det.unstage() + mock_det.complete() mock_finished.assert_called_once() mock_publish_file_location.assert_called_with(done=True, successful=True) assert mock_det.stopped is False @@ -350,7 +350,7 @@ def test_stop_detector_backend(mock_det): ) def test_publish_file_location(mock_det, scaninfo): mock_det.scaninfo.scan_id = scaninfo["scan_id"] - mock_det.filepath = scaninfo["filepath"] + mock_det.filepath.set(scaninfo["filepath"]).wait() mock_det.custom_prepare.publish_file_location( done=scaninfo["done"], successful=scaninfo["successful"] ) diff --git a/tests/tests_devices/test_falcon_csaxs.py b/tests/tests_devices/test_falcon_csaxs.py index 18abab0..d6066fc 100644 --- a/tests/tests_devices/test_falcon_csaxs.py +++ b/tests/tests_devices/test_falcon_csaxs.py @@ -198,7 +198,7 @@ def test_prepare_data_backend(mock_det, scaninfo): ) def test_publish_file_location(mock_det, scaninfo): mock_det.scaninfo.scan_id = scaninfo["scan_id"] - mock_det.filepath = scaninfo["filepath"] + mock_det.filepath.set(scaninfo["filepath"]).wait() mock_det.custom_prepare.publish_file_location( done=scaninfo["done"], successful=scaninfo["successful"] ) @@ -243,24 +243,18 @@ def test_trigger(mock_det): mock_on_trigger.assert_called_once() -@pytest.mark.parametrize("stopped, expected_abort", [(False, False), (True, True)]) -def test_unstage(mock_det, stopped, expected_abort): +def test_complete(mock_det): with ( mock.patch.object(mock_det.custom_prepare, "finished") as mock_finished, mock.patch.object( mock_det.custom_prepare, "publish_file_location" ) as mock_publish_file_location, ): - mock_det.stopped = stopped - if expected_abort: - mock_det.unstage() - assert mock_det.stopped is stopped - assert mock_publish_file_location.call_count == 0 - else: - mock_det.unstage() - mock_finished.assert_called_once() - mock_publish_file_location.assert_called_with(done=True, successful=True) - assert mock_det.stopped is stopped + mock_det.stopped = False + mock_det.complete() + assert mock_finished.call_count == 1 + call = mock.call(done=True, successful=True) + assert mock_publish_file_location.call_args == call def test_stop(mock_det): diff --git a/tests/tests_devices/test_mcs_card.py b/tests/tests_devices/test_mcs_card.py index b8f2ce0..a2fbcad 100644 --- a/tests/tests_devices/test_mcs_card.py +++ b/tests/tests_devices/test_mcs_card.py @@ -261,22 +261,10 @@ def test_prepare_detector_backend(mock_det): assert mock_det.read_mode.get() == ReadoutMode.EVENT -@pytest.mark.parametrize("stopped, expected_exception", [(False, False), (True, True)]) -def test_unstage(mock_det, stopped, expected_exception): - with ( - mock.patch.object(mock_det.custom_prepare, "finished") as mock_finished, - mock.patch.object( - mock_det.custom_prepare, "publish_file_location" - ) as mock_publish_file_location, - ): - mock_det.stopped = stopped - if expected_exception: - mock_det.unstage() - assert mock_det.stopped is True - else: - mock_det.unstage() - mock_finished.assert_called_once() - assert mock_det.stopped is False +def test_complete(mock_det): + with (mock.patch.object(mock_det.custom_prepare, "finished") as mock_finished,): + mock_det.complete() + assert mock_finished.call_count == 1 def test_stop_detector_backend(mock_det): diff --git a/tests/tests_devices/test_pilatus_csaxs.py b/tests/tests_devices/test_pilatus_csaxs.py index b403391..663296d 100644 --- a/tests/tests_devices/test_pilatus_csaxs.py +++ b/tests/tests_devices/test_pilatus_csaxs.py @@ -100,7 +100,7 @@ def test_stage(mock_det, scaninfo, stopped, expected_exception): mock_det.custom_prepare, "update_readout_time" ) as mock_update_readout_time, ): - mock_det.filepath = scaninfo["filepath"] + mock_det.filepath.set(scaninfo["filepath"]).wait() if expected_exception: with pytest.raises(Exception): mock_det.timeout = 0.1 @@ -172,7 +172,7 @@ def test_update_readout_time(mock_det, readout_time, expected_value): ) def test_publish_file_location(mock_det, scaninfo): mock_det.scaninfo.scan_id = scaninfo["scan_id"] - mock_det.filepath = scaninfo["filepath"] + mock_det.filepath.set(scaninfo["filepath"]).wait() mock_det.filepath_raw = scaninfo["filepath_raw"] mock_det.custom_prepare.publish_file_location( done=scaninfo["done"], @@ -395,8 +395,7 @@ def test_prep_file_writer(mock_det, scaninfo, data_msgs, urls, requests_state, e assert call == mock_call -@pytest.mark.parametrize("stopped, expected_exception", [(False, False), (True, True)]) -def test_unstage(mock_det, stopped, expected_exception): +def test_complete(mock_det): path = "tmp" mock_det.filepath_raw = path with ( @@ -405,17 +404,10 @@ def test_unstage(mock_det, stopped, expected_exception): mock_det.custom_prepare, "publish_file_location" ) as mock_publish_file_location, ): - mock_det.stopped = stopped - if expected_exception: - mock_det.unstage() - assert mock_det.stopped is True - else: - mock_det.unstage() - mock_finished.assert_called_once() - mock_publish_file_location.assert_called_with( - done=True, successful=True, metadata={"input_path": path} - ) - assert mock_det.stopped is False + mock_det.complete() + assert mock_finished.call_count == 1 + call = mock.call(done=True, successful=True, metadata={"input_path": path}) + assert mock_publish_file_location.call_args == call def test_stop(mock_det):