Merge branch 'settling_times' into 'master'

Added measure_settling_time function to autofocus

See merge request openflexure/openflexure-microscope-server!149
This commit is contained in:
Richard Bowman 2022-01-17 11:45:31 +00:00
commit 164cf43277

View file

@ -45,6 +45,33 @@ class JPEGSharpnessMonitor:
self.camera.stream.stop_tracking()
self.camera.stream.reset_tracking()
def hold(self, delay: int = 5):
"""Run time.sleep for delay seconds,
while monitoring the JPEG frame size of the stream"""
self.camera.stream.start_tracking()
self.stage_times.append(time.time())
self.stage_positions.append(self.stage.position)
time.sleep(delay)
self.camera.stream.stop_tracking()
self.stage_times.append(time.time())
self.stage_positions.append(self.stage.position)
# Retrieve frame data
for frame in self.camera.stream.frames:
# Make timestamp absolute Unix time
self.jpeg_times.append(frame.time)
self.jpeg_sizes.append(frame.size)
# Clear frame data for this move from the stream
self.camera.stream.reset_tracking()
# Index of the data for this movement
data_index: int = len(self.stage_positions) - 2
# Final z position after move
final_z_position: int = self.stage_positions[-1][2]
return data_index, final_z_position
def focus_rel(self, dz: int, backlash: bool = False, **kwargs) -> Tuple[int, int]:
# Store the start time and position
self.camera.stream.start_tracking()
@ -496,6 +523,34 @@ class AutofocusExtension(BaseExtension):
# Return all focus data
return m.data_dict()
@extension_action(
args={
"dz": fields.Int(
missing=500,
example=500,
description="Total Z range to move down, then up (in stage steps)",
),
"delay": fields.Int(
missing=5,
example=5,
description="How long to measure sharpness for after the move",
),
}
)
def measure_settling_time(
self, microscope: Optional[Microscope] = None, delay: int = 2, dz: int = 400
) -> Dict[str, np.ndarray]:
"""Make a Z move down then up by dz, then pause for delay while monitoring sharpness.
This is useful so we can see how long we need to wait for the sharpness value to converge"""
if not microscope:
microscope = find_microscope_with_real_stage()
with microscope.lock(timeout=1), microscope.camera.lock, microscope.stage.lock:
with monitor_sharpness(microscope) as m:
m.focus_rel(-dz)
m.focus_rel(dz)
m.hold(delay)
return m.data_dict()
@extension_action(
args={
"dz": fields.Int(