diff --git a/csaxs_bec/bec_ipython_client/plugins/cSAXS/diagnostics.py b/csaxs_bec/bec_ipython_client/plugins/cSAXS/diagnostics.py new file mode 100644 index 0000000..14a8cec --- /dev/null +++ b/csaxs_bec/bec_ipython_client/plugins/cSAXS/diagnostics.py @@ -0,0 +1,132 @@ +from __future__ import annotations +import builtins + +if builtins.__dict__.get("dev") is not None: + dev = builtins.__dict__.get("dev") + + +# ============================================================ +# Base classes +# ============================================================ + +class SingleSignalDiag: + """Diagnostics for a single-signal device with gain control.""" + + def __init__(self, name, label, gain_dev, signal_dev): + self._name = name + self._label = label + self._gain = gain_dev + self._signal = signal_dev + + def show_all(self): + cfg = self._gain.get() + try: + val = self._signal.signal.get() + sval = f"{val:.4f}" + except Exception: + sval = "N/A" + + print(self._label) + print("-" * len(self._label)) + print(f"gain : {cfg.gain:.0e}") + print(f"coupling : {cfg.coupling}") + print(f"speed : {cfg.speed}") + print(f"readback : {sval}") + print("") + print("hint:") + print(f" gain : csaxs.diagnostics.{self._name}.gain(1e5)") + print(f" raw : dev.{self._signal.name}.signal.get()") + + def gain(self, value): + self._gain.set_gain(value) + + +class BPMDiag: + """Diagnostics for a BPM device.""" + + def __init__(self, name, label, gain_dev, rb_dev): + self._name = name + self._label = label + self._gain = gain_dev + self._rb = rb_dev + + def show_all(self): + cfg = self._gain.get() + rb = self._rb.get() + + print(self._label) + print("-" * len(self._label)) + print(f"gain : {cfg.gain:.0e}") + print(f"coupling : {cfg.coupling}") + print(f"speed : {cfg.speed}") + print("readback:") + print(f" pos_x : {rb.pos_x:.3e}") + print(f" pos_y : {rb.pos_y:.3e}") + print(f" intensity : {rb.intensity:.3f}") + print("") + print("hint:") + print(f" gain : csaxs.diagnostics.{self._name}.gain(1e6)") + print(f" raw : dev.{self._rb.name}.pos_x.get()") + + def gain(self, value): + self._gain.set_gain(value) + + +# ============================================================ +# Diagnostics root (user-facing object) +# ============================================================ + +class cSAXSDiagnostics: + """User-visible diagnostics namespace.""" + + def __init__(self): + # BPMs + self.bpm_xbox1 = BPMDiag( + name="bpm_xbox1", + label="BPM XBox1 (OP hutch)", + gain_dev=dev.gain_bpm_xbox1, + rb_dev=dev.bpm_xbox1_slowrb, + ) + + self.bpm_xbox2 = BPMDiag( + name="bpm_xbox2", + label="BPM XBox2 (ES hutch)", + gain_dev=dev.gain_bpm_xbox2, + rb_dev=dev.bpm_xbox2_slowrb, + ) + + # Single-signal diagnostics + self.bim = SingleSignalDiag( + name="bim", + label="BIM XBox3 (ES)", + gain_dev=dev.gain_bim_xbox3, + signal_dev=dev.bim_xbox3_slowrb, + ) + + self.beamstop = SingleSignalDiag( + name="beamstop", + label="Beamstop diode (flight tube)", + gain_dev=dev.gain_beamstop_diode, + signal_dev=dev.beamstop_intensity, + ) + + self.polarization = SingleSignalDiag( + name="polarization", + label="Polarization diodes (XBox1)", + gain_dev=dev.gain_diodes_xbox1, + signal_dev=dev.diode_horizontal_xbox1_slowrb, + ) + + def show_all(self): + print("CSAXS diagnostics") + print("=================") + print("") + self.bpm_xbox1.show_all() + print("") + self.bpm_xbox2.show_all() + print("") + self.bim.show_all() + print("") + self.beamstop.show_all() + print("") + self.polarization.show_all()