Timelapse of timelapses and z-stacks

This notebook shows how to repeatedly acquire a short time series and then a z stack at a set with a set delay in between.

In this example we acquire a time series of duration = 2 seconds and then a z stack parameterized by z_start = -2.5; z_end = 2.5; z_step = 0.25 every subset_interval = 20 seconds for total_duration = 60 seconds. That is, we acquire data subsets containing a 2 second time series and a 5 micrometer z stack every 20 seconds over the span of 60 seconds.

Using pycro-manager this set of acquisition events is encoded as follows:

events = []
for s in range(num_subsets):
    for t in range(num_time_points):
        events.append(
            {
                "axes": {"subset": s, "time": t, "z": 0},
                "z": z_sequence[0],
                "min_start_time": s * subset_interval,
            }
        )
    for z in range(num_z_slices):
        events.append(
            {
                "axes": {"subset": s, "time": num_time_points, "z": z},
                "z": z_sequence[z],
                "min_start_time": s * subset_interval,
            }
        )
[ ]:
import numpy as np

from pycromanager import Acquisition, Core, Studio, multi_d_acquisition_events

Construct java objects

[8]:
mmc = Core()
mmStudio = Studio()

Set acquisition parameters

[9]:
# Data set parameters
path = r"C:\test"
name = "pycromanager test"
total_duration = 60  # in seconds
subset_interval = 20  # in seconds

# z stack parameters
z_start = -2.5
z_end = 2.5
z_step = 0.25
relative = True
sequence = False

# time series parameters
duration = 2  # in seconds
framerate = 10

num_subsets = np.ceil(total_duration / subset_interval).astype(np.int)
num_time_points = duration * framerate
z_sequence = np.arange(z_start, z_end + z_step, z_step)
num_z_slices = len(z_sequence)

Prepare for acquisition

[10]:
# setup cameras -- this property may change depending on the particular camera used
mmc.set_property("Camera", "Framerate", framerate)

# setup z stage
z_stage = mmc.get_focus_device()

if relative:
    z_pos = mmc.get_position(z_stage)

    z_sequence += z_pos

if sequence:
    mmc.set_property(z_stage, "UseSequence", "Yes")

Generate events

[11]:
events = []
for s in range(num_subsets):
    for t in range(num_time_points):
        events.append(
            {
                "axes": {"subset": s, "time": t, "z": 0},
                "z": z_sequence[0],
                "min_start_time": s * subset_interval,
            }
        )
    for z in range(num_z_slices):
        events.append(
            {
                "axes": {"subset": s, "time": num_time_points, "z": z},
                "z": z_sequence[z],
                "min_start_time": s * subset_interval,
            }
        )

Acquire data

[12]:
with Acquisition(directory=path, name=name) as acq:
    acq.acquire(events)