Start autofocus from base of range for speed
This commit is contained in:
parent
53eb51e964
commit
528406137f
3 changed files with 16 additions and 14 deletions
|
|
@ -33,14 +33,14 @@ def unpack_autofocus(scan_data):
|
||||||
|
|
||||||
jpeg_heights = np.interp(jpeg_times, stage_times, stage_height)
|
jpeg_heights = np.interp(jpeg_times, stage_times, stage_height)
|
||||||
|
|
||||||
turning = np.where(turningpoints(jpeg_heights))[0] + 1
|
turning = np.where(turningpoints(jpeg_heights))[0]
|
||||||
|
|
||||||
return jpeg_heights[turning[0] : turning[1]], jpeg_sizes_MB[turning[0] : turning[1]]
|
return jpeg_heights[turning[0] : turning[1]], jpeg_sizes_MB[turning[0] : turning[1]]
|
||||||
|
|
||||||
|
|
||||||
class RecentringThing(Thing):
|
class RecentringThing(Thing):
|
||||||
@thing_action
|
@thing_action
|
||||||
def looping_autofocus(self, autofocus: AutofocusDep, stage: StageDep, dz=2000):
|
def looping_autofocus(self, autofocus: AutofocusDep, stage: StageDep, dz=2000, start='centre'):
|
||||||
"""Repeatedly autofocus the stage until it looks focused.
|
"""Repeatedly autofocus the stage until it looks focused.
|
||||||
|
|
||||||
This action will run the `fast_autofocus` action until it settles on a point
|
This action will run the `fast_autofocus` action until it settles on a point
|
||||||
|
|
@ -51,17 +51,17 @@ class RecentringThing(Thing):
|
||||||
repeat = True
|
repeat = True
|
||||||
attempts = 0
|
attempts = 0
|
||||||
while repeat and attempts < 10:
|
while repeat and attempts < 10:
|
||||||
height_min = stage.position["z"] - dz / 2
|
data = autofocus.fast_autofocus(dz=dz, start=start)
|
||||||
height_max = stage.position["z"] + dz / 2
|
|
||||||
data = autofocus.fast_autofocus(dz=dz)
|
|
||||||
heights, _ = unpack_autofocus(data)
|
heights, _ = unpack_autofocus(data)
|
||||||
time.sleep(0.3)
|
height_min = np.min(heights)
|
||||||
|
height_max = np.max(heights)
|
||||||
# TODO: max heights seems badly wrong! Something about turning?
|
# TODO: max heights seems badly wrong! Something about turning?
|
||||||
if (
|
if (
|
||||||
stage.position["z"] - height_min < dz / 5
|
stage.position["z"] - height_min < dz / 5
|
||||||
or height_max - stage.position["z"] < dz / 5
|
or height_max - stage.position["z"] < dz / 5
|
||||||
):
|
):
|
||||||
attempts += 1
|
attempts += 1
|
||||||
|
start = 'centre'
|
||||||
else:
|
else:
|
||||||
repeat = False
|
repeat = False
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,8 @@ class AutofocusThing(Thing):
|
||||||
def fast_autofocus(
|
def fast_autofocus(
|
||||||
self,
|
self,
|
||||||
m: SharpnessMonitorDep,
|
m: SharpnessMonitorDep,
|
||||||
dz: int=2000
|
dz: int=2000,
|
||||||
|
start: str='centre',
|
||||||
) -> SharpnessDataArrays:
|
) -> SharpnessDataArrays:
|
||||||
"""Sweep the stage up and down, then move to the sharpest point
|
"""Sweep the stage up and down, then move to the sharpest point
|
||||||
|
|
||||||
|
|
@ -153,7 +154,8 @@ class AutofocusThing(Thing):
|
||||||
"""
|
"""
|
||||||
with m.run():
|
with m.run():
|
||||||
# Move to (-dz / 2)
|
# Move to (-dz / 2)
|
||||||
m.focus_rel(-dz / 2)
|
if start == 'centre':
|
||||||
|
m.focus_rel(-dz / 2)
|
||||||
# Move to dz while monitoring sharpness
|
# Move to dz while monitoring sharpness
|
||||||
# i: Sharpness monitor index for this move
|
# i: Sharpness monitor index for this move
|
||||||
# z: Final z position after move
|
# z: Final z position after move
|
||||||
|
|
|
||||||
|
|
@ -480,15 +480,15 @@ class SmartScanThing(Thing):
|
||||||
|
|
||||||
# TODO: combine this with the move below for speed (I think this could just be "else")
|
# TODO: combine this with the move below for speed (I think this could just be "else")
|
||||||
logger.info(f"Moving to {loc}")
|
logger.info(f"Moving to {loc}")
|
||||||
stage.move_absolute(x=int(loc[0]), y=int(loc[1]), z=int(loc[2]))
|
|
||||||
|
|
||||||
if len(focused_path) > 1:
|
if len(focused_path) > 1:
|
||||||
z_index = closest(loc, focused_path)
|
z_index = closest(loc, focused_path)
|
||||||
|
z=int(focused_path[z_index][2])
|
||||||
# print('Moving to {0}'.format([coords[0], coords[1], focused_path[z_index][2]]))
|
# print('Moving to {0}'.format([coords[0], coords[1], focused_path[z_index][2]]))
|
||||||
# print(focused_path)
|
# print(focused_path)
|
||||||
stage.move_absolute(
|
stage.move_absolute(
|
||||||
x=int(loc[0]), y=int(loc[1]), z=int(focused_path[z_index][2])
|
x=int(loc[0]), y=int(loc[1]), z = z - self.autofocus_dz / 2
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check if the image is background
|
# Check if the image is background
|
||||||
if self.skip_background:
|
if self.skip_background:
|
||||||
|
|
@ -517,7 +517,7 @@ class SmartScanThing(Thing):
|
||||||
attempts = 0
|
attempts = 0
|
||||||
if self.autofocus_dz > 200:
|
if self.autofocus_dz > 200:
|
||||||
while True:
|
while True:
|
||||||
recentre.looping_autofocus(dz=self.autofocus_dz)
|
recentre.looping_autofocus(dz=self.autofocus_dz, start = 'base')
|
||||||
current_height = stage.position["z"]
|
current_height = stage.position["z"]
|
||||||
|
|
||||||
# if there have been successful autofocuses in this scan, find the closest one in x-y
|
# if there have been successful autofocuses in this scan, find the closest one in x-y
|
||||||
|
|
@ -542,7 +542,7 @@ class SmartScanThing(Thing):
|
||||||
focused_path.append(loc)
|
focused_path.append(loc)
|
||||||
break
|
break
|
||||||
if attempts >= 3:
|
if attempts >= 3:
|
||||||
logger.warning("Could not autofocus after 5 attempts.")
|
logger.warning("Could not autofocus after 3 attempts.")
|
||||||
break
|
break
|
||||||
# if the autofocus was rejected, we return to the height of the closest successful autofocus. not perfect, but better than wandering out of focus
|
# if the autofocus was rejected, we return to the height of the closest successful autofocus. not perfect, but better than wandering out of focus
|
||||||
logger.info(
|
logger.info(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue