Final docstring and testing updates based on code review

This commit is contained in:
Julian Stirling 2025-06-27 16:54:28 +01:00
parent 46f3d21632
commit 9a92fd478a
2 changed files with 48 additions and 24 deletions

View file

@ -156,6 +156,10 @@ def _get_capture_by_id(captures: list[CaptureInfo], buffer_id: int) -> CaptureIn
:param captures: A list of capture objects :param captures: A list of capture objects
:param buffer_id: The buffer id of the image to return :param buffer_id: The buffer id of the image to return
:returns: the CaptureInfo object of the capture with matching id
:raises: ValueError if buffer_id does not match the buffer_id of any captures
""" """
return captures[_get_capture_index_by_id(captures, buffer_id)] return captures[_get_capture_index_by_id(captures, buffer_id)]
@ -166,6 +170,10 @@ def _get_capture_index_by_id(captures: list[CaptureInfo], buffer_id: int) -> int
:param captures: A list of capture objects :param captures: A list of capture objects
:param buffer_id: The buffer id of the image to return :param buffer_id: The buffer id of the image to return
:returns: the list index of the capture with matching id
:raises: ValueError if buffer_id does not match the buffer_id of any captures
""" """
ids = [capture.buffer_id for capture in captures] ids = [capture.buffer_id for capture in captures]
if buffer_id not in ids: if buffer_id not in ids:
@ -435,15 +443,19 @@ class AutofocusThing(Thing):
The sharpest image, and optionally images around the sharpest, The sharpest image, and optionally images around the sharpest,
will be saved using their coordinates to images_dir will be saved using their coordinates to images_dir
Arguments:
images_dir: the folder to save all images
autofocus_dz: should the stack fail, the range to refocus over before retrying
variables cam to sharpness_monitor are Thing dependencies injected automatically by
LabThings FastAPI
Returns: :param cam: Camera Dependency supplied by LabThings dependency injection
A boolean, True if stack was successfully :param stage: Stage Dependency supplied by LabThings dependency injection
The z position of the sharpest image :param sharpness_monitor: Sharpness Monitor Dependency (for focus detection)
supplied by LabThings dependency injection
:param images_dir: the folder to save all images
:param autofocus_dz: the range to autofocus over if a stack fails
:param save_resolution: The resolution the images should be saved at, the
images will be resampled if this doesn't match the camera's capture resolution
:returns: A tuple containing:
- A boolean, True if stack was successfully
- The z position of the sharpest image
""" """
# Set the variables to prevent changes from the GUI or other windows # Set the variables to prevent changes from the GUI or other windows
@ -461,8 +473,8 @@ class AutofocusThing(Thing):
while trys < stack_parameters.max_attempts: while trys < stack_parameters.max_attempts:
success, captures, sharpest_id = self.z_stack( success, captures, sharpest_id = self.z_stack(
stack_parameters=stack_parameters, stack_parameters=stack_parameters,
stage=stage,
cam=cam, cam=cam,
stage=stage,
) )
if success: if success:
@ -549,21 +561,20 @@ class AutofocusThing(Thing):
def z_stack( def z_stack(
self, self,
stack_parameters: StackParams, stack_parameters: StackParams,
stage: Stage,
cam: WrappedCamera, cam: WrappedCamera,
stage: Stage,
) -> tuple[bool, list[CaptureInfo], Optional[int]]: ) -> tuple[bool, list[CaptureInfo], Optional[int]]:
"""Capture a series of images offset by stack_parameters.stack_dz, and test whether """Capture a series of images offset by stack_parameters.stack_dz, and test whether
the sharpest image is towards the centre of the stack. the sharpest image is towards the centre of the stack.
Returns: :param stack_parameters: a StackParams object holding stack parameters
:param cam: Camera Dependency to be passed through from the calling action
:param stage: Stage Dependency to be passed through from the calling action
:returns: A tuple of
- the stack result (True for successful stack, False for failed stack), - the stack result (True for successful stack, False for failed stack),
- a list of CaptureInfo objects, - a list of CaptureInfo objects,
- the buffer_id of the shapest image (or None if the stack failed) - the buffer_id of the shapest image (or None if the stack failed)
Arguments:
images_dir: a string of the path to write all images
stack_parameters: a StackParams object holding stack parameters
variables stage to metadata_getter are Thing dependencies passed through from the calling action
""" """
# Move down by the height of the z stack, plus an overshoot # Move down by the height of the z stack, plus an overshoot
# Better to start too low and take too many images than too high and need to refocus # Better to start too low and take too many images than too high and need to refocus
@ -613,10 +624,18 @@ class AutofocusThing(Thing):
cam: WrappedCamera, cam: WrappedCamera,
stage: Stage, stage: Stage,
buffer_max: int, buffer_max: int,
) -> list: ) -> CaptureInfo:
"""Capture another image and return the capture information. """Capture another image and return the capture information.
The capture is stored by the camera Thing, and can be saved by ID. The capture is stored by the camera Thing, and can be saved by ID.
:param cam: Camera Dependency to be passed through from the calling action
:param stage: Stage Dependency to be passed through from the calling action
:buffer_max: The maximum number of images to tell the camera to keep in memory
for saving once the stack is complete
:return: A CaatureInfo object containing the capture information including its
camera buffer_id needed for saving.
""" """
stage_location = stage.position stage_location = stage.position
buffer_id = cam.capture_to_memory(buffer_max=buffer_max) buffer_id = cam.capture_to_memory(buffer_max=buffer_max)
@ -630,17 +649,17 @@ class AutofocusThing(Thing):
self, captures: list[CaptureInfo] self, captures: list[CaptureInfo]
) -> tuple[Literal["success", "continue", "restart"], int]: ) -> tuple[Literal["success", "continue", "restart"], int]:
"""Test a list of captures, to decide whether the sharpest image from a """Test a list of captures, to decide whether the sharpest image from a
stack is within them stack is centrally enough in the stack
Returns two values, :param captures: a list of the capture objects to for testing if the
result - which is one of three literal values: sharpeness has converged in the centre
:return: A tuple with two values:
- result - which is one of three literal values:
'success' if the sharpest image is towards the centre 'success' if the sharpest image is towards the centre
'continue' if the sharpest image is in the final two images of the list 'continue' if the sharpest image is in the final two images of the list
'restart' if the sharpest image is in the first two images of the list 'restart' if the sharpest image is in the first two images of the list
capture_id - the buffer id of the sharpest image - capture_id - the buffer id of the sharpest image
Arguments:
sharpnesses: a list of the sharpnesses to test for focus
""" """
sharpest_index = np.argmax([capture.sharpness for capture in captures]) sharpest_index = np.argmax([capture.sharpness for capture in captures])
# The buffer id of the sharpest image # The buffer id of the sharpest image

View file

@ -226,7 +226,12 @@ def test_retrieval_of_captures(start):
assert _get_capture_index_by_id(captures, buffer_id) == i assert _get_capture_index_by_id(captures, buffer_id) == i
assert _get_capture_by_id(captures, buffer_id) is capture assert _get_capture_by_id(captures, buffer_id) is capture
# Check errors are raised when supplying ids that aren't int the list
with pytest.raises(ValueError): with pytest.raises(ValueError):
_get_capture_index_by_id(captures, start - 1) _get_capture_index_by_id(captures, start - 1)
with pytest.raises(ValueError): with pytest.raises(ValueError):
_get_capture_index_by_id(captures, start + 21) _get_capture_index_by_id(captures, start + 21)
with pytest.raises(ValueError):
_get_capture_by_id(captures, start - 1)
with pytest.raises(ValueError):
_get_capture_by_id(captures, start + 21)