This commit is contained in:
gac-x06da
2025-03-11 13:24:06 +01:00
committed by mohacsi_i
parent 5ca9972383
commit d18c099058
7 changed files with 39 additions and 31 deletions
+8 -5
View File
@@ -1,9 +1,11 @@
from bec_widgets.cli.auto_updates import AutoUpdates, ScanInfo from bec_widgets.cli.auto_updates import AutoUpdates, ScanInfo
from bec_widgets.cli.rpc.rpc_base import RPCResponseTimeoutError
class PlotUpdate(AutoUpdates): class PlotUpdate(AutoUpdates):
create_default_dock = True create_default_dock = True
enabled = True enabled = True
_scan_msg = None
def do_update(self, msg): def do_update(self, msg):
"""Save the original scan message for future use""" """Save the original scan message for future use"""
@@ -23,7 +25,7 @@ class PlotUpdate(AutoUpdates):
# plt.set(title=f"PXIII: Scan {info.scan_number}", x_label=dev_x, y_label=dev_y) # plt.set(title=f"PXIII: Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
def keyword_handler(self, info: ScanInfo) -> None: def keyword_handler(self, info: ScanInfo) -> None:
""" Simple keyword handler """Simple keyword handler
This simple keyword handler looks for the keyword 'datasource' in the scan arguments. This simple keyword handler looks for the keyword 'datasource' in the scan arguments.
This allows the user to explictly specify the desired data source. Useful for alignment This allows the user to explictly specify the desired data source. Useful for alignment
@@ -41,21 +43,23 @@ class PlotUpdate(AutoUpdates):
try: try:
# This will throw RPCResponseTimeoutError # This will throw RPCResponseTimeoutError
plt1.clear_all() plt1.clear_all()
except Exception: except RPCResponseTimeoutError:
pass pass
try: try:
# TODO: What about 2D scans?
# This will throw RPCResponseTimeoutError # This will throw RPCResponseTimeoutError
plt1.plot(x_name=dev_x, y_name=dev_y) plt1.plot(x_name=dev_x, y_name=dev_y)
except Exception: except RPCResponseTimeoutError:
pass pass
try: try:
# This will throw RPCResponseTimeoutError # This will throw RPCResponseTimeoutError
plt1.set(title=f"PXIII: Scan {info.scan_number}", x_label=dev_x, y_label=dev_y) plt1.set(title=f"PXIII: Scan {info.scan_number}", x_label=dev_x, y_label=dev_y)
except Exception: except RPCResponseTimeoutError:
pass pass
# plt1.add_dap(dev_x, dev_y, dap="LinearModel") # plt1.add_dap(dev_x, dev_y, dap="LinearModel")
def handler(self, info: ScanInfo) -> None: def handler(self, info: ScanInfo) -> None:
"""Dock configuration handler"""
# EXAMPLES: # EXAMPLES:
# if info.scan_name == "line_scan" and info.scan_report_devices: # if info.scan_name == "line_scan" and info.scan_report_devices:
# self.simple_line_scan(info) # self.simple_line_scan(info)
@@ -65,4 +69,3 @@ class PlotUpdate(AutoUpdates):
# return # return
super().handler(info) super().handler(info)
self.keyword_handler(info) self.keyword_handler(info)
+8 -8
View File
@@ -98,8 +98,8 @@ class AerotechAbrMixin(CustomPrepare):
d["var_5"] = 0 d["var_5"] = 0
d["var_6"] = 0 d["var_6"] = 0
d["var_7"] = 0 d["var_7"] = 0
d["var_8"] = 0 # d["var_8"] = 0
d["var_9"] = 0 # d["var_9"] = 0
if scanname in ("verticallinescan", "vlinescan"): if scanname in ("verticallinescan", "vlinescan"):
d["scan_command"] = AbrCmd.VERTICAL_LINE_SCAN d["scan_command"] = AbrCmd.VERTICAL_LINE_SCAN
d["var_1"] = scanargs["range"] / scanargs["steps"] d["var_1"] = scanargs["range"] / scanargs["steps"]
@@ -109,8 +109,8 @@ class AerotechAbrMixin(CustomPrepare):
d["var_5"] = 0 d["var_5"] = 0
d["var_6"] = 0 d["var_6"] = 0
d["var_7"] = 0 d["var_7"] = 0
d["var_8"] = 0 # d["var_8"] = 0
d["var_9"] = 0 # d["var_9"] = 0
if scanname in ("screeningscan"): if scanname in ("screeningscan"):
d["scan_command"] = AbrCmd.SCREENING d["scan_command"] = AbrCmd.SCREENING
d["var_1"] = scanargs["start"] d["var_1"] = scanargs["start"]
@@ -120,8 +120,8 @@ class AerotechAbrMixin(CustomPrepare):
d["var_5"] = scanargs["steps"] d["var_5"] = scanargs["steps"]
d["var_6"] = scanargs.get("delta", 0.5) d["var_6"] = scanargs.get("delta", 0.5)
d["var_7"] = 0 d["var_7"] = 0
d["var_8"] = 0 # d["var_8"] = 0
d["var_9"] = 0 # d["var_9"] = 0
if scanname in ("rasterscan", "rastersimplescan"): if scanname in ("rasterscan", "rastersimplescan"):
d["scan_command"] = AbrCmd.RASTER_SCAN_SIMPLE d["scan_command"] = AbrCmd.RASTER_SCAN_SIMPLE
d["var_1"] = scanargs["exp_time"] d["var_1"] = scanargs["exp_time"]
@@ -131,8 +131,8 @@ class AerotechAbrMixin(CustomPrepare):
d["var_5"] = scanargs["steps_y"] d["var_5"] = scanargs["steps_y"]
d["var_6"] = 0 d["var_6"] = 0
d["var_7"] = 0 d["var_7"] = 0
d["var_8"] = 0 # d["var_8"] = 0
d["var_9"] = 0 # d["var_9"] = 0
# Reconfigure if got a valid scan config # Reconfigure if got a valid scan config
if len(d) > 0: if len(d) > 0:
+4 -1
View File
@@ -13,7 +13,8 @@ Created on Thu Jan 30 2025
""" """
from ophyd import ADComponent from ophyd import ADComponent
from ophyd_devices.devices.areadetector.cam import GenICam from ophyd_devices.devices.areadetector.cam import GenICam
from ophyd_devices.devices.areadetector.plugins import ImagePlugin_V35
# from ophyd_devices.devices.areadetector.plugins import ImagePlugin_V35
from ophyd_devices.interfaces.base_classes.psi_detector_base import ( from ophyd_devices.interfaces.base_classes.psi_detector_base import (
PSIDetectorBase, PSIDetectorBase,
CustomDetectorMixin, CustomDetectorMixin,
@@ -25,6 +26,8 @@ logger = bec_logger.logger
class SamCamSetup(CustomDetectorMixin): class SamCamSetup(CustomDetectorMixin):
"""Simple camera mixin class, the SAMCAM is usually streaming"""
def on_stage(self): def on_stage(self):
"""Just make sure it's running continously""" """Just make sure it's running continously"""
self.parent.cam.acquire.put(1, wait=True) self.parent.cam.acquire.put(1, wait=True)
+2 -3
View File
@@ -8,9 +8,8 @@ The SmarGon axes are interfaced as positioners.
import time import time
import threading import threading
from threading import Thread, Lock
import requests
from collections import OrderedDict from collections import OrderedDict
import requests
from requests.adapters import HTTPAdapter, Retry from requests.adapters import HTTPAdapter, Retry
from ophyd import Component, Kind, Signal, PVPositioner from ophyd import Component, Kind, Signal, PVPositioner
from ophyd.status import SubscriptionStatus from ophyd.status import SubscriptionStatus
@@ -27,7 +26,7 @@ except ModuleNotFoundError:
# SmarGon contoller can't really handle multiple connections # SmarGon contoller can't really handle multiple connections
# Use this mutex to ensure one access at a time # Use this mutex to ensure one access at a time
mutex = Lock() mutex = threading.Lock()
class LimitedSmarGonSignal(Signal): class LimitedSmarGonSignal(Signal):
-1
View File
@@ -5,5 +5,4 @@ from .mx_measurements import (
MeasureScreening, MeasureScreening,
MeasureHelical, MeasureHelical,
MeasureHelical2, MeasureHelical2,
) )
+6 -1
View File
@@ -1,3 +1,7 @@
import bec
import bec_lib.devicemanager.DeviceContainer as dev
def rock(steps, exp_time, scan_start=None, scan_end=None, datasource=None, visual=True, **kwargs): def rock(steps, exp_time, scan_start=None, scan_end=None, datasource=None, visual=True, **kwargs):
"""Demo step scan with plotting """Demo step scan with plotting
@@ -58,6 +62,7 @@ def rock(steps, exp_time, scan_start=None, scan_end=None, datasource=None, visua
s, motor.name, motor.name, datasource.name, datasource.name s, motor.name, motor.name, datasource.name, datasource.name
) )
# Move to fitted maximum # TODO: Validate fitted position
# TODO: Move to fitted maximum
return s, firt_par return s, firt_par
+9 -10
View File
@@ -1,3 +1,7 @@
import bec
import bec_lib.devicemanager.DeviceContainer as dev
def bl_check_beam(): def bl_check_beam():
"""Check beamline status before scan""" """Check beamline status before scan"""
return True return True
@@ -59,23 +63,18 @@ def ascan(
) )
if visual: if visual:
# If fitting via GUI # Fitting via GUI
firt_par = plt1.get_dap_params() firt_par = plt1.get_dap_params()
return s, firt_par
else: else:
# Fitting without GUI
firt_par = bec.dap.LinearModel.fit( firt_par = bec.dap.LinearModel.fit(
s, motor.name, motor.name, datasource.name, datasource.name s, motor.name, motor.name, datasource.name, datasource.name
) )
return s, firt_par
# fit = bec.dap.LinearModel(motor, datasource)
# If fitting via GUI
# firt_par = plt1.get_dap_params()
# return s, firt_par
# #return s
# # Some basic fit # # Some basic fit
# dkey = datasource.full_name # dkey = datasource.full_name
# NOTE: s.scan.data == bec.history[-1]
# datapoints = bec.history[-1].devices[dkey].read()[dkey]['value'] # datapoints = bec.history[-1].devices[dkey].read()[dkey]['value']
# positions # positions
return s, firt_par