64 lines
2.1 KiB
Python
Executable File
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
|