From e3077f6d2fc9c23b3a2bc46cbd3948b2cbd18193 Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Fri, 18 Jul 2025 11:33:13 +0200 Subject: [PATCH] feat(xbpms): add diag signal and normalize diff signals --- csaxs_bec/devices/epics/xbpms.py | 58 ++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/csaxs_bec/devices/epics/xbpms.py b/csaxs_bec/devices/epics/xbpms.py index 27e5927..1c67e54 100644 --- a/csaxs_bec/devices/epics/xbpms.py +++ b/csaxs_bec/devices/epics/xbpms.py @@ -1,5 +1,6 @@ -from ophyd import Signal, Device, EpicsSignalRO from ophyd import Component as Cpt +from ophyd import Device, EpicsSignalRO, Signal + class SumSignal(Signal): def __init__(self, *args, **kwargs): @@ -18,15 +19,23 @@ class SumSignal(Signal): return val1 + val2 + val3 + val4 def describe(self): + source = [ + self.parent.current1.pvname, + self.parent.current2.pvname, + self.parent.current3.pvname, + self.parent.current4.pvname, + ] + source = " / ".join(source) desc = { "shape": [], "dtype": "number", - "source": "PV: {} / {}".format(self.parent.current1.pvname, self.parent.current1.pvname), + "source": f"PV: {source}", "units": "", "precision": self.parent.current1.precision, } return desc + class DiffXYSignal(Signal): def __init__(self, sum1, sum2, *args, **kwargs): self.sum1 = sum1 @@ -46,33 +55,54 @@ class DiffXYSignal(Signal): for signal in self.sum2: summed_2 += getattr(self.parent, signal).get() - return summed_1 - summed_2 + _sum = summed_1 + summed_2 + if _sum == 0: + return 0.0 + return (summed_1 - summed_2) / _sum def describe(self): + source = [getattr(self.parent, signal).pvname for signal in self.sum1 + self.sum2] + source = " / ".join(source) desc = { "shape": [], "dtype": "number", - "source": "PV: {} / {}".format(self.parent.current1.pvname, self.parent.current1.pvname), + "source": f"PV: {source}", "units": "", "precision": self.parent.current1.precision, } return desc + class BPMDevice(Device): - current1 = Cpt(EpicsSignalRO, ":Current1:MeanValue_RBV", kind="normal") - current2 = Cpt(EpicsSignalRO, ":Current2:MeanValue_RBV", kind="normal") - current3 = Cpt(EpicsSignalRO, ":Current3:MeanValue_RBV", kind="normal") - current4 = Cpt(EpicsSignalRO, ":Current4:MeanValue_RBV", kind="normal") - sum = Cpt(SumSignal, kind="hinted") - x = Cpt(DiffXYSignal, sum1=["current1", "current2"], sum2=["current3", "current4"]) - y = Cpt(DiffXYSignal, sum1=["current1", "current3"], sum2=["current2", "current4"]) + current1 = Cpt(EpicsSignalRO, ":Current1:MeanValue_RBV", kind="normal", doc="Current 1") + current2 = Cpt(EpicsSignalRO, ":Current2:MeanValue_RBV", kind="normal", doc="Current 2") + current3 = Cpt(EpicsSignalRO, ":Current3:MeanValue_RBV", kind="normal", doc="Current 3") + current4 = Cpt(EpicsSignalRO, ":Current4:MeanValue_RBV", kind="normal", doc="Current 4") + sum = Cpt(SumSignal, kind="hinted", doc="Sum of all currents") + x = Cpt( + DiffXYSignal, + sum1=["current1", "current2"], + sum2=["current3", "current4"], + doc="X difference signal", + ) + y = Cpt( + DiffXYSignal, + sum1=["current1", "current3"], + sum2=["current2", "current4"], + doc="Y difference signal", + ) + diag = Cpt( + DiffXYSignal, + sum1=["current1", "current4"], + sum2=["current2", "current3"], + doc="Diagonal difference signal", + ) def __init__(self, prefix="", *args, **kwargs): super().__init__(*args, prefix=prefix, **kwargs) - if __name__ == "__main__": - dev = BPMDevice(name="bpm", prefix='X12SA-FE-XBPM1') + dev = BPMDevice(name="bpm", prefix="X12SA-FE-XBPM1") dev.wait_for_connection() - print(dev.read()) \ No newline at end of file + print(dev.read())