API Reference¶
Mirror control¶
Control over mirrors is provided through the Mirror
class. Instances of this class are available by default as:
import bluelake as bl
bl.mirror1.move_to(x=1, y=2)
# Note: this line will fail on dual-trap systems:
bl.mirror3.move_to(x=0, y=0)
# Additional mirrors are defined in bluelake:
# (depending on actual availability of the hardware on your C-Trap)
bl.mirror4
bl.mirror12
bl.mirror34
-
class
Mirror
(device, id)¶ Control interface for a mirror
-
is_busy
(self)¶ Is the mirror currenty executing a move?
- Returns
- bool
-
move_by
(self, dx=0, dy=0, speed=1)¶ Move the mirror relative to the current position.
The rest of the automation script is not executed until the mirror has finished the move.
- Parameters
- dx, dyfloat
How much to move the mirror, in micrometers. Any of the axes can be omitted, in which case the mirror does not move in that direction.
- speedfloat
Total speed of the move, in um/s (i.e, magnitude of the velocity vector). Note: The actual speed of the mirror depends on the accuracy of the steering device. Only for the high-resolution Mirror 1 can an accurate motion in X/Y be guaranteed. If no speed is given, it will default to 1.0um/s. If 0 is given, the device will move with its maximum speed.
-
move_to
(self, waypoint=None, x=None, y=None, speed=None)¶ Move the mirror to the given coordinates.
The rest of the automation script is not executed until the mirror has finished the move.
This function is only available for mirrors that have absolute position control, such as the high-resolution Mirror 1 on C-Trap systems.
- Parameters
- waypointOptional[str]
Name of a previously stored waypoint. Should exactly match the name of the waypoint as entered in the Bluelake user interface.
- x, yOptional[float]
Instead of giving a
waypoint
, this function can also be called with a set of destination coordinates, in micrometers. Any of the axes can be omitted, in which case the trap does not move in that direction.- speedOptional[float]
Total speed of the move, in um/s (i.e, magnitude of the velocity vector). Note: The actual speed depends on the accuracy of the steering device. Only for the high-resolution Mirror 1 can an accurate motion in X/Y be guaranteed. If no speed is given, either the waypoint speed will be used, or it will default to 1.0um/s for coordinate parameters. If 0 is given, the device will move with its maximum speed.
Examples
mirror1.move_to('start position') mirror1.move_to(x=1, y=2, speed=10)
-
start_oscillation
(self, axis, amplitude, frequency, reset_position=False)¶ Start sinusoidal oscillation of the mirror
This function starts sinusoidal motion of the mirror along the given axis. Note that availability of oscillation depends on the mirror: not all mirror hardware supports this feature.
To stop the oscillation, simply call
stop
.NOTE: For frequencies above 0.075 Hz, this motion is precisely timed (in hardware). Lower frequencies are typically software-timed, and therefore subject to jitter.
NOTE: For higher frequencies, the oscillation might not reach the specified amplitude due to the device response time and inertia.
- Parameters
- axisstr
Which axis to oscillate: ‘X’ or ‘Y’.
- amplitudefloat
Oscillation amplitude, in micrometers.
- frequencyfloat
Oscillation frequency, in hertz.
- reset_positionbool
Go back to the starting position when the oscillation is stopped (False by default)
Examples
import bluelake as bl # When oscillating the mirrors, we advise using the `try`/`finally` construct which # makes sure that the oscillation terminates if the script is stopped manually. try: bl.mirror1.start_oscillation(axis='X', amplitude=5.0, frequency=1.0) bl.pause(10) # Oscillate for 10 seconds finally: bl.mirror1.stop()
-
stop
(self)¶ Stop all movement of the mirror immediately.
-
property
position
¶ Current absolute position of the mirror.
This function is only available for mirrors that have absolute position control, such as the high-resolution Trap 1 on C-Trap systems.
- Returns
- positionPoint
namedtuple
containing the position for each axis in micrometers.
Examples
from bluelake import mirror1 current_position = mirror1.position x, y = mirror1.position # All these lines print the x coordinate print(current_position.x) print(current_position[0]) print(x)
-
Telescope control¶
Control over telescopes is provided through the Telescope
class. Instances of this class are available by default as:
import bluelake as bl
bl.telescope12.move_to(z=1)
# Additional telescopes are defined in bluelake:
# (depending on actual availability of the hardware on your C-Trap)
bl.telescope34
-
class
Telescope
(device, id)¶ Control interface for a telescope
-
is_busy
(self)¶ Is the telescope currenty executing a move?
- Returns
- bool
-
move_by
(self, dz=0, speed=1)¶ Move the telescope relative to the current position.
The rest of the automation script is not executed until the telescope has finished the move.
- Parameters
- dzfloat
How much to move the telescope, in micrometers.
- speedfloat
Total speed of the move, in um/s (i.e, magnitude of the velocity vector). Note: The actual speed depends on the accuracy of the steering device. Only for the high-resolution Mirror 1 can an accurate motion in X/Y be guaranteed. If no speed is given, it will default to 1.0um/s. If 0 is given, the device will move with its maximum speed.
-
move_to
(self, waypoint=None, z=None, speed=None)¶ Move the telescope to the given coordinates.
The rest of the automation script is not executed until the telescope has finished the move.
- Parameters
- waypointOptional[str]
Name of a previously stored waypoint. Should exactly match the name of the waypoint as entered in the Bluelake user interface.
- zOptional[float]
Instead of giving a
waypoint
, this function can also be called with a set of destination coordinates, in micrometers.- speedOptional[float]
Total speed of the move, in um/s (i.e, magnitude of the velocity vector). Note: The actual speed depends on the accuracy of the steering device. Only for the high-resolution Mirror 1 can an accurate motion in X/Y be guaranteed. If no speed is given, either the waypoint speed will be used, or it will default to 1.0um/s for coordinate parameters. If 0 is given, the device will move with its maximum speed.
Examples
telescope12.move_to('start position') telescope12.move_to(z=1, speed=10)
-
stop
(self)¶ Stop all movement of the telescope immediately.
-
property
position
¶ Current absolute position of the telescope.
- Returns
- positionPoint
namedtuple
containing the position for each axis in micrometers.
Examples
from bluelake import telescope12 current_position = telescope12.position # These two lines both print the z coordinate print(current_position.z) print(current_position[0])
-
Nanostage control¶
Control of the nanostage is provided through the Nanostage
class. An instance of this class is available by default as:
# (depending on actual availability of the hardware on your C-Trap)
import bluelake as bl
bl.nanostage.move_to(x=1, x=2, x=3)
-
class
Nanostage
(device, id)¶ Control interface for the nanostage
-
is_busy
(self)¶ Is the nanostage currenty executing a move?
- Returns
- bool
-
move_by
(self, dx=0, dy=0, dz=0, speed=1)¶ Move the nanostage relative to the current position.
The rest of the automation script is not executed until the nanostage has finished the move.
- Parameters
- dx, dy, dzOptional[float]
How much to move the nanostage, in micrometers. Any of the axes can be omitted, in which case the nanostage does not move in that direction.
- speedfloat
Total speed of the move, in um/s (i.e, magnitude of the velocity vector). If no speed is given, it will default to 1.0um/s. If 0 is given, the device will move with its maximum speed.
-
move_to
(self, waypoint=None, x=None, y=None, z=None, speed=None)¶ Move the nanostage to the given coordinates.
The rest of the automation script is not executed until the nanostage has finished the move.
- Parameters
- waypointOptional[str]
Name of a previously stored waypoint. Should exactly match the name of the waypoint as entered in the Bluelake user interface. If the given name matches both an XY and a Z waypoint, an XYZ movement will be executed.
- x, y, zOptional[float]
Instead of giving a
waypoint
, this function can also be called with a set of destination coordinates, in micrometers. Any of the axes can be omitted, in which case the nanostage does not move in that direction.- speedfloat
Total speed of the move, in um/s (i.e, magnitude of the velocity vector). If no speed is given, either the waypoint speed will be used, or it will default to 1.0um/s for coordinate parameters. For XYZ movement, the speed of the XY waypoint will be used. If 0 is given, the device will move with its maximum speed.
Examples
nanostage.move_to('start position') nanostage.move_to(x=1, y=2, z=3, speed=10)
-
start_oscillation
(self, axis, amplitude, frequency, reset_position=False)¶ Start sinusoidal oscillation of the nanostage
This function starts sinusoidal motion of the nanostage along the given axis. Note that availability of oscillation depends on the hardware: not all nanostages supports this feature.
To stop the oscillation, simply call
stop
.NOTE: For frequencies above 0.075 Hz, this motion is precisely timed (in hardware). Lower frequencies are typically software-timed, and therefore subject to jitter.
NOTE: For higher frequencies, the oscillation might not reach the specified amplitude due to the device response time and inertia.
- Parameters
- axisstr
Which axis to oscillate: ‘X’ or ‘Y’.
- amplitudefloat
Oscillation amplitude, in micrometers.
- frequencyfloat
Oscillation frequency, in hertz.
- reset_positionbool
Go back to the starting position when the oscillation is stopped (False by default)
Examples
import bluelake as bl # When oscillating the nanostage, we advise using the `try`/`finally` construct which # makes sure that the oscillation terminates if the script is stopped manually. try: bl.nanostage.start_oscillation(axis='X', amplitude=5.0, frequency=1.0) bl.pause(10) # Oscillate for 10 seconds finally: bl.nanostage.stop()
-
stop
(self)¶ Stop all movement of the nanostage immediately.
-
property
position
¶ Current absolute position of the nanostage.
- Returns
- positionPoint
namedtuple
containing the position for each axis in micrometers.
Examples
from bluelake import nanostage current_position = nanostage.position # These two lines both print the y coordinate print(current_position.y) print(current_position[1])
-
Shutter control¶
Control of the shutters is provided through the Shutters
class. An instance of it is available as:
import bluelake as bl
bl.shutters.clear(1, 2, delay_ms=100)
-
class
Shutters
(impl)¶ -
clear
(self, *shutters, delay_ms=500)¶ Close and open the shutters with the given numbers after the given delay.
- Parameters
- delay_msint
For how long to close the shutter, in milliseconds.
Note: There is a built-in safeguard that will open the shutters after some time to prevent damage to the system. So the shutters will open before the given delay if it is too long.
- *shuttersTuple[int]
The numbers of the shutters to open. These match the numbers as seen in the Bluelake user interface. The first shutter has number 1.
Examples
To close shutters 1, 2, and 4 and open them again after 1000ms:
shutters.clear(1, 2, 4, delay_ms=1000)
-
close
(self, *shutters)¶ Close the shutters with the given numbers
Note: There is a built-in safeguard that will open the shutters after some time to prevent damage to the system. So the shutters won’t remain closed indefinitely.
- Parameters
- *shuttersTuple[int]
The numbers of the shutters to open. These match the numbers as seen in the Bluelake user interface. The first shutter has number 1.
Examples
To close shutters 1, 2, and 4:
shutters.close(1, 2, 4)
-
open
(self, *shutters)¶ Open the shutters with the given numbers
- Parameters
- *shuttersTuple[int]
The numbers of the shutters to open. These match the numbers as seen in the Bluelake user interface. The first shutter has number 1.
Examples
To open shutters 1, and 3:
shutters.open(1, 3)
-
Stage control¶
Navigation within the flow cell is done through bluelake.microstage
, an instance of the Microstage
class:
import bluelake as bl
bl.microstage.move_to('My favorite point')
-
class
Microstage
(stage_impl, profile_manager_impl)¶ Control interface for the microstage
-
move_by
(self, dx=0, dy=0, speed=1)¶ Move the microstage relative to the current position.
The rest of the automation script is not executed until the microstage has finished the move.
- Parameters
- dx, dyfloat
How much to move the stage, in millimeters. Any of the axes can be omitted, in which case the stage does not move in that direction.
- speedfloat
Total speed of the move, in mm/s (i.e, magnitude of the velocity vector). If no speed is given, it will default to 1 mm/s.
-
move_to
(self, waypoint=None, x=None, y=None, speed=None)¶ Move the microstage to the given coordinates.
The rest of the automation script is not executed until the microstage has finished the move.
- Parameters
- waypointOptional[str]
Name of a previously stored waypoint. Should exactly match the name of the waypoint as entered in the Bluelake user interface.
- x, yOptional[float]
Instead of giving a
waypoint
, this function can also be called with a set of destination coordinates, in millimeters. Any of the axes can be omitted, in which case the stage does not move in that direction.- speedfloat
Total speed of the move, in mm/s (i.e, magnitude of the velocity vector). If no speed is given, it will default to 1 mm/s.
-
start_moving_by
(self, dx=0, dy=0, speed=1)¶ Start moving the microstage relative to the current position.
The function only sends the move command to the microstage. It does not wait for the move to finish.
- Parameters
- dx, dyfloat
How much to move the stage, in millimeters. Any of the axes can be omitted, in which case the stage does not move in that direction.
- speedfloat
Total speed of the move, in mm/s (i.e, magnitude of the velocity vector). If no speed is given, it will default to 1 mm/s.
-
start_moving_to
(self, waypoint=None, x=None, y=None, speed=None)¶ Start moving the microstage to the absolute position in space.
The function only sends the move command to the microstage. It does not wait for the move to finish.
- Parameters
- waypointOptional[str]
Name of a previously stored waypoint. Should exactly match the name of the waypoint as entered in the Bluelake user interface.
- x, yOptional[float]
Instead of giving a
waypoint
, this function can also be called with a set of destination coordinates, in millimeters. Any of the axes can be omitted, in which case the stage does not move in that direction.- speedfloat
Total speed of the move, in mm/s (i.e, magnitude of the velocity vector). If no speed is given, it will default to 1 mm/s.
-
stop
(self)¶ Stop the current move of the microstage.
-
property
is_homed
¶ Is the microstage homed
-
property
is_moving
¶ Is the microstage currently moving.
-
property
max_move_speed
¶ Maximum configured movement speed
-
property
position
¶ Current absolute position of the microstage in mm.
-
Fluidics control¶
bluelake.fluidics
can be used to control the microfluidics channel valves and pressure:
import bluelake as bl
bl.fluidics.open(1, 2, 3, 6)
bl.fluidics.increase_pressure()
bl.fluidics.stop_flow()
-
class
Fluidics
(pressure_box_impl, valves_impl)¶ Microfluidics control
-
close
(self, *valves)¶ Close the valves with the given numbers.
- Parameters
- *valvesTuple[int]
The numbers of the valves to open. These match the numbers as seen in the Bluelake user interface. The first valve has number 1.
Examples
To close valves 1, 2, 3, and 6:
fluidics.close(1, 2, 3, 6)
-
decrease_pressure
(self)¶ Decrease the pressure by one step.
Acts just like the “-” button in the user interface.
-
increase_pressure
(self)¶ Increase the pressure by one step.
Acts just like the “+” button in the user interface.
-
open
(self, *valves)¶ Open the valves with the given numbers.
- Parameters
- *valvesTuple[int]
The numbers of the valves to open. These match the numbers as seen in the Bluelake user interface. The first valve has number 1.
Examples
To open valves 1, 2, 3, and 6:
fluidics.open(1, 2, 3, 6)
-
start_venting
(self)¶ Start venting the pressure.
This function returns immediately, but it may take several seconds for the pressure box to completely vent.
-
stop_flow
(self)¶ Close all valves and vent the pressure
Calling this method is equivalent to calling
fluidics.close(1, 2, 3, 4, 5, 6)
followed byfluidics.start_venting()
.
-
property
pressure
¶ The current pressure, in bar.
-
Power control¶
Power settings can be changed through the following objects that are defined in the bluelake
module:
import bluelake as bl
# Trapping laser
print(bl.power.trapping_laser) # power in %
bl.power.trapping_laser = 50 # set to 50% power
# Power modulation (availability varies per system)
print(bl.power.overall_trapping_power)
print(bl.power.qtrap_split)
print(bl.power.trap1_split)
# Bright-field LED
print(bl.power.bright_field_led)
# Excitation lasers (only for confocal systems)
print(bl.excitation_lasers.red)
print(bl.excitation_lasers.green)
print(bl.excitation_lasers.blue)
Camera¶
-
class
Camera
(recorder_impl)¶ Represents one of the microscope cameras
Instances of this class are available by default as
brightfield
,moon
, andzfinder
:import bluelake as bl bl.brightfield.start_recording("D:\\", seconds=15) bl.moon.take_snapshot("D:\\moon.tiff") bl.zfinder.start_recording("D:\\folder", frames=150)
Depending on the hardware configuration of your C-Trap, you may also have
irm
andwidefield
.-
start_recording
(self, export_path, frames=None, seconds=None)¶ Start recording from this camera.
When either
frames
orseconds
is specified, the recording stops after the specified number of frames or seconds was recorded. Otherwise, it will continue untilstop_recording()
is called.Blocking until the recording is done can be accomplished by calling
.wait()
on the returned object:brightfield.start_recording("D:\\", seconds=2).wait()
You can also do something else between starting the recording and waiting for it to finish:
recording = brightfield.start_recording("D:\\", frames=460) ... # do other things recording.wait()
- Parameters
- export_pathstr
Either a directory or a full file path. If it’s a directory (e.g.
D:\\folder
) the recording will be saved there with an auto-generated name (timestamp + camera name). If it’s a full file path (e.g.D:\\folder\\experiment.tiff
) that exact filename will be used. If a file with that name already exists, it will not be overwritten. A file with a sequential suffix will be created (e.g.experiment 2.tiff
).- framesOptional[int]
The number of frames to record. Cannot be used at the same time as
seconds
.- secondsOptional[float]
The time in seconds for which to record. Cannot be used at the same time as
frames
.
-
stop_recording
(self)¶ Stop any recording that may be in progress.
-
take_snapshot
(self, export_path)¶ Record a single frame.
This function returns only after the snapshot has been saved. It’s equivalent to:
camera.start_recording(export_path, frames=1).wait()
- Parameters
- export_pathstr
Same rules as for
Camera.start_recording()
.
-
property
is_recording
¶ Is the camera currently recording?
-
Timeline¶
Access to data from the timeline is provided through the bluelake.timeline
object, an instance of the Timeline
class described below.
Index timeline
to gain access to individual channels:
import bluelake as bl
force_channel = bl.timeline["Force HF"]["Force 1x"]
The first index is the name of a channel group; the second index is the name of a channel within the group. Group and channel names match the ones displayed in the Bluelake user interface.
The above code snippet sets the force_channel
variable to an instance of the Channel
class described below. We can now, for instance, check the latest force value that has been measured using:
print(force_channel.latest_value)
-
class
Timeline
(impl)¶ Access to data from the timeline
-
__getitem__
(self, s)¶ Return a
Group
from the timeline
-
export
(self, filepath, start, stop, everything=False)¶ Export channel data to HDF5
By default, only the channels which are selected in the Bluelake user interface will be exported.
- Parameters
- filepathstr
Path to an HDF5 file where the data should be exported. The file is created, or overwritten if it already exists.
- start, stopint
The time range to export (64-bit integer timestamps, in nanoseconds; see also
start_time
andcurrent_time
).- everythingOptional[bool]
Off by default. If enabled, all of the available timeline channels will be exported, regardless of the selection in Bluelake’s user interface.
-
keys
(self)¶ List of available groups in the timeline
-
mark_begin
(self, name)¶ Start a marked section on the timeline
Be sure to pair each call to
mark_begin
with a call tomark_end
.- Parameters
- nameOptional[str]
Name of the marked section
-
mark_end
(self, export=False, filepath='')¶ End a marked section on the timeline.
See also
mark_begin
.- Parameters
- exportbool
If
True
, the marker will also be exported immediately.- filepathstr
The exact path where the exported file should be created. If empty, the path will be auto-generated just like exporting in the UI.
- Returns
- Tuple[int, int]
The (start, stop) timestamps of the created marker.
Examples
# End the marker without exporting timeline.mark_begin("marker 1") ... timeline.mark_end() # End the marker and export it with an auto-generated name timeline.mark_begin("marker 2") ... timeline.mark_end(export=True) # End the marker and export with a specific name timeline.mark_begin("marker 3") ... timeline.mark_end(export=True, filepath="D:/path/to/folder/file_name.h5") # In all cases `.mark_end()` returns a (start, stop) pair of timestamps timeline.mark_begin("marker 4") ... start, stop = timeline.mark_end() # Make sure a marker gets an end, even if the script is aborted timeline.mark_begin("marker 5") try: # ... do something else pause(2.0) finally: # This always ends the marker, even if the script is aborted with # the "Stop" button timeline.mark_end()
-
property
current_time
¶ The time at which the latest timeline data was measured
A 64-bit integer timestamp with nanosecond resolution.
-
property
start_time
¶ The time at which the current session was started
A 64-bit integer timestamp with nanosecond resolution.
-
-
class
Group
¶ A group of timeline channels
-
__getitem__
(self, item)¶ Return a
Channel
from the timeline
-
keys
(self)¶ List of available channels within the group
-
-
class
Channel
¶ An individual timeline channel
-
__getitem__
(self, item)¶ Return a slice of data
-
property
group_name
¶ Name of the containing channel group
-
property
latest_value
¶ The latest available data value in this channel
-
property
spec
¶ Detailed
Spec
of the timeline channel’s properties, units, etc.
-
Confocal¶
For C-Trap systems that feature a confocal scanner, a bluelake.confocal
object is available. Through this instance of the Scanner
class described below, simple automation of confocal scans can be done.
-
class
Scanner
(impl)¶ -
abort_scan
(self)¶ Abort any confocal scan that is currently in progress
-
start_scan
(self, preset_name=None)¶ Start a confocal scan, using the current scan settings or based on a preset
If a scan is already in progress an exception is raised. If no preset is given, start a new confocal scan, using the settings from Bluelake’s user interface. Otherwise, start the named preset.
- Parameters
- preset_nameOptional[str]
Name of a confocal scan preset, as previously created in the Bluelake user interface, if the preset is not available an exception is raised.
-
wait
(self)¶ Wait until the confocal scan that is currently in progress has finished
-
Focus Lock¶
For systems that have focus lock, a bluelake.focus_lock
object is available, which allows start/stopping it and checking its state.
Force feedback¶
Force feedback is responsible for keeping the selected force stable at certain target value by using a PID loop to correct the position of steering device. Trap 1 should be used to achieve the best performance:
import bluelake as bl
try:
bl.force_feedback.set_device("1")
bl.force_feedback.set_detector("Trap 2") # Force detector
bl.force_feedback.set_target(30)
bl.force_feedback.enabled = True
bl.pause(1)
finally:
bl.force_feedback.enabled = False
-
class
ForceFeedback
(impl)¶ Force feedback interface
-
set_angle
(self, angle)¶ Set the angle of the force feedback.
Angle has different meaning depending on the selected mode: In
set_lock_motion_angle
, it defines the direction in which the controlled device can move. Inset_lock_force_angle
, it defines the direction of the resulting force vector.- Parameters
- anglefloat
Angle between ±180° with 0/180° being horizontal and ±90° vertical.
-
set_detector
(self, detector)¶ Set which force detector to use a the signal to feedback on.
- Parameters
- detectorstr
Name of the force detector (e.g “Trap 1”, “Trap 2”).
- Raises
ValueError if the detector does not exist.
-
set_device
(self, device)¶ Set the device to be moved to execute the force feedback.
- Parameters
- devicestr
Name of the device to move (e.g. “Nanostage” or “1” for Trap 1).
- Raises
ValueError if the device does not exist.
-
set_frequency
(self, frequency)¶ Set the frequency (Hz) of the force feedback loop.
The frequency is automatically adjusted to match the closest multiple of the force acquisition block size (ms). The minimum frequency is 1/block size
- Parameters
- frequencyfloat
Requested frequency in Hz.
- Returns
- actual_frequencyfloat
Actual frequency that the force feedback will run at.
- Raises
- ValueError if the frequency is zero or negative.
-
set_lock_motion_angle
(self)¶ Set the force feedback loop in locked motion angle mode.
In this mode the corrective movements are calculated conjointly for the X and Y axis. This means that the trap will only move over the line at the angle set by
set_angle
to keep a constant force on this axis, which prioritizes a constant angle between two traps with all corrective movements exerted over a fixed line.
-
set_lock_motion_force
(self)¶ Set the force feedback loop in locked force angle mode.
In this the corrective movements are calculated separately for the X and Y axis. This means that in this mode the trap can move freely to keep a constant force vector of the given target source at the angle set by
set_angle
with respect to the target trap, which prioritizes a constant force between traps in a specific direction.
-
set_pid_settings
(self, kp, ki, kd, max_step, reversed)¶ Set the parameters for the PID loop
- Parameters
- kpfloat
The proportional gain in nm / pN. It determines *how much* the difference between the set target force and the measured force affects the corrective force.
- kifloat
The integral gain in (nm / pN) / s. It determines how much the response increases *over time* when the corrective movements do not bring the target force correctly to its target.
- kdfloat
The derivative gain in (nm / pN) * s. It determines *how strongly* a change in difference between the set target force and the measured force affects the corrective force.
- max_stepfloat
Max step size (nm): The maximum displacement in nm exerted in a single corrective step * In
Lock angle of: Force
this means the maximum displacement in one step on both the X and Y axis. * InLock angle of: Distance
this means the maximum displacement in one step over the line described byDirection (deg)
.- reversed :
Reverse motion Enabling this setting reverses the output of the PID loop.
-
set_target
(self, target)¶ Set the force feedback setpoint in pN.
- Parameters
- targetfloat
Force setpoint in pN for the force feedback loop.
-
property
enabled
¶ Indicates the state of the force feedback.
- Raises
- RuntimeError
If force feedback is already enabled.
Examples
force_feedback.enabled = True ... force_feedback.enabled = False
-
Miscellaneous¶
-
pause
(secs, delta_secs=0.1)¶ Delay execution for a given number of seconds
The argument may be a floating point number for subsecond precision.
-
reset_force
()¶ Set forces to zero. Calibrate force offsets for all channels to zero force.
-
get_force_calibration
()¶ Return the current force calibration for each force channel
The available parameters match the ones available in the force calibration UI.
Examples
cal = bluelake.get_force_calibration() response = cal["Force 1x"]["Response (pN/V)"] offset = cal["Force 1x"]["Offset (pN)"] stiffness = cal["Force 1x"]["kappa (pN/nm)"] print(cal) # see available force channels and parameters for each channel print(cal["Force 1x"]) # see all parameters just for this channel