Added scan classes for both advanced scans
This commit is contained in:
committed by
gac-x01da
parent
6d9f48c8dd
commit
5b46464ef9
@@ -226,6 +226,8 @@ class ScanParameter:
|
||||
cycle_high: int = None
|
||||
start: float = None
|
||||
stop: float = None
|
||||
t_kink: float = None
|
||||
p_kink: float = None
|
||||
|
||||
|
||||
class Mo1Bragg(Device, PositionerBase):
|
||||
@@ -564,7 +566,7 @@ class Mo1Bragg(Device, PositionerBase):
|
||||
a = spl(np.linspace(0,max_param,n), 2)
|
||||
j = spl(np.linspace(0,max_param,n), 3)
|
||||
|
||||
time, pos = p.T
|
||||
tim, pos = p.T
|
||||
pos = pos + offset
|
||||
vel = v[:,1]/v[:,0]
|
||||
|
||||
@@ -575,12 +577,12 @@ class Mo1Bragg(Device, PositionerBase):
|
||||
for item in j:
|
||||
jerk.append(0) if item[1] == 0 else jerk.append(item[1]/item[0])
|
||||
|
||||
dt = np.zeros(len(time))
|
||||
for i in range(len(time)):
|
||||
dt = np.zeros(len(tim))
|
||||
for i in np.arange(len(tim)):
|
||||
if i == 0:
|
||||
dt[i] = 0
|
||||
else:
|
||||
dt[i] = 1000*(time[i]-time[i-1])
|
||||
dt[i] = 1000*(tim[i]-tim[i-1])
|
||||
|
||||
self.scan_settings.a_scan_pos.put(pos)
|
||||
self.scan_settings.a_scan_vel.put(vel)
|
||||
@@ -748,6 +750,48 @@ class Mo1Bragg(Device, PositionerBase):
|
||||
self.set_scan_control_settings(
|
||||
mode=ScanControlMode.SIMPLE, scan_duration=self.scan_parameter.scan_duration
|
||||
)
|
||||
elif scan_name == "xas_advanced_scan":
|
||||
self.set_advanced_xas_settings(
|
||||
low=self.scan_parameter.start,
|
||||
high=self.scan_parameter.stop,
|
||||
scan_time=self.scan_parameter.scan_time,
|
||||
t_kink=self.scan_parameter.t_kink,
|
||||
p_kink=self.scan_parameter.p_kink,
|
||||
)
|
||||
self.set_xrd_settings(
|
||||
enable_low=False,
|
||||
enable_high=False,
|
||||
num_trigger_low=0,
|
||||
num_trigger_high=0,
|
||||
exp_time_low=0,
|
||||
exp_time_high=0,
|
||||
cycle_low=0,
|
||||
cycle_high=0,
|
||||
)
|
||||
self.set_scan_control_settings(
|
||||
mode=ScanControlMode.ADVANCED, scan_duration=self.scan_parameter.scan_duration
|
||||
)
|
||||
elif scan_name == "xas_advanced_scan_with_xrd":
|
||||
self.set_advanced_xas_settings(
|
||||
low=self.scan_parameter.start,
|
||||
high=self.scan_parameter.stop,
|
||||
scan_time=self.scan_parameter.scan_time,
|
||||
t_kink=self.scan_parameter.t_kink,
|
||||
p_kink=self.scan_parameter.p_kink,
|
||||
)
|
||||
self.set_xrd_settings(
|
||||
enable_low=self.scan_parameter.xrd_enable_low,
|
||||
enable_high=self.scan_parameter.xrd_enable_high,
|
||||
num_trigger_low=self.scan_parameter.num_trigger_low,
|
||||
num_trigger_high=self.scan_parameter.num_trigger_high,
|
||||
exp_time_low=self.scan_parameter.exp_time_low,
|
||||
exp_time_high=self.scan_parameter.exp_time_high,
|
||||
cycle_low=self.scan_parameter.cycle_low,
|
||||
cycle_high=self.scan_parameter.cycle_high,
|
||||
)
|
||||
self.set_scan_control_settings(
|
||||
mode=ScanControlMode.ADVANCED, scan_duration=self.scan_parameter.scan_duration
|
||||
)
|
||||
else:
|
||||
raise Mo1BraggError(
|
||||
f"Scan mode {scan_name} not implemented for scan_type={self.scaninfo.scan_type} on device {self.name}"
|
||||
|
||||
@@ -1 +1 @@
|
||||
from .mono_bragg_scans import XASSimpleScan, XASSimpleScanWithXRD
|
||||
from .mono_bragg_scans import XASSimpleScan, XASSimpleScanWithXRD, XASAdvancedScan, XASAdvancedScanWithXRD
|
||||
|
||||
@@ -166,3 +166,128 @@ class XASSimpleScanWithXRD(XASSimpleScan):
|
||||
self.num_trigger_high = num_trigger_high
|
||||
self.exp_time_high = exp_time_high
|
||||
self.cycle_high = cycle_high
|
||||
|
||||
class XASAdvancedScan(XASSimpleScan):
|
||||
|
||||
scan_name = "xas_advanced_scan"
|
||||
gui_config = {
|
||||
"Movement Parameters": ["start", "stop"],
|
||||
"Scan Parameters": ["scan_time", "scan_duration"],
|
||||
"Spline Parameters": ["t_kink", "p_kink"],
|
||||
}
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
start: float,
|
||||
stop: float,
|
||||
scan_time: float,
|
||||
scan_duration: float,
|
||||
t_kink: float,
|
||||
p_kink: float,
|
||||
motor: DeviceBase = "mo1_bragg",
|
||||
**kwargs,
|
||||
):
|
||||
"""The xas_advanced_scan is an oscillation motion on the mono motor.
|
||||
Start and Stop define the energy range for the scan, scan_time is the time for one scan cycle and scan_duration
|
||||
is the duration of the scan. If scan duration is set to 0, the scan will run infinitely.
|
||||
t_kink and p_kink add a kink to the motion profile to slow down in the exafs region of the scan.
|
||||
|
||||
Args:
|
||||
start (float): Start angle for the scan.
|
||||
stop (float): Stop angle for the scan.
|
||||
scan_time (float): Time for one oscillation .
|
||||
scan_duration (float): Total duration of the scan.
|
||||
t_kink (float): Time of the kink.
|
||||
p_kink (float): Position of the kink.
|
||||
motor (DeviceBase, optional): Motor device to be used for the scan. Defaults to "mo1_bragg".
|
||||
|
||||
Examples:
|
||||
>>> scans.xas_advanced_scan(start=9, stop=11, scan_time=0.5, scan_duration=10, t_kink=0.15, p_kink=1)
|
||||
"""
|
||||
super().__init__(
|
||||
start=start,
|
||||
stop=stop,
|
||||
scan_time=scan_time,
|
||||
scan_duration=scan_duration,
|
||||
motor=motor,
|
||||
**kwargs,
|
||||
)
|
||||
self.t_kink = t_kink
|
||||
self.p_kink = p_kink
|
||||
|
||||
class XASAdvancedScanWithXRD(XASAdvancedScan):
|
||||
|
||||
scan_name = "xas_advanced_scan_with_xrd"
|
||||
gui_config = {
|
||||
"Movement Parameters": ["start", "stop"],
|
||||
"Scan Parameters": ["scan_time", "scan_duration"],
|
||||
"Spline Parameters": ["t_kink", "p_kink"],
|
||||
"Low Energy Range": ["xrd_enable_low", "num_trigger_low", "exp_time_low", "cycle_low"],
|
||||
"High Energy Range": ["xrd_enable_high", "num_trigger_high", "exp_time_high", "cycle_high"],
|
||||
}
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
start: float,
|
||||
stop: float,
|
||||
scan_time: float,
|
||||
scan_duration: float,
|
||||
t_kink: float,
|
||||
p_kink: float,
|
||||
xrd_enable_low: bool,
|
||||
num_trigger_low: int,
|
||||
exp_time_low: float,
|
||||
cycle_low: int,
|
||||
xrd_enable_high: bool,
|
||||
num_trigger_high: int,
|
||||
exp_time_high: float,
|
||||
cycle_high: float,
|
||||
motor: DeviceBase = "mo1_bragg",
|
||||
**kwargs,
|
||||
):
|
||||
"""The xas_advanced_scan is an oscillation motion on the mono motor
|
||||
with XRD triggering at low and high energy ranges.
|
||||
Start and Stop define the energy range for the scan, scan_time is the time for one scan cycle and scan_duration
|
||||
is the duration of the scan. If scan duration is set to 0, the scan will run infinitely.
|
||||
t_kink and p_kink add a kink to the motion profile to slow down in the exafs region of the scan.
|
||||
|
||||
Args:
|
||||
start (float): Start angle for the scan.
|
||||
stop (float): Stop angle for the scan.
|
||||
scan_time (float): Time for one oscillation .
|
||||
scan_duration (float): Total duration of the scan.
|
||||
t_kink (float): Time of the kink.
|
||||
p_kink (float): Position of the kink.
|
||||
xrd_enable_low (bool): Enable XRD triggering for the low energy range.
|
||||
num_trigger_low (int): Number of triggers for the low energy range.
|
||||
exp_time_low (float): Exposure time for the low energy range.
|
||||
cycle_low (int): Specify how often the triggers should be considered, every nth cycle for low
|
||||
xrd_enable_high (bool): Enable XRD triggering for the high energy range.
|
||||
num_trigger_high (int): Number of triggers for the high energy range.
|
||||
exp_time_high (float): Exposure time for the high energy range.
|
||||
cycle_high (int): Specify how often the triggers should be considered, every nth cycle for high
|
||||
motor (DeviceBase, optional): Motor device to be used for the scan. Defaults to "mo1_bragg".
|
||||
|
||||
Examples:
|
||||
>>> scans.xas_advanced_scan_with_xrd(start=9, stop=11, scan_time=0.5, scan_duration=10, t_kink=0.15, p_kink=1, xrd_enable_low=True, num_trigger_low=5, cycle_low=2, exp_time_low=100, xrd_enable_high=False, num_trigger_high=3, cycle_high=1, exp_time_high=1000)
|
||||
"""
|
||||
super().__init__(
|
||||
start=start,
|
||||
stop=stop,
|
||||
scan_time=scan_time,
|
||||
scan_duration=scan_duration,
|
||||
t_kink=t_kink,
|
||||
p_kink=p_kink,
|
||||
motor=motor,
|
||||
**kwargs,
|
||||
)
|
||||
self.t_kink = t_kink
|
||||
self.p_kink = p_kink
|
||||
self.xrd_enable_low = xrd_enable_low
|
||||
self.num_trigger_low = num_trigger_low
|
||||
self.exp_time_low = exp_time_low
|
||||
self.cycle_low = cycle_low
|
||||
self.xrd_enable_high = xrd_enable_high
|
||||
self.num_trigger_high = num_trigger_high
|
||||
self.exp_time_high = exp_time_high
|
||||
self.cycle_high = cycle_high
|
||||
Reference in New Issue
Block a user