From ed2cd24fb5303e2a16a5a1f98fa453123a1b7168 Mon Sep 17 00:00:00 2001 From: Johan Forsberg Date: Wed, 7 Jul 2021 12:41:07 +0200 Subject: [PATCH 1/6] Add some helpful output to the ctscan macro. Outputs a table of motor information before running a continuous scan, e.g. velocity, acceleration etc. --- src/sardana/macroserver/scan/gscan.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/sardana/macroserver/scan/gscan.py b/src/sardana/macroserver/scan/gscan.py index fe0fe1642..88d4299e9 100644 --- a/src/sardana/macroserver/scan/gscan.py +++ b/src/sardana/macroserver/scan/gscan.py @@ -52,6 +52,8 @@ from taurus.core.util.threadpool import ThreadPool from taurus.core.util.event import CallableRef from taurus.core.tango.tangovalidator import TangoDeviceNameValidator +from taurus.console import Alignment +from taurus.console.list import List from sardana.sardanathreadpool import OmniWorker from sardana.util.tree import BranchNode, LeafNode, Tree @@ -2470,6 +2472,12 @@ def _go_through_waypoints(self): self.on_waypoints_end() return + # Output some helpful info about the settings that are to be used + Left, Right, HCenter = Alignment.Left, Alignment.Right, Alignment.HCenter + out = List(cols=["Motor", "Velocity", "Acceleration", "Deceleration", "Start", "End"], + text_alignment=[Left, Right, Right, Right, Right, Right], + max_col_width=[-1, -1, -1, -1, -1, -1]) + # prepare motor(s) to move with their maximum velocity for path in motion_paths: motor = path.moveable @@ -2480,6 +2488,12 @@ def _go_through_waypoints(self): 'end: %f; ' % path.final_pos + 'ds: %f' % (path.final_pos - path.initial_pos)) + out.appendRow([motor.getName(), + path.max_vel, + path.max_vel_time, + path.min_vel_time, + path.initial_pos, + path.final_pos]) attributes = OrderedDict(velocity=path.max_vel, acceleration=path.max_vel_time, deceleration=path.min_vel_time) @@ -2493,6 +2507,9 @@ def _go_through_waypoints(self): msg = "Error when configuring scan motion (%s)" % e raise ScanException(msg) + for line in out.genOutput(): + self.output(line) + if macro.isStopped(): self.on_waypoints_end() return From 48fbe3c7a2694eeb2a15b89975ddaeae09ea8379 Mon Sep 17 00:00:00 2001 From: Johan Forsberg Date: Thu, 8 Jul 2021 09:07:53 +0200 Subject: [PATCH 2/6] Fix a couple of mistakes. --- src/sardana/macroserver/scan/gscan.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sardana/macroserver/scan/gscan.py b/src/sardana/macroserver/scan/gscan.py index 88d4299e9..782e244ee 100644 --- a/src/sardana/macroserver/scan/gscan.py +++ b/src/sardana/macroserver/scan/gscan.py @@ -2474,7 +2474,7 @@ def _go_through_waypoints(self): # Output some helpful info about the settings that are to be used Left, Right, HCenter = Alignment.Left, Alignment.Right, Alignment.HCenter - out = List(cols=["Motor", "Velocity", "Acceleration", "Deceleration", "Start", "End"], + out = List(["Motor", "Velocity", "Acceleration", "Deceleration", "Start", "End"], text_alignment=[Left, Right, Right, Right, Right, Right], max_col_width=[-1, -1, -1, -1, -1, -1]) @@ -2508,7 +2508,7 @@ def _go_through_waypoints(self): raise ScanException(msg) for line in out.genOutput(): - self.output(line) + self.macro.output(line) if macro.isStopped(): self.on_waypoints_end() From 5c4a440efcb740a956b6f12e7567dffa179718ce Mon Sep 17 00:00:00 2001 From: Johan Forsberg Date: Fri, 9 Jul 2021 08:34:37 +0200 Subject: [PATCH 3/6] Clean up motor settings table output. --- src/sardana/macroserver/scan/gscan.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/sardana/macroserver/scan/gscan.py b/src/sardana/macroserver/scan/gscan.py index 782e244ee..880b34d76 100644 --- a/src/sardana/macroserver/scan/gscan.py +++ b/src/sardana/macroserver/scan/gscan.py @@ -2472,11 +2472,12 @@ def _go_through_waypoints(self): self.on_waypoints_end() return - # Output some helpful info about the settings that are to be used - Left, Right, HCenter = Alignment.Left, Alignment.Right, Alignment.HCenter - out = List(["Motor", "Velocity", "Acceleration", "Deceleration", "Start", "End"], - text_alignment=[Left, Right, Right, Right, Right, Right], - max_col_width=[-1, -1, -1, -1, -1, -1]) + # a table of motor settings + motor_table = List(["Motor", "Velocity", "Acceleration", + "Deceleration", "Start", "End"], + header_separator=None, + text_alignment=[Alignment.HCenter] * 6, + max_col_width=[-1] * 6) # prepare motor(s) to move with their maximum velocity for path in motion_paths: @@ -2488,12 +2489,13 @@ def _go_through_waypoints(self): 'end: %f; ' % path.final_pos + 'ds: %f' % (path.final_pos - path.initial_pos)) - out.appendRow([motor.getName(), - path.max_vel, - path.max_vel_time, - path.min_vel_time, - path.initial_pos, - path.final_pos]) + cell_format = "%g" # TODO is this the proper format to use? + motor_table.appendRow([motor.getName(), + cell_format % path.max_vel, + cell_format % path.max_vel_time, + cell_format % path.min_vel_time, + cell_format % path.initial_pos, + cell_format % path.final_pos]) attributes = OrderedDict(velocity=path.max_vel, acceleration=path.max_vel_time, deceleration=path.min_vel_time) @@ -2507,8 +2509,9 @@ def _go_through_waypoints(self): msg = "Error when configuring scan motion (%s)" % e raise ScanException(msg) - for line in out.genOutput(): + for line in motor_table.genOutput(): self.macro.output(line) + self.macro.output("") if macro.isStopped(): self.on_waypoints_end() From 62453051f2bf8556c1681f5ab0c25010c6d9dffc Mon Sep 17 00:00:00 2001 From: Johan Forsberg Date: Fri, 9 Jul 2021 08:35:59 +0200 Subject: [PATCH 4/6] Delay output of scan table header until first point arrives. --- src/sardana/macroserver/recorders/output.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/sardana/macroserver/recorders/output.py b/src/sardana/macroserver/recorders/output.py index 79983b640..acf9a6ef1 100644 --- a/src/sardana/macroserver/recorders/output.py +++ b/src/sardana/macroserver/recorders/output.py @@ -141,6 +141,7 @@ def __init__(self, stream, cols=None, number_fmt='%8.4f', col_width=8, cols = None self._columns = cols self._output_block = output_block + self._header_shown = False def _startRecordList(self, recordlist): starttime = recordlist.getEnvironValue('starttime').ctime() @@ -215,9 +216,7 @@ def _startRecordList(self, recordlist): self._scan_line_t = [(col_names[0], '%%(%s)8d' % col_names[0])] self._scan_line_t += [(name, cell_t_number % name) for name in col_names[1:]] - - self._stream()._output(header) - self._stream()._flushOutput() + self._header = header def _endRecordList(self, recordlist): self._stream()._flushOutput() @@ -243,9 +242,14 @@ def _endRecordList(self, recordlist): info_string = 'Scan #%s ended at %s, taking %s. ' + \ 'Dead time %.1f%% (motion dead time %.1f%%)' self._stream().info(info_string % (serialno, endtime, totaltime, - deadtime_perc, motiontime_perc)) + deadtime_perc, motiontime_perc)) def _writeRecord(self, record): + if not self._header_shown: + # show column headers + self._stream()._output(self._header) + self._stream()._flushOutput() + self._header_shown = True cells = [] for i, (name, cell) in enumerate(self._scan_line_t): cell_data = record.data[name] From a8d24160bff59c449278e20c110a176e121b35a4 Mon Sep 17 00:00:00 2001 From: Johan Forsberg Date: Fri, 9 Jul 2021 10:09:48 +0200 Subject: [PATCH 5/6] Add commented out code to print restored motor config at the end of ascanct. --- src/sardana/macroserver/scan/gscan.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/sardana/macroserver/scan/gscan.py b/src/sardana/macroserver/scan/gscan.py index 880b34d76..ae405110c 100644 --- a/src/sardana/macroserver/scan/gscan.py +++ b/src/sardana/macroserver/scan/gscan.py @@ -2623,6 +2623,25 @@ def on_waypoints_end(self, restore_positions=None): self.join_thread_pool() self.macro.debug("All data events are processed") + # Note: The commented out code below works, but due to an issue with + # output of the last measurement point, it should not be enabled yet. + # See https://github.com/sardana-org/sardana/issues/1651 + + # # Output the restored motor settings + # out = List(["Motor", "Velocity", "Acceleration", "Deceleration"], + # header_separator=None, + # text_alignment=[Alignment.HCenter] * 4, + # max_col_width=[-1] * 4) + # cell_format = "%g" + # for motor_backup in self._backup: + # out.appendRow([motor_backup["moveable"].getName(), + # cell_format % motor_backup["velocity"], + # cell_format % motor_backup["acceleration"], + # cell_format % motor_backup["deceleration"]]) + # self.macro.output("") + # for line in out.genOutput(): + # self.macro.output(line) + def scan_loop(self): macro = self.macro # manager = macro.getManager() From 1d2e4bfd240471ccd135761f094945912657b8ef Mon Sep 17 00:00:00 2001 From: Johan Forsberg Date: Fri, 9 Jul 2021 12:41:19 +0200 Subject: [PATCH 6/6] Some output format tweaks. --- src/sardana/macroserver/scan/gscan.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sardana/macroserver/scan/gscan.py b/src/sardana/macroserver/scan/gscan.py index ae405110c..905cf7733 100644 --- a/src/sardana/macroserver/scan/gscan.py +++ b/src/sardana/macroserver/scan/gscan.py @@ -2473,8 +2473,9 @@ def _go_through_waypoints(self): return # a table of motor settings - motor_table = List(["Motor", "Velocity", "Acceleration", - "Deceleration", "Start", "End"], + # ("u" is short for "unit", to save space) + motor_table = List(["Motor", "Velocity[u/s]", "Acceleration[s]", + "Deceleration[s]", "Start[u]", "End[u]"], header_separator=None, text_alignment=[Alignment.HCenter] * 6, max_col_width=[-1] * 6) @@ -2509,6 +2510,7 @@ def _go_through_waypoints(self): msg = "Error when configuring scan motion (%s)" % e raise ScanException(msg) + self.macro.output("") for line in motor_table.genOutput(): self.macro.output(line) self.macro.output("")