From 5b46464ef9e949072d5341f080eb35eb06b1310c Mon Sep 17 00:00:00 2001 From: "gac-x01da (Resp. Clark Adam Hugh)" Date: Wed, 11 Sep 2024 09:53:41 +0200 Subject: [PATCH] Added scan classes for both advanced scans --- debye_bec/devices/mo1_bragg.py | 52 +++++++++++- debye_bec/scans/__init__.py | 2 +- debye_bec/scans/mono_bragg_scans.py | 125 ++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 5 deletions(-) diff --git a/debye_bec/devices/mo1_bragg.py b/debye_bec/devices/mo1_bragg.py index 35e9918..a882428 100644 --- a/debye_bec/devices/mo1_bragg.py +++ b/debye_bec/devices/mo1_bragg.py @@ -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}" diff --git a/debye_bec/scans/__init__.py b/debye_bec/scans/__init__.py index a34521c..3f20fbe 100644 --- a/debye_bec/scans/__init__.py +++ b/debye_bec/scans/__init__.py @@ -1 +1 @@ -from .mono_bragg_scans import XASSimpleScan, XASSimpleScanWithXRD +from .mono_bragg_scans import XASSimpleScan, XASSimpleScanWithXRD, XASAdvancedScan, XASAdvancedScanWithXRD diff --git a/debye_bec/scans/mono_bragg_scans.py b/debye_bec/scans/mono_bragg_scans.py index d20d4bb..d0947d6 100644 --- a/debye_bec/scans/mono_bragg_scans.py +++ b/debye_bec/scans/mono_bragg_scans.py @@ -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 \ No newline at end of file