From c7a83c5dfd21f937fcfbf5c0e989cece9fefd68e Mon Sep 17 00:00:00 2001 From: appel_c Date: Mon, 8 Sep 2025 09:04:47 +0200 Subject: [PATCH] wip remove live mode fornow still --- debye_bec/devices/pilatus/pilatus.py | 166 ++++++++++++++------------- 1 file changed, 88 insertions(+), 78 deletions(-) diff --git a/debye_bec/devices/pilatus/pilatus.py b/debye_bec/devices/pilatus/pilatus.py index 03e4412..f7ec729 100644 --- a/debye_bec/devices/pilatus/pilatus.py +++ b/debye_bec/devices/pilatus/pilatus.py @@ -178,13 +178,13 @@ class Pilatus(PSIDeviceBase, ADBase): ) self._poll_thread_kill_event = threading.Event() self._poll_rate = 1 # Poll rate in Hz - self._live_mode_thread = threading.Thread( - target=self._live_mode_loop, daemon=True, name=f"{self.name}_live_mode_thread" - ) - self._live_mode_kill_event = threading.Event() - self._live_mode_run_event = threading.Event() - self._live_mode_stopped_event = threading.Event() - self._live_mode_stopped_event.set() # Initial state is stopped + # self._live_mode_thread = threading.Thread( + # target=self._live_mode_loop, daemon=True, name=f"{self.name}_live_mode_thread" + # ) + # self._live_mode_kill_event = threading.Event() + # self._live_mode_run_event = threading.Event() + # self._live_mode_stopped_event = threading.Event() + # self._live_mode_stopped_event.set() # Initial state is stopped ######################################## # Custom Beamline Methods # @@ -219,79 +219,89 @@ class Pilatus(PSIDeviceBase, ADBase): f"Error while polling array data for preview of {self.name}: {content}" ) - def start_live_mode(self, exp_time: float, n_images_max: int = 50000): - """ - Start live mode with given exposure time. + # def start_live_mode(self, exp_time: float, n_images_max: int = 50000): + # """ + # Start live mode with given exposure time. - Args: - exp_time (float) : Exposure time in seconds - n_images_max (int): Maximum number of images to capture during live mode. - Default is 5000. Only reset if needed. - """ - if ( - self.cam.acquire.get() != ACQUIREMODE.DONE.value - or self.hdf.capture.get() != ACQUIREMODE.DONE.value - ): - logger.warning(f"Can't start live mode, acquisition running on detector {self.name}.") - return - if self._live_mode_run_event.is_set(): - logger.warning(f"Live mode is already running on detector {self.name}.") - return + # Args: + # exp_time (float) : Exposure time in seconds + # n_images_max (int): Maximum number of images to capture during live mode. + # Default is 5000. Only reset if needed. + # """ + # if ( + # self.cam.acquire.get() != ACQUIREMODE.DONE.value + # or self.hdf.capture.get() != ACQUIREMODE.DONE.value + # ): + # logger.warning(f"Can't start live mode, acquisition running on detector {self.name}.") + # return + # if self._live_mode_run_event.is_set(): + # logger.warning(f"Live mode is already running on detector {self.name}.") + # return - # Set relevant PVs - self.cam.array_counter.set(0).wait(5) # Reset array counter - self.cam.num_images.set(n_images_max).wait(5) - logger.info( - f"Setting exposure time to {exp_time} s for live mode on {self.name} with {n_images_max} images." + # # Set relevant PVs + # self.cam.array_counter.set(0).wait(5) # Reset array counter + # self.cam.num_images.set(n_images_max).wait(5) + # logger.info( + # f"Setting exposure time to {exp_time} s for live mode on {self.name} with {n_images_max} images." + # ) + # self.cam.acquire_time.set(exp_time - self._readout_time).wait(5) + # self.cam.acquire_period.set(exp_time).wait(5) + + # status = CompareStatus(self.cam.acquire, ACQUIREMODE.DONE.value) + # # It should suffice to make sure that self.hdf.capture is not set.. + # self.cam.acquire.put(1) # Start measurement + # try: + # status.wait(10) + # except WaitTimeoutError: + # content = traceback.format_exc() + # raise RuntimeError( + # f"Live Mode on detector {self.name} did not stop: {content} after 10s." + # ) + # self._live_mode_run_event.set() + + # def _live_mode_loop(self, exp_time: float): + # while not self._live_mode_kill_event.is_set(): + # self._live_mode_run_event.wait() + # self._live_mode_stopped_event.clear() # Clear stopped event + # time.sleep(self._readout_time) # make sure to wait for the readout_time + # n_images = self.cam.array_counter.get() + # status = CompareStatus(self.cam.array_counter, n_images + 1) + # self.trigger_shot.put(1) + # try: + # status.wait(60) + # except WaitTimeoutError: + # logger.warning( + # f"Live mode timeout exceeded for {self.name}. Continuing in live_mode_loop" + # ) + # if self._live_mode_run_event.is_set(): + # self._live_mode_stopped_event.set() # Set stopped event to indicate that live mode loop is stopped + + # def stop_live_mode(self): + # """Stop live mode.""" + # if self._live_mode_stopped_event.is_set(): + # return + # status = CompareStatus(self.cam.acquire, ACQUIREMODE.DONE.value) + # self.cam.acquire.put(0) + # self._live_mode_run_event.clear() + # if not self._live_mode_stopped_event.wait(10): # Wait until live mode loop is stopped + # logger.warning(f"Live mode did not stop in time for {self.name}.") + # try: + # status.wait(10) + # except WaitTimeoutError: + # content = traceback.format_exc() + # raise RuntimeError( + # f"Live Mode on detector {self.name} did not stop: {content} after 10s." + # ) + + def check_detector_stop_running_acquisition(self) -> AndStatusWithList: + """Check if the detector is still running an acquisition.""" + status_acquire = CompareStatus(self.cam.acquire, ACQUIREMODE.DONE.value) + status_writing = CompareStatus(self.hdf.capture, ACQUIREMODE.DONE.value) + status_cam_server = CompareStatus(self.cam.armed, DETECTORSTATE.UNARMED.value) + status = AndStatusWithList( + device=self, status_list=[status_acquire, status_writing, status_cam_server] ) - self.cam.acquire_time.set(exp_time - self._readout_time).wait(5) - self.cam.acquire_period.set(exp_time).wait(5) - - status = CompareStatus(self.cam.acquire, ACQUIREMODE.DONE.value) - # It should suffice to make sure that self.hdf.capture is not set.. - self.cam.acquire.put(1) # Start measurement - try: - status.wait(10) - except WaitTimeoutError: - content = traceback.format_exc() - raise RuntimeError( - f"Live Mode on detector {self.name} did not stop: {content} after 10s." - ) - self._live_mode_run_event.set() - - def _live_mode_loop(self, exp_time: float): - while not self._live_mode_kill_event.is_set(): - self._live_mode_run_event.wait() - self._live_mode_stopped_event.clear() # Clear stopped event - time.sleep(self._readout_time) # make sure to wait for the readout_time - n_images = self.cam.array_counter.get() - status = CompareStatus(self.cam.array_counter, n_images + 1) - self.trigger_shot.put(1) - try: - status.wait(60) - except WaitTimeoutError: - logger.warning( - f"Live mode timeout exceeded for {self.name}. Continuing in live_mode_loop" - ) - if self._live_mode_run_event.is_set(): - self._live_mode_stopped_event.set() # Set stopped event to indicate that live mode loop is stopped - - def stop_live_mode(self): - """Stop live mode.""" - if self._live_mode_stopped_event.is_set(): - return - status = CompareStatus(self.cam.acquire, ACQUIREMODE.DONE.value) - self.cam.acquire.put(0) - self._live_mode_run_event.clear() - if not self._live_mode_stopped_event.wait(10): # Wait until live mode loop is stopped - logger.warning(f"Live mode did not stop in time for {self.name}.") - try: - status.wait(10) - except WaitTimeoutError: - content = traceback.format_exc() - raise RuntimeError( - f"Live Mode on detector {self.name} did not stop: {content} after 10s." - ) + return status ######################################## # Beamline Specific Implementations # @@ -342,7 +352,7 @@ class Pilatus(PSIDeviceBase, ADBase): Information about the upcoming scan can be accessed from the scan_info (self.scan_info.msg) object. """ - self.stop_live_mode() # Make sure that live mode is stopped if scan runs + # self.stop_live_mode() # Make sure that live mode is stopped if scan runs scan_msg: ScanStatusMessage = self.scan_info.msg if scan_msg.scan_name.startswith("xas"): return None