Files
x11ma/script/templates/FocusScan.py
2021-05-11 14:39:04 +02:00

64 lines
2.1 KiB
Python
Executable File

SETTLING_TIME =0.5
MAX_CONTRAST = 10e14
import java.awt.Rectangle as Rectangle
class RoiContrast(ReadonlyRegisterBase):
def doRead(self):
if hasattr(self, "roi"):
return image.getData().getGradientVariance(False, self.roi)
return 0.0
def getName(self):
return "roi_contrast"
def set_roi(self, roi):
self.roi=roi
if get_device("image_contrast") is None:
add_device(image.getContrast(), False)
if get_device("roi_contrast") is None:
add_device(RoiContrast(), False)
def scan_focus(positioner, pos_range, pos_step, roi = None, average = 1, update_position = True):
def after_read(rec):
if rec[positioner] > MAX_CONTRAST:
print "Invalid contrast value"
time.sleep(eiger.exposure)
rec.invalidate()
def before_pass(scan, num_pass):
print "Waiting to reach scan init pos"
time.sleep(1.0)
if roi is None:
sensor = image_contrast
else:
sensor = roi_contrast
roi_contrast.set_roi(roi)
if average > 1:
sensor = create_averager(sensor, average, interval = eiger.exposure, name = image_contrast.name, monitored = False)
r = lscan( positioner, [sensor,], -pos_range, pos_range, pos_step, \
latency=eiger.exposure+SETTLING_TIME, relative=True, after_read=after_read, before_pass=before_pass)
ydata, xdata = r[sensor], r[positioner]
if average > 1:
ydata = [v.doubleValue() for v in ydata]
(norm, mn, std ) = fit (ydata, xdata, limit_to_range=True)
range_scan = (min(r[positioner]), max(r[positioner]))
if (mn is not None) and (range_scan[0] <= mn <= range_scan[1]):
print "Valid fit for ", positioner.name, mn
if update_position:
time.sleep(0.5) # Wait restoring positions
print "Updating position: ", positioner.name, mn
positioner.write(mn)
else:
print "Invalid fit for ", positioner.name, mn, range_scan
time.sleep(1.0) # Wait restoring positions
return r