feat/diagnostics slits show all and fixes #183

Merged
holler merged 5 commits from feat/diagnostics into main 2026-04-09 13:04:18 +02:00
5 changed files with 647 additions and 183 deletions
@@ -17,6 +17,7 @@ from csaxs_bec.bec_ipython_client.plugins.cSAXS.smaract import cSAXSSmaract
from csaxs_bec.bec_ipython_client.plugins.omny.omny_general_tools import OMNYTools
from csaxs_bec.bec_ipython_client.plugins.cSAXS.filter_transmission import cSAXSFilterTransmission
from csaxs_bec.bec_ipython_client.plugins.cSAXS.diagnostics import cSAXSDiagnostics
from csaxs_bec.bec_ipython_client.plugins.cSAXS.slits import cSAXSSlits
class cSAXSError(Exception):
pass
@@ -25,6 +26,7 @@ class cSAXS(
cSAXSInitSmaractStages,
cSAXSSmaract,
cSAXSFilterTransmission,
cSAXSSlits,
):
def __init__(self, client):
self.client = client
@@ -0,0 +1,220 @@
from __future__ import annotations
import builtins
# ------------------------------------------------------------
# Access to dev (as before)
# ------------------------------------------------------------
if builtins.__dict__.get("dev") is not None:
dev = builtins.__dict__.get("dev")
# ------------------------------------------------------------
# Safe device access
# ------------------------------------------------------------
def _safe_dev(name):
try:
return getattr(dev, name)
except Exception:
return None
# ============================================================
# 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):
print(self._label)
print("-" * len(self._label))
if self._gain is None or self._signal is None:
print("device not available in config\n")
return
try:
cfg = self._gain.get()
except Exception as e:
print(f"error accessing gain: {e}\n")
return
try:
val = self._signal.signal.get()
sval = f"{val:.4f}"
except Exception:
sval = "N/A"
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.{getattr(self._signal, 'name', '?')}.signal.get()")
print("")
def gain(self, value):
if self._gain is None:
print("gain device not available")
return
self._gain.set_gain(value)
class MultiSignalDiag:
"""Diagnostics for multiple signals sharing one gain."""
def __init__(self, name, label, gain_dev, signal_devs: dict):
self._name = name
self._label = label
self._gain = gain_dev
self._signals = signal_devs # dict: label -> device
def show_all(self):
print(self._label)
print("-" * len(self._label))
if self._gain is None or any(v is None for v in self._signals.values()):
print("device not available in config\n")
return
try:
cfg = self._gain.get()
except Exception as e:
print(f"error accessing gain: {e}\n")
return
print(f"gain : {cfg.gain:.0e}")
print(f"coupling : {cfg.coupling}")
print(f"speed : {cfg.speed}")
print("readback:")
for key, sig in self._signals.items():
try:
val = sig.signal.get()
sval = f"{val:.4f}"
except Exception:
sval = "N/A"
print(f" {key:<10}: {sval}")
print("")
print("hint:")
print(f" gain : csaxs.diagnostics.{self._name}.gain(1e5)")
print("")
def gain(self, value):
if self._gain is None:
print("gain device not available")
return
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):
print(self._label)
print("-" * len(self._label))
if self._gain is None or self._rb is None:
print("device not available in config\n")
return
try:
cfg = self._gain.get()
rb = self._rb.get()
except Exception as e:
print(f"error accessing device: {e}\n")
return
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.{getattr(self._rb, 'name', '?')}.pos_x.get()")
print("")
def gain(self, value):
if self._gain is None:
print("gain device not available")
return
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=_safe_dev("gain_bpm_xbox1"),
rb_dev=_safe_dev("bpm_xbox1_slowrb"),
)
self.bpm_xbox2 = BPMDiag(
name="bpm_xbox2",
label="BPM XBox2 (ES hutch)",
gain_dev=_safe_dev("gain_bpm_xbox2"),
rb_dev=_safe_dev("bpm_xbox2_slowrb"),
)
# Single-signal diagnostics
self.bim = SingleSignalDiag(
name="bim",
label="BIM XBox3 (ES)",
gain_dev=_safe_dev("gain_bim_xbox3"),
signal_dev=_safe_dev("bim_xbox3_slowrb"),
)
self.beamstop = SingleSignalDiag(
name="beamstop",
label="Beamstop diode (flight tube)",
gain_dev=_safe_dev("gain_beamstop_diode"),
signal_dev=_safe_dev("beamstop_intensity"),
)
# Multi-signal (fixed your diode issue)
self.polarization = MultiSignalDiag(
name="polarization",
label="Polarization diodes (XBox1)",
gain_dev=_safe_dev("gain_diodes_xbox1"),
signal_devs={
"horizontal": _safe_dev("diode_horizontal_xbox1_slowrb"),
"vertical": _safe_dev("diode_vertical_xbox1_slowrb"),
},
)
def show_all(self):
print("CSAXS diagnostics")
print("=================\n")
self.bpm_xbox1.show_all()
self.bpm_xbox2.show_all()
self.bim.show_all()
self.beamstop.show_all()
self.polarization.show_all()
@@ -0,0 +1,116 @@
from __future__ import annotations
import builtins
from typing import Optional
# ------------------------------------------------------------
# Make dev visible if running inside BEC
# ------------------------------------------------------------
if builtins.__dict__.get("dev") is not None:
dev = builtins.__dict__.get("dev")
# ============================================================
# Slits root (user-facing object)
# ============================================================
class cSAXSSlits:
"""
User-visible slits namespace.
"""
def __init__(self, client):
self.client = client
self.device_manager = client.device_manager
# --------------------------------------------------------
# internal helpers
# --------------------------------------------------------
def _sl_get_position(self, device_name: str) -> Optional[float]:
"""
Safely return the position of a device or None.
"""
try:
device = self.device_manager.devices[device_name]
except Exception:
return None
try:
if hasattr(device, "readback"):
return device.readback.get()
except Exception:
pass
try:
if hasattr(device, "get"):
return device.get()
except Exception:
pass
return None
@staticmethod
def _sl_fmt(value: Optional[float]) -> str:
if value is None:
return " --- "
return f"{value:7.4f}"
# --------------------------------------------------------
# public API
# --------------------------------------------------------
def slits_show_all(self):
"""
Show all slits with center and width.
"""
print("")
print("========== cSAXS Slits Overview ==========")
print("")
# Slit 1
print("Slit 1 (frontend):")
ch = self._sl_get_position("sl1xc")
wh = self._sl_get_position("sl1xs")
cv = self._sl_get_position("sl1yc")
wv = self._sl_get_position("sl1ys")
print(
f" center horizontal = {self._sl_fmt(ch)} "
f"width horizontal = {self._sl_fmt(wh)}"
)
print(
f" center vertical = {self._sl_fmt(cv)} "
f"width vertical = {self._sl_fmt(wv)}"
)
print("")
# Slits 35
slit_map = {
3: "exposure box 2 entrance",
4: "exposure box 2 exit",
5: "exposure box 3",
}
for slit, label in slit_map.items():
print(f"Slit {slit} ({label}):")
ch = self._sl_get_position(f"sl{slit}ch")
wh = self._sl_get_position(f"sl{slit}wh")
cv = self._sl_get_position(f"sl{slit}cv")
wv = self._sl_get_position(f"sl{slit}wv")
print(
f" center horizontal = {self._sl_fmt(ch)} "
f"width horizontal = {self._sl_fmt(wh)}"
)
print(
f" center vertical = {self._sl_fmt(cv)} "
f"width vertical = {self._sl_fmt(wv)}"
)
print("")
print("==========================================")
print("")
+230 -104
View File
@@ -196,6 +196,68 @@ sl3trxt:
# bl_smar_stage to use csaxs reference method. assign number according to axis channel
bl_smar_stage: 5
sl3ch:
description: ESbox1 slit 3 center horizontal
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitCenter
deviceConfig:
left_slit: sl3trxi
right_slit: sl3trxo
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl3trxi
- sl3trxo
sl3wh:
description: ESbox1 slit 3 width horizontal
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitWidth
deviceConfig:
left_slit: sl3trxi
right_slit: sl3trxo
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl3trxi
- sl3trxo
sl3cv:
description: ESbox1 slit 3 center vertical
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitCenter
deviceConfig:
left_slit: sl3trxb
right_slit: sl3trxt
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl3trxb
- sl3trxt
sl3wv:
description: ESbox1 slit 3 width vertical
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitWidth
deviceConfig:
left_slit: sl3trxb
right_slit: sl3trxt
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl3trxb
- sl3trxt
fast_shutter_n1_x:
description: ESbox1 New fast shutter 1 x movment
deviceClass: csaxs_bec.devices.smaract.smaract_ophyd.SmaractMotor
@@ -450,7 +512,71 @@ sl4trxt:
# bl_smar_stage to use csaxs reference method. assign number according to axis channel
bl_smar_stage: 0
################## XBOX 2 ES #####################
sl4ch:
description: ESbox1 slit 4 center horizontal
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitCenter
deviceConfig:
left_slit: sl4trxi
right_slit: sl4trxo
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl4trxi
- sl4trxo
sl4wh:
description: ESbox1 slit 4 width horizontal
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitWidth
deviceConfig:
left_slit: sl4trxi
right_slit: sl4trxo
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl4trxi
- sl4trxo
sl4cv:
description: ESbox1 slit 4 center vertical
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitCenter
deviceConfig:
left_slit: sl4trxb
right_slit: sl4trxt
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl4trxb
- sl4trxt
sl4wv:
description: ESbox1 slit 4 width vertical
deviceClass: ophyd_devices.devices.virtual_slit.VirtualSlitWidth
deviceConfig:
left_slit: sl4trxb
right_slit: sl4trxt
offset: 0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
needs:
- sl4trxb
- sl4trxt
############## XBOX 3 (XBOX 2 ES) #####################
sl5trxi:
description: ESbox2 slit 5 inner blade movement
@@ -888,120 +1014,120 @@ dettrx:
####################
### BPM XBox2 (first Xbox in ES) and Xbox3 BIM
### This requires galilrioesxbox device. On top of that the gain control devices and slow readback devices are built.
####################
# ####################
# ### BPM XBox2 (first Xbox in ES) and Xbox3 BIM
# ### This requires galilrioesxbox device. On top of that the gain control devices and slow readback devices are built.
# ####################
galilrioesxbox:
description: Galil RIO for remote gain switching and slow reading XBox ES
deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
deviceConfig:
host: galilrioesxbox.psi.ch
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
connectionTimeout: 20
# galilrioesxbox:
# description: Galil RIO for remote gain switching and slow reading XBox ES
# deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
# deviceConfig:
# host: galilrioesxbox.psi.ch
# enabled: true
# onFailure: retry
# readOnly: false
# readoutPriority: baseline
# connectionTimeout: 20
gain_bpm_xbox2:
description: Gain control for BPM XBox2
deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
deviceConfig:
gain_lsb: galilrioesxbox.digital_out.ch0 # Pin 10 -> Galil ch0
gain_mid: galilrioesxbox.digital_out.ch1 # Pin 11 -> Galil ch1
gain_msb: galilrioesxbox.digital_out.ch2 # Pin 12 -> Galil ch2
coupling: galilrioesxbox.digital_out.ch3 # Pin 13 -> Galil ch3
speed_mode: galilrioesxbox.digital_out.ch4 # Pin 14 -> Galil ch4
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioesxbox
# gain_bpm_xbox2:
# description: Gain control for BPM XBox2
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
# deviceConfig:
# gain_lsb: galilrioesxbox.digital_out.ch0 # Pin 10 -> Galil ch0
# gain_mid: galilrioesxbox.digital_out.ch1 # Pin 11 -> Galil ch1
# gain_msb: galilrioesxbox.digital_out.ch2 # Pin 12 -> Galil ch2
# coupling: galilrioesxbox.digital_out.ch3 # Pin 13 -> Galil ch3
# speed_mode: galilrioesxbox.digital_out.ch4 # Pin 14 -> Galil ch4
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioesxbox
bpm_xbox2_slowrb:
description: BPM Xbox 2 (First Xbox in ES hutch) readback
deviceClass: csaxs_bec.devices.pseudo_devices.bpm.BPM
deviceConfig:
left_top: galilrioesxbox.analog_in.ch0
right_top: galilrioesxbox.analog_in.ch1
right_bot: galilrioesxbox.analog_in.ch2
left_bot: galilrioesxbox.analog_in.ch3
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioesxbox
# bpm_xbox2_slowrb:
# description: BPM Xbox 2 (First Xbox in ES hutch) readback
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm.BPM
# deviceConfig:
# left_top: galilrioesxbox.analog_in.ch0
# right_top: galilrioesxbox.analog_in.ch1
# right_bot: galilrioesxbox.analog_in.ch2
# left_bot: galilrioesxbox.analog_in.ch3
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioesxbox
gain_bim_xbox3:
description: Gain control for beam intensity monitor ES Xbox3
deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
deviceConfig:
gain_lsb: galilrioesxbox.digital_out.ch6 # Pin 10 -> Galil ch0
gain_mid: galilrioesxbox.digital_out.ch7 # Pin 11 -> Galil ch1
gain_msb: galilrioesxbox.digital_out.ch8 # Pin 12 -> Galil ch2
coupling: galilrioesxbox.digital_out.ch9 # Pin 13 -> Galil ch3
speed_mode: galilrioesxbox.digital_out.ch10 # Pin 14 -> Galil ch4
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioesxbox
# gain_bim_xbox3:
# description: Gain control for beam intensity monitor ES Xbox3
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
# deviceConfig:
# gain_lsb: galilrioesxbox.digital_out.ch6 # Pin 10 -> Galil ch0
# gain_mid: galilrioesxbox.digital_out.ch7 # Pin 11 -> Galil ch1
# gain_msb: galilrioesxbox.digital_out.ch8 # Pin 12 -> Galil ch2
# coupling: galilrioesxbox.digital_out.ch9 # Pin 13 -> Galil ch3
# speed_mode: galilrioesxbox.digital_out.ch10 # Pin 14 -> Galil ch4
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioesxbox
bim_xbox3_slowrb:
description: Beam intensity slow readback ES XBox3
deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
deviceConfig:
signal: galilrioesxbox.analog_in.ch6
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioesxbox
# bim_xbox3_slowrb:
# description: Beam intensity slow readback ES XBox3
# deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
# deviceConfig:
# signal: galilrioesxbox.analog_in.ch6
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioesxbox
####################
### Beamstop diode control for flight tube
### This requires galilrioft device. On top of that the gain control device is built as well as a slow voltage readback.
####################
# ####################
# ### Beamstop diode control for flight tube
# ### This requires galilrioft device. On top of that the gain control device is built as well as a slow voltage readback.
# ####################
galilrioesft:
description: Galil RIO for remote gain switching and slow reading FlightTube
deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
deviceConfig:
host: galilrioesft.psi.ch
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
connectionTimeout: 20
# galilrioesft:
# description: Galil RIO for remote gain switching and slow reading FlightTube
# deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
# deviceConfig:
# host: galilrioesft.psi.ch
# enabled: true
# onFailure: retry
# readOnly: false
# readoutPriority: baseline
# connectionTimeout: 20
gain_beamstop_diode:
description: Gain control for beamstop flightube
deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
deviceConfig:
gain_lsb: galilrioesft.digital_out.ch0 # Pin 10 -> Galil ch0
gain_mid: galilrioesft.digital_out.ch1 # Pin 11 -> Galil ch1
gain_msb: galilrioesft.digital_out.ch2 # Pin 12 -> Galil ch2
coupling: galilrioesft.digital_out.ch3 # Pin 13 -> Galil ch3
speed_mode: galilrioesft.digital_out.ch4 # Pin 14 -> Galil ch4
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioesft
# gain_beamstop_diode:
# description: Gain control for beamstop flightube
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
# deviceConfig:
# gain_lsb: galilrioesft.digital_out.ch0 # Pin 10 -> Galil ch0
# gain_mid: galilrioesft.digital_out.ch1 # Pin 11 -> Galil ch1
# gain_msb: galilrioesft.digital_out.ch2 # Pin 12 -> Galil ch2
# coupling: galilrioesft.digital_out.ch3 # Pin 13 -> Galil ch3
# speed_mode: galilrioesft.digital_out.ch4 # Pin 14 -> Galil ch4
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioesft
beamstop_intensity:
description: Beamstop intensity from Galil analog input ch6
deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
deviceConfig:
signal: galilrioesft.analog_in.ch0
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioesft
# beamstop_intensity:
# description: Beamstop intensity from Galil analog input ch6
# deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
# deviceConfig:
# signal: galilrioesft.analog_in.ch0
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioesft
+79 -79
View File
@@ -197,89 +197,89 @@ ccm_energy:
####################
### BPM and polarization diag XBox1 (optics hutch)
### This requires galilrioop device. On top of that the gain control devices and slow readback devices are built.
### dev.galilrioop.read() shows the analog inputs
### another example ...analog_in.ch0.get()
### dev.galilrioop.read_configuration() shows the digital channels
### example for direct access dev.galilrioesxbox.digital_out.ch1.put(0)
####################
# ####################
# ### BPM and polarization diag XBox1 (optics hutch)
# ### This requires galilrioop device. On top of that the gain control devices and slow readback devices are built.
# ### dev.galilrioop.read() shows the analog inputs
# ### another example ...analog_in.ch0.get()
# ### dev.galilrioop.read_configuration() shows the digital channels
# ### example for direct access dev.galilrioesxbox.digital_out.ch1.put(0)
# ####################
galilrioop:
description: Galil RIO for remote gain switching and slow reading XBox OP
deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
deviceConfig:
host: galilrioop.psi.ch
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
connectionTimeout: 20
# galilrioop:
# description: Galil RIO for remote gain switching and slow reading XBox OP
# deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
# deviceConfig:
# host: galilrioop.psi.ch
# enabled: true
# onFailure: retry
# readOnly: false
# readoutPriority: baseline
# connectionTimeout: 20
gain_bpm_xbox1:
description: Gain control for BPM XBox1 (OP hutch)
deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
deviceConfig:
gain_lsb: galilrioop.digital_out.ch0 # Pin 10 -> Galil ch0
gain_mid: galilrioop.digital_out.ch1 # Pin 11 -> Galil ch1
gain_msb: galilrioop.digital_out.ch2 # Pin 12 -> Galil ch2
coupling: galilrioop.digital_out.ch3 # Pin 13 -> Galil ch3
speed_mode: galilrioop.digital_out.ch4 # Pin 14 -> Galil ch4
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioop
# gain_bpm_xbox1:
# description: Gain control for BPM XBox1 (OP hutch)
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
# deviceConfig:
# gain_lsb: galilrioop.digital_out.ch0 # Pin 10 -> Galil ch0
# gain_mid: galilrioop.digital_out.ch1 # Pin 11 -> Galil ch1
# gain_msb: galilrioop.digital_out.ch2 # Pin 12 -> Galil ch2
# coupling: galilrioop.digital_out.ch3 # Pin 13 -> Galil ch3
# speed_mode: galilrioop.digital_out.ch4 # Pin 14 -> Galil ch4
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioop
bpm_xbox1_slowrb:
description: BPM Xbox 1 (OP hutch) readback
deviceClass: csaxs_bec.devices.pseudo_devices.bpm.BPM
deviceConfig:
left_top: galilrioop.analog_in.ch0
right_top: galilrioop.analog_in.ch1
right_bot: galilrioop.analog_in.ch2
left_bot: galilrioop.analog_in.ch3
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioop
# bpm_xbox1_slowrb:
# description: BPM Xbox 1 (OP hutch) readback
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm.BPM
# deviceConfig:
# left_top: galilrioop.analog_in.ch0
# right_top: galilrioop.analog_in.ch1
# right_bot: galilrioop.analog_in.ch2
# left_bot: galilrioop.analog_in.ch3
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioop
gain_diodes_xbox1:
description: Gain control for diodes (horizontal and vertical) XBox1
deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
deviceConfig:
gain_lsb: galilrioop.digital_out.ch6 # Pin 10 -> Galil ch0
gain_mid: galilrioop.digital_out.ch7 # Pin 11 -> Galil ch1
gain_msb: galilrioop.digital_out.ch8 # Pin 12 -> Galil ch2
coupling: galilrioop.digital_out.ch9 # Pin 13 -> Galil ch3
speed_mode: galilrioop.digital_out.ch10 # Pin 14 -> Galil ch4
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioop
# gain_diodes_xbox1:
# description: Gain control for diodes (horizontal and vertical) XBox1
# deviceClass: csaxs_bec.devices.pseudo_devices.bpm_control.BPMControl
# deviceConfig:
# gain_lsb: galilrioop.digital_out.ch6 # Pin 10 -> Galil ch0
# gain_mid: galilrioop.digital_out.ch7 # Pin 11 -> Galil ch1
# gain_msb: galilrioop.digital_out.ch8 # Pin 12 -> Galil ch2
# coupling: galilrioop.digital_out.ch9 # Pin 13 -> Galil ch3
# speed_mode: galilrioop.digital_out.ch10 # Pin 14 -> Galil ch4
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioop
diode_horizontal_xbox1_slowrb:
description: Slow readback diode horizontal XBox OP (polarization diagnostics)
deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
deviceConfig:
signal: galilrioop.analog_in.ch6
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioop
# diode_horizontal_xbox1_slowrb:
# description: Slow readback diode horizontal XBox OP (polarization diagnostics)
# deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
# deviceConfig:
# signal: galilrioop.analog_in.ch6
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioop
diode_vertical_xbox1_slowrb:
description: Slow readback diode vertical XBox OP (polarization diagnostics)
deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
deviceConfig:
signal: galilrioop.analog_in.ch7
enabled: true
readoutPriority: baseline
onFailure: retry
needs:
- galilrioop
# diode_vertical_xbox1_slowrb:
# description: Slow readback diode vertical XBox OP (polarization diagnostics)
# deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
# deviceConfig:
# signal: galilrioop.analog_in.ch7
# enabled: true
# readoutPriority: baseline
# onFailure: retry
# needs:
# - galilrioop