WIP samcam device
CI for mx_bec / test (push) Successful in 29s

This commit is contained in:
x10sa committed 2026-09-02 11:10:12 +02:00
1 parent 47dd811279
commit 54c13e3cbc
1 file changed
+72
+72
View File
@@ -0,0 +1,72 @@
from ophyd_devices import PSIDeviceBase
from ophyd import Component as Cpt, EpicsSignal, EpicsSignalRO
import math
import time
from ophyd import Component as Cpt
from ophyd import Device
from ophyd import EpicsSignalRO, Kind, SignalRO
from ophyd_devices.devices.psi_motor import EpicsMotor
from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase
class ContrastSignal(SignalRO):
"""Read-only signal calculated as sigma / mean."""
def __init__(self, *args, minimum_mean: float = 1e-12, **kwargs):
super().__init__(*args, **kwargs)
self.minimum_mean = minimum_mean
def get(self, **kwargs) -> float:
mean = float(self.parent.mean.get())
sigma = float(self.parent.sigma.get())
if not math.isfinite(mean) or not math.isfinite(sigma) or abs(mean) <= self.minimum_mean:
return math.nan
return sigma / mean
def read(self):
return {self.name: {"value": self.get(), "timestamp": time.time()}}
def describe(self):
return {
self.name: {
"source": (f"calculated:{self.parent.sigma.pvname}/{self.parent.mean.pvname}"),
"dtype": "number",
"shape": [],
"units": "",
}
}
class CameraContrast(PSIDeviceBase):
"""Camera statistics and calculated contrast."""
mean = Cpt(EpicsSignalRO, suffix="MeanValue_RBV", kind=Kind.normal)
sigma = Cpt(EpicsSignalRO, suffix="Sigma_RBV", kind=Kind.normal)
contrast = Cpt(ContrastSignal, kind=Kind.hinted)
class SamCamStats(PSIDeviceBase):
max = Cpt(EpicsSignalRO, suffix="MaxValue_RBV")
mean = Cpt(EpicsSignalRO, suffix="MeanValue_RBV")
sigma = Cpt(EpicsSignalRO, suffix="Sigma_RBV")
eccentricity = Cpt(EpicsSignalRO, suffix="Eccentricity_RBV")
class SamCamCentroid(PSIDeviceBase):
x = Cpt(EpicsSignalRO, suffix="CentroidX_RBV")
x_sig = Cpt(EpicsSignalRO, suffix="SigmaX_RBV")
y = Cpt(EpicsSignalRO, suffix="CentroidY_RBV")
y_sig = Cpt(EpicsSignalRO, suffix="SigmaY_RBV")
class SamCam(PSIDeviceBase):
stats = Cpt(SamCamStats, suffix="Stats5:")
centroid = Cpt(SamCamCentroid, suffix="Stats5:")
exposure_time = Cpt(EpicsSignal, suffix="cam1:AcquireTime")
gain = Cpt(EpicsSignal, suffix="cam1:Gain")
contrast = Cpt(CameraContrast, suffix="Stats1:")
zoom = Cpt(EpicsMotor, suffix="ZOOM")