WIP
This commit is contained in:
@@ -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
|
||||||
@@ -36,26 +38,28 @@ class PlotUpdate(AutoUpdates):
|
|||||||
dev_y = None
|
dev_y = None
|
||||||
if not dev_y:
|
if not dev_y:
|
||||||
return
|
return
|
||||||
|
|
||||||
plt1 = self.get_default_figure()
|
plt1 = self.get_default_figure()
|
||||||
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)
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -40,7 +43,7 @@ class SamCamDetector(PSIDetectorBase):
|
|||||||
"""Sample camera device
|
"""Sample camera device
|
||||||
|
|
||||||
The SAMCAM continously streams images to the GUI and sample alignment
|
The SAMCAM continously streams images to the GUI and sample alignment
|
||||||
scripts via ZMQ.
|
scripts via ZMQ.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
custom_prepare_cls = SamCamSetup
|
custom_prepare_cls = SamCamSetup
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -5,5 +5,4 @@ from .mx_measurements import (
|
|||||||
MeasureScreening,
|
MeasureScreening,
|
||||||
MeasureHelical,
|
MeasureHelical,
|
||||||
MeasureHelical2,
|
MeasureHelical2,
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user