153 lines
6.7 KiB
Python
153 lines
6.7 KiB
Python
###################################################################################################
|
|
# Deployment specific global definitions - executed after startup.py
|
|
###################################################################################################
|
|
|
|
def trig_ccd():
|
|
if ccd.dataMatrix in SENSORS:
|
|
if ccd.isSimulated():
|
|
time.sleep(0.1)
|
|
else:
|
|
image_id = ccd.currentImageCount
|
|
ccd.start()
|
|
ccd.waitReady(-1)
|
|
ccd.waitNewImage(5000, image_id)
|
|
|
|
|
|
def is_beam_ok():
|
|
return True
|
|
|
|
def wait_beam():
|
|
if not is_beam_ok():
|
|
print "Waiting for beam..."
|
|
while not beam_ok:
|
|
time.sleep(0.1)
|
|
print "Beam ok"
|
|
|
|
def before_readout():
|
|
wait_beam()
|
|
trig_ccd()
|
|
|
|
def after_readout(rec, scan):
|
|
if not is_beam_ok():
|
|
rec.invalidate()
|
|
|
|
def after_scan():
|
|
pass
|
|
|
|
|
|
#Scanning exposure
|
|
class exposure_index (Writable, Readable):
|
|
def __init__(self):
|
|
self.pos=0.0
|
|
|
|
def read(self):
|
|
return self.pos
|
|
|
|
def write(self, value):
|
|
ccd.setExposure(EXPOSURES[int(value)])
|
|
self.pos = value
|
|
|
|
class exposure (Readable):
|
|
def read(self):
|
|
return ccd.exposure
|
|
|
|
#High level commands
|
|
def scan_2d(range_x, range_y, steps_x, steps_y, exposures=None, settling_time=0.1, zigzag=True, compression=False, dry_run=False):
|
|
"""Relative area scan on sample sample_x and sample_y. A 2D scan is performed if 'exposures' is not defined.
|
|
Otherwise a 3D scan is performed, where the third dimension correspond to the exposure indexes.
|
|
|
|
Args:
|
|
range_x(float or list): the relative range for sample x [start, stop]. If a float value is used, the range is set to [-value, value].
|
|
range_y(float or list): the relative range for sample y [start, stop]. If a float value is used, the range is set to [-value, value].
|
|
steps_x(int): number of steps for sample_x
|
|
steps_y(int): number of steps for sample_y
|
|
exposures(list of float, optional): f specified, samples for each exposure time value in each xy position.
|
|
settling_time(float, optional): time in seconds to wait after positioners are set, before sampling sensors.
|
|
zigzag(boolean, optional): if True each fast changing dimension revert direction after finishing a line.
|
|
compression(boolean, optional): if True images are saved compressed.
|
|
dry_run(boolean, optional): if True uses dummy_x and dummy_y instead of sample_x and sample_y.
|
|
|
|
Returns:
|
|
ScanResult object
|
|
"""
|
|
if type(range_x)==float: range_x =[-range_x, range_x]
|
|
if type(range_y)==float: range_y =[-range_y, range_y]
|
|
return run("templates/Scan2D", { \
|
|
"DRY_RUN": dry_run, \
|
|
"RANGE_X": [float(range_x[0]), float(range_x[1])], \
|
|
"RANGE_Y": [float(range_y[0]), float(range_y[1])], \
|
|
"STEPS": [int(steps_x), int(steps_y)], \
|
|
"EXPOSURES": exposures, \
|
|
"SETTLING_TIME": settling_time, \
|
|
"ZIGZAG": zigzag, \
|
|
"COMPRESSION": compression
|
|
})
|
|
|
|
def scan_2d(center_x, center_y, steps_x, steps_y, exposures=None, settling_time=0.1, zigzag=True, compression=False, dry_run=False):
|
|
"""Relative area scan on sample sample_x and sample_y. A 2D scan is performed if 'exposures' is not defined.
|
|
Otherwise a 3D scan is performed, where the third dimension correspond to the exposure indexes.
|
|
|
|
Args:
|
|
range_x(float or list): the relative range for sample x [start, stop]. If a float value is used, the range is set to [-value, value].
|
|
range_y(float or list): the relative range for sample y [start, stop]. If a float value is used, the range is set to [-value, value].
|
|
steps_x(int): number of steps for sample_x
|
|
steps_y(int): number of steps for sample_y
|
|
exposures(list of float, optional): f specified, samples for each exposure time value in each xy position.
|
|
settling_time(float, optional): time in seconds to wait after positioners are set, before sampling sensors.
|
|
zigzag(boolean, optional): if True each fast changing dimension revert direction after finishing a line.
|
|
compression(boolean, optional): if True images are saved compressed.
|
|
dry_run(boolean, optional): if True uses dummy_x and dummy_y instead of sample_x and sample_y.
|
|
|
|
Returns:
|
|
ScanResult object
|
|
"""
|
|
if type(range_x)==float: range_x =[-range_x, range_x]
|
|
if type(range_y)==float: range_y =[-range_y, range_y]
|
|
return run("templates/Scan2D", { \
|
|
"DRY_RUN": dry_run, \
|
|
"RANGE_X": [float(range_x[0]), float(range_x[1])], \
|
|
"RANGE_Y": [float(range_y[0]), float(range_y[1])], \
|
|
"STEPS": [int(steps_x), int(steps_y)], \
|
|
"EXPOSURES": exposures, \
|
|
"SETTLING_TIME": settling_time, \
|
|
"ZIGZAG": zigzag, \
|
|
"COMPRESSION": compression
|
|
})
|
|
|
|
|
|
def regine(center_x, center_y, steps_x, steps_y, step_size_x, step_size_y, noise=0.0, exposures=None, settling_time=0.1, zigzag=True, compression=False, dry_run=False):
|
|
"""Relative area scan on sample sample_x and sample_y. A 2D scan is performed if 'exposures' is not defined.
|
|
Otherwise a 3D scan is performed, where the third dimension correspond to the exposure indexes.
|
|
|
|
Args:
|
|
center_x(float): Center position of sample_x
|
|
center_y(float): Center position of sample_y
|
|
steps_x(int): number of steps for sample_x
|
|
steps_y(int): number of steps for sample_y
|
|
step_size_x(float): step size for sample_x
|
|
step_size_y(float): step size for sample_y
|
|
noise(float): noise added to sample_x and sample_y positions, as fraction of the step.
|
|
exposures(list of float, optional): f specified, samples for each exposure time value in each xy position.
|
|
settling_time(float, optional): time in seconds to wait after positioners are set, before sampling sensors.
|
|
zigzag(boolean, optional): if True each fast changing dimension revert direction after finishing a line.
|
|
compression(boolean, optional): if True images are saved compressed.
|
|
dry_run(boolean, optional): if True uses dummy_x and dummy_y instead of sample_x and sample_y.
|
|
|
|
Returns:
|
|
ScanResult object
|
|
"""
|
|
return run("templates/Regine", { \
|
|
"DRY_RUN": dry_run, \
|
|
"CENTER_X": float(center_x), \
|
|
"CENTER_Y": float(center_y), \
|
|
"STEPS_X": int(steps_x), \
|
|
"STEPS_Y": int(steps_y), \
|
|
"STEP_SIZE_X": float(step_size_x), \
|
|
"STEP_SIZE_Y": float(step_size_y), \
|
|
"NOISE": float(noise), \
|
|
"EXPOSURES": exposures, \
|
|
"SETTLING_TIME": settling_time, \
|
|
"ZIGZAG": zigzag, \
|
|
"COMPRESSION": compression
|
|
})
|