Neighbour cutoff moved from autofocus.py to scan_planners.py

This commit is contained in:
jaknapper 2025-06-23 14:13:08 +01:00
parent 2a0de9122b
commit 8ba40832e0
2 changed files with 8 additions and 8 deletions

View file

@ -20,6 +20,11 @@ XYPosList: TypeAlias = list[XYPos]
XYZPosList: TypeAlias = list[XYZPos] XYZPosList: TypeAlias = list[XYZPos]
# how many times the minimum distance between images to include as a "nearby" image
# default 1.4 includes images offset in x or y, but not diagonally
NEIGHBOUR_CUTOFF = 1.4
def enforce_xy_tuple(value: XYPos) -> XYPos: def enforce_xy_tuple(value: XYPos) -> XYPos:
""" """
Used for enforcing that an input is a tuple and is the correct length Used for enforcing that an input is a tuple and is the correct length
@ -214,7 +219,7 @@ class ScanPlanner:
Return the xyz position of the nearby site with the lowest z position. Return the xyz position of the nearby site with the lowest z position.
Lowest position is best, as starting too high causes smart stacking to Lowest position is best, as starting too high causes smart stacking to
autofocus and restart. Starting too low just requires extra movements in +z. autofocus and restart. Starting too low just requires extra movements in +z.
Nearby is defined as within 1.6 times the distance to the closest neighbour. Nearby is defined as within NEIGHBOUR_CUTOFF times the distance to the closest neighbour.
Returns None if there if no focussed locations are present Returns None if there if no focussed locations are present
""" """
@ -229,10 +234,9 @@ class ScanPlanner:
# Note linalg.norm always uses float64 # Note linalg.norm always uses float64
dists = np.linalg.norm((path_pos - current_pos), axis=1) dists = np.linalg.norm((path_pos - current_pos), axis=1)
# Get indices of all focused sites within 1.6x the minimum distance. # Get indices of all focused sites within NEIGHBOUR_CUTOFF the minimum distance.
# 1.6x chosen as it includes offsets in x and y on the Picamera2 aspect ratio
# Note np.where always returns a tuple of arrays, hence the trailing [0] # Note np.where always returns a tuple of arrays, hence the trailing [0]
indices = np.where(dists <= 1.6 * np.min(dists))[0] indices = np.where(dists <= NEIGHBOUR_CUTOFF * np.min(dists))[0]
# Turning into an array allows slicing based on a list # Turning into an array allows slicing based on a list
focused_locations_array = np.array(self._focused_locations) focused_locations_array = np.array(self._focused_locations)

View file

@ -41,10 +41,6 @@ class StackParams(BaseModel):
# distance (in steps) to overshoot a move and then undo, to account for backlash # distance (in steps) to overshoot a move and then undo, to account for backlash
backlash_correction: int = 250 backlash_correction: int = 250
# how many times the minimum distance between images to include as a "nearby" image
# default 1.4 includes images offset in x or y, but not diagonally
neighbour_cutoff: float = 1.4
# how many images can be appended to the stack after the predicted peak to test for focus # how many images can be appended to the stack after the predicted peak to test for focus
# before assuming the focus was passed, and restarting the stack # before assuming the focus was passed, and restarting the stack
stack_height_limit: int = 15 stack_height_limit: int = 15