Components¶
These scripts provide usage examples for individual components of the C-Trap.
Confocal¶
import bluelake as bl
print(bl.excitation_lasers.red) # get current value in %
bl.excitation_lasers.red = 40 # set value in %
bl.confocal.start_scan() # start the active configuration
# bl.confocal.start_scan("Preset name") # OR start a specific preset
print(bl.confocal.is_scanning) # check whether the scan is still in progress
# bl.confocal.wait() # wait for the scan to finish
bl.confocal.abort_scan() # OR abort the scan before it has finished
Fluidics¶
import bluelake as bl
# Open specific valves
bl.fluidics.open(1, 2, 3, 6)
# or
bl.fluidics.open(1, 2)
# And close valves
bl.fluidics.close(1, 2)
# Read the current pressure value
print(bl.fluidics.pressure)
# Increase/decrease the pressure by one step, just like the +/- buttons in the UI
bl.fluidics.increase_pressure()
bl.fluidics.decrease_pressure()
while bl.fluidics.pressure < 1: # bar
bl.fluidics.increase_pressure()
bl.pause(1) # seconds to pause -- important because pressure changes are slow
Microstage¶
import bluelake as bl
bl.microstage.move_to("beads") # the waypoint name must match the name in the UI
bl.microstage.move_to("DNA", speed=2) # optional speed in mm/s (defaults to 1 mm/s)
print(bl.microstage.position) # read the current position
bl.microstage.move_to(x=10, y=16.5) # move to an absolute position
bl.microstage.move_by(dx=-2, dy=3) # move relative to the current position
bl.microstage.move_by(dx=1, dy=-5, speed=3)
Power¶
import bluelake as bl
# Reading values
print("Trapping laser", bl.power.trapping_laser) # get power in %
print(f"Overall {bl.power.overall_trapping_power:.2f} %")
print(bl.power.trap1_split)
# print(bl.power.qtrap_split)
print(bl.power.bright_field_led)
# Setting values
bl.power.bright_field_led = 7 # value in %
Shutters¶
import bluelake as bl
bl.shutters.clear(1) # single
bl.shutters.clear(1, 2) # multiple
# or optionally:
bl.shutters.clear(1, delay_ms=100) # how long the shutter is closed, default 500 ms
Timeline¶
import bluelake as bl
# Grab a reference to any channel. The first [] is the group name and the second [] is the
# channel name. These match exactly the channel tree in the graphical UI of Bluelake.
force_channel = bl.timeline["Force HF"]["Force 1x"]
match_score = bl.timeline["Tracking Match Score"]["Bead 1"]
# The latest ("current") value of the data on that channel
force_value = force_channel.latest_value
# The current time, according to the timeline
t0 = bl.timeline.current_time
# Do something: we pause as a placeholder for another action
bl.pause(1) # seconds
t1 = bl.timeline.current_time
# Fetch the data for that timespan
force_data = force_channel[t0:t1].data
timestamps = force_channel[t0:t1].timestamps
print(force_data)
# Add a marker to the timeline GUI
bl.timeline.mark_begin("marker name")
try:
# Do some work here.
# We use a `try`/`finally` construct so that the marker gets closed even
# if this code produces an error or the script is stopped from the UI.
bl.pause(1) # placeholder for actual work
finally:
bl.timeline.mark_end()
Traps¶
import bluelake as bl
# Absolute movement
bl.mirror1.move_to(x=4, y=1) # [um] matches the position in the UI
bl.mirror1.move_to(x=10) # [um] no change on Y
bl.mirror1.move_to(x=10, speed=10) # [um/s] defaults to 1 um/s if not specified
# Relative movement
bl.mirror1.move_by(dx=1, dy=2) # [um] note `dx` instead of `x` above
bl.mirror1.move_by(dx=1, dy=2, speed=0) # [um/s] 0 means maximum speed
# Movement in Z
bl.telescope12.move_to(z=-2) # [um] # only Z for trap 1+2 Z
# Nanostage
bl.nanostage.move_to(x=1, y=20, z=15, speed=3) # [um] full XYZ movement
def pingpong(distance_delta_um, dwell_time_ms, speed, repeat_n):
"""This will pingpong `repeat_n` times or until the script is stopped in the UI"""
dwell_time_seconds = dwell_time_ms / 1000
for _ in range(repeat_n):
bl.mirror1.move_by(dx=+distance_delta_um, speed=speed)
bl.pause(dwell_time_seconds)
print("ping")
# bl.reset_force() # optionally reset the force
bl.mirror1.move_by(dx=-distance_delta_um, speed=speed)
bl.pause(dwell_time_seconds)
print("pong")
# bl.reset_force() # optionally reset the force
pingpong(distance_delta_um=0.01, dwell_time_ms=50, speed=10, repeat_n=5)