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:
commit
164cf43277
1 changed files with 55 additions and 0 deletions
|
|
@ -45,6 +45,33 @@ class JPEGSharpnessMonitor:
|
||||||
self.camera.stream.stop_tracking()
|
self.camera.stream.stop_tracking()
|
||||||
self.camera.stream.reset_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]:
|
def focus_rel(self, dz: int, backlash: bool = False, **kwargs) -> Tuple[int, int]:
|
||||||
# Store the start time and position
|
# Store the start time and position
|
||||||
self.camera.stream.start_tracking()
|
self.camera.stream.start_tracking()
|
||||||
|
|
@ -496,6 +523,34 @@ class AutofocusExtension(BaseExtension):
|
||||||
# Return all focus data
|
# Return all focus data
|
||||||
return m.data_dict()
|
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(
|
@extension_action(
|
||||||
args={
|
args={
|
||||||
"dz": fields.Int(
|
"dz": fields.Int(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue