refactor(debye-cam): add preview signal to camera integrations

This commit is contained in:
2025-06-18 14:09:11 +02:00
parent a9fd62d249
commit 827557b667
5 changed files with 35 additions and 28 deletions

View File

@@ -6,6 +6,8 @@ from typing import TYPE_CHECKING
from ophyd import ADBase
from ophyd import ADComponent as ADCpt
from ophyd import Component as Cpt
from ophyd_devices import PreviewSignal
from ophyd_devices.devices.areadetector.cam import AravisDetectorCam
from ophyd_devices.devices.areadetector.plugins import ImagePlugin_V35
@@ -25,14 +27,10 @@ class BaslerCamBase(ADBase):
class BaslerCam(DebyeBaseCamera, BaslerCamBase):
"""Basler camera class at Debye. IOC prefix: X01DA-ES-XRAYEYE:"""
def __init__(self, *, name: str, prefix: str = "", scan_info: ScanInfo | None = None, **kwargs):
"""
Initialize the Prosilica camera class.
Args:
name (str): Name of the camera.
prefix (str): IOC prefix.
scan_info (ScanInfo): The scan info to use.
"""
super().__init__(name=name, prefix=prefix, scan_info=scan_info, **kwargs)
self._n_rot90 = -1 # Rotate the image by -90 degrees
preview = Cpt(
PreviewSignal,
name="preview",
ndim=2,
num_rotation_90=-1,
doc="Preview signal for the camera.",
)

View File

@@ -7,7 +7,9 @@ from typing import TYPE_CHECKING
import numpy as np
from bec_lib.logger import bec_logger
from ophyd import Component as Cpt
from ophyd import DeviceStatus, StatusBase
from ophyd_devices import PreviewSignal
from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase
from typeguard import typechecked
@@ -23,6 +25,13 @@ class DebyeBaseCamera(PSIDeviceBase):
"""Base class for Debye cameras."""
USER_ACCESS = ["live_mode"]
preview = Cpt(
PreviewSignal,
name="preview",
ndim=2,
num_rotation_90=-1,
doc="Preview signal for the camera.",
)
def __init__(self, *, name: str, prefix: str = "", scan_info: ScanInfo | None = None, **kwargs):
super().__init__(name=name, prefix=prefix, scan_info=scan_info, **kwargs)
@@ -31,7 +40,6 @@ class DebyeBaseCamera(PSIDeviceBase):
self._live_mode = False
self._live_mode_event = None
self._task_status = None
self._n_rot90 = -1
@property
def live_mode(self) -> bool:
@@ -82,8 +90,8 @@ class DebyeBaseCamera(PSIDeviceBase):
width = self.image1.array_size.width.get()
height = self.image1.array_size.height.get()
# Geometry correction for the image
data = np.rot90(np.reshape(value, (height, width)), k=self._n_rot90, axes=(0, 1))
self._run_subs(sub_type=self.SUB_DEVICE_MONITOR_2D, value=data)
data = np.reshape(value, (height, width))
self.preview.put(data)
########################################
# Beamline Specific Implementations #

View File

@@ -6,6 +6,8 @@ from typing import TYPE_CHECKING
from ophyd import ADBase
from ophyd import ADComponent as ADCpt
from ophyd import Component as Cpt
from ophyd_devices import PreviewSignal
from ophyd_devices.devices.areadetector.cam import ProsilicaDetectorCam
from ophyd_devices.devices.areadetector.plugins import ImagePlugin_V35
@@ -28,14 +30,10 @@ class ProsilicaCam(DebyeBaseCamera, ProsilicaCamBase):
Prefixes are: X01DA-OP-GIGE02: and X01DA-OP-GIGE01:
"""
def __init__(self, *, name: str, prefix: str = "", scan_info: ScanInfo | None = None, **kwargs):
"""
Initialize the Prosilica camera class.
Args:
name (str): Name of the camera.
prefix (str): IOC prefix.
scan_info (ScanInfo): The scan info to use.
"""
super().__init__(name=name, prefix=prefix, scan_info=scan_info, **kwargs)
self._n_rot90 = -1 # Rotate the image by -90 degrees
preview = Cpt(
PreviewSignal,
name="preview",
ndim=2,
num_rotation_90=-1,
doc="Preview signal for the camera.",
)

View File

@@ -39,7 +39,8 @@ def test_basler_init(mock_basler):
assert mock_basler._live_mode is False
assert mock_basler._live_mode_event is None
assert mock_basler._task_status is None
assert mock_basler._n_rot90 == -1
assert mock_basler.preview.ndim == 2
assert mock_basler.preview.num_rotation_90 == -1
@pytest.fixture(scope="function")
@@ -65,4 +66,5 @@ def test_prosilica_init(mock_prosilica):
assert mock_prosilica._live_mode is False
assert mock_prosilica._live_mode_event is None
assert mock_prosilica._task_status is None
assert mock_prosilica._n_rot90 == -1
assert mock_prosilica.preview.ndim == 2
assert mock_prosilica.preview.num_rotation_90 == -1

View File

@@ -34,7 +34,8 @@ def test_init(mock_cam):
assert mock_cam._live_mode is False
assert mock_cam._live_mode_event is None
assert mock_cam._task_status is None
assert mock_cam._n_rot90 == -1
assert mock_cam.preview.ndim == 2
assert mock_cam.preview.num_rotation_90 == -1
def test_start_live_mode(mock_cam):