Source code for contrast.scans.AScan

from .Scan import SoftwareScan
from ..environment import macro, MacroSyntaxError
from ..motors import all_are_motors
import numpy as np
import time


[docs]@macro class AScan(SoftwareScan): """ Software scan one or more motors in parallel. :: ascan <motor1> <start> <stop> ... <intervals> <exp_time> """ def __init__(self, *args, **kwargs): self.motors = [] self.limits = [] try: exposuretime = float(args[-1]) self.intervals = int(args[-2]) super(AScan, self).__init__(exposuretime) for i in range(int((len(args) - 2) / 3)): self.motors.append(args[3 * i]) self.limits.append( [float(m) for m in args[3 * i + 1:3 * i + 3]]) self.n_positions = self.intervals + 1 assert all_are_motors(self.motors) assert (len(args) - 2) % 3 == 0 except: raise MacroSyntaxError def _generate_positions(self): positions = [] for i in range(len(self.motors)): positions.append(np.linspace(self.limits[i][0], self.limits[i][1], self.intervals + 1)) for i in range(len(positions[0])): yield {m.name: pos[i] for (m, pos) in zip(self.motors, positions)}
[docs]@macro class DScan(AScan): """ Software scan one or more motors in parallel, with positions relative to each motor's current one. Moves back afterwards. :: dscan <motor1> <start> <stop> <intervals> ... <exp_time> """ def _generate_positions(self): current = {m.name: m.position() for m in self.motors} for pos in super(DScan, self)._generate_positions(): for i, m in enumerate(self.motors): pos[m.name] += current[m.name] yield pos def run(self): old_pos = [m.position() for m in self.motors] super(DScan, self).run() # wait for motors then move them back while True in [m.busy() for m in self.motors]: time.sleep(.01) print('Returning motors to their starting positions...') for m, pos in zip(self.motors, old_pos): m.move(pos) while True in [m.busy() for m in self.motors]: time.sleep(.01) print('...done')