added all galilrio and csaxs.diagnostics #182

Merged
holler merged 4 commits from config_and_fixes into main 2026-04-08 11:31:21 +02:00
8 changed files with 266 additions and 46 deletions
@@ -16,9 +16,11 @@ from csaxs_bec.bec_ipython_client.plugins.cSAXS.smaract import cSAXSInitSmaractS
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
class cSAXSError(Exception):
pass
class cSAXS(
cSAXSInitSmaractStages,
cSAXSSmaract,
@@ -28,9 +30,12 @@ class cSAXS(
self.client = client
self.device_manager = client.device_manager
self.OMNYTools = OMNYTools(self.client)
self.diagnostics = cSAXSDiagnostics()
super().__init__(client=client)
# this is the csaxs master file that imports all routines from csaxs
# can be imported in the bec client by
# run in bec from folder /sls/x12sa/config/bec/production/csaxs_bec
@@ -1829,20 +1829,20 @@ class Flomni(
or (self.tomo_type == 3 and projection_number == None)
):
# pylint: disable=undefined-variable
# if bec.active_account != "":
# self.tomo_id = self.add_sample_database(
# self.sample_name,
# str(datetime.date.today()),
# bec.active_account,
# bec.queue.next_scan_number,
# "flomni",
# "test additional info",
# "BEC",
# )
# self.write_pdf_report()
# else:
self.tomo_id = 0
#pylint: disable=undefined-variable
if bec.active_account != "":
self.tomo_id = self.add_sample_database(
self.sample_name,
str(datetime.date.today()),
bec.active_account,
bec.queue.next_scan_number,
"flomni",
"test additional info",
"BEC",
)
self.write_pdf_report()
else:
self.tomo_id = 0
self.write_pdf_report()
self.progress["tomo_start_time"] = datetime.datetime.now().isoformat()
@@ -403,8 +403,11 @@ class LocalHttpServer:
class _QuietHandler(http.server.SimpleHTTPRequestHandler):
def log_message(self, *args):
pass
# handle_error here does nothing — wrong class
class _QuietHTTPServer(http.server.HTTPServer):
def handle_error(self, request, client_address):
pass # suppress BrokenPipeError and other per-connection noise
pass # suppress BrokenPipeError and all other per-connection noise
def start(self) -> None:
Handler = functools.partial(
@@ -412,11 +415,11 @@ class LocalHttpServer:
directory=str(self._directory),
)
try:
self._server = http.server.HTTPServer(("", self._port), Handler)
self._server = self._QuietHTTPServer(("", self._port), Handler)
except OSError as exc:
raise RuntimeError(
f"LocalHttpServer: cannot bind port {self._port}: {exc}"
) from exc
) from excs
self._thread = threading.Thread(
target=self._server.serve_forever,
name="LocalHttpServer",
@@ -234,9 +234,10 @@ class TomoIDManager:
)
"""
OMNY_URL = "https://omny.web.psi.ch/samples/newmeasurement.php"
OMNY_USER = "omny"
OMNY_PASSWORD = "samples"
#OMNY_URL = "https://omny.web.psi.ch/samples/newmeasurement.php"
OMNY_URL = "https://v1p0zyg2w9n2k9c1.myfritz.net/samples/newmeasurement.php"
OMNY_USER = ""
OMNY_PASSWORD = ""
TMP_FILE = "/tmp/currsamplesnr.txt"
def register(
@@ -273,9 +274,14 @@ class TomoIDManager:
f"&additional={additional_info}"
f"&user={user}"
)
# subprocess.run(
# f"wget --user={self.OMNY_USER} --password={self.OMNY_PASSWORD}"
# f" -q -O {self.TMP_FILE} '{url}'",
# shell=True,
# )
#print(url)
subprocess.run(
f"wget --user={self.OMNY_USER} --password={self.OMNY_PASSWORD}"
f" -q -O {self.TMP_FILE} '{url}'",
f"wget -q -O {self.TMP_FILE} '{url}'",
shell=True,
)
with open(self.TMP_FILE) as f:
+99 -9
View File
@@ -885,11 +885,99 @@ dettrx:
softwareTrigger: false
####################
### Beamstop control for flight tube
### 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.
####################
beamstop_control:
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
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
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.
####################
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:
@@ -904,15 +992,17 @@ beamstop_control:
needs:
- galilrioesft
galilrioesft:
description: Galil RIO for remote gain switching and slow reading FlightTube
deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
beamstop_intensity:
description: Beamstop intensity from Galil analog input ch6
deviceClass: csaxs_bec.devices.pseudo_devices.signal_forwarder.SignalForwarder
deviceConfig:
host: galilrioesft.psi.ch
signal: galilrioesft.analog_in.ch0
enabled: true
onFailure: retry
readOnly: false
readoutPriority: baseline
connectionTimeout: 20
onFailure: retry
needs:
- galilrioesft
-14
View File
@@ -9,17 +9,3 @@ x12saEPS:
onFailure: buffer
readOnly: false
readoutPriority: baseline
############################################################
##################### GalilRIO #############################
############################################################
galilrioesxbox:
description: Galil RIO for remote gain switching and slow reading ES XBox
deviceClass: csaxs_bec.devices.omny.galil.galil_rio.GalilRIO
deviceConfig:
host: galilrioesxbox.psi.ch
enabled: true
onFailure: raise
readOnly: false
readoutPriority: baseline
connectionTimeout: 20
+90 -1
View File
@@ -193,4 +193,93 @@ ccm_energy:
# enabled: true
# readoutPriority: baseline
# readOnly: false
# softwareTrigger: false
# softwareTrigger: false
####################
### 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
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
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_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
@@ -0,0 +1,41 @@
"""
Pseudo device that forwards a single BEC signal 1:1.
"""
from ophyd import Component as Cpt
from ophyd import Kind, Signal
from ophyd_devices.interfaces.base_classes.psi_pseudo_device_base import PSIPseudoDeviceBase
from ophyd_devices.utils.bec_processed_signal import BECProcessedSignal
class SignalForwarder(PSIPseudoDeviceBase):
"""Forward one signal unchanged."""
signal = Cpt(
BECProcessedSignal,
name="signal",
model_config=None,
kind=Kind.config,
doc="Forwarded signal",
)
def __init__(
self,
name,
signal: str,
device_manager=None,
scan_info=None,
**kwargs,
):
super().__init__(name=name, device_manager=device_manager, scan_info=scan_info, **kwargs)
src = self.signal.get_device_object_from_bec(
object_name=signal,
signal_name=self.name,
device_manager=device_manager,
)
self.signal.set_compute_method(self._compute_signal, signal=src)
def _compute_signal(self, signal: Signal) -> float:
return signal.get()