Basic Pipetting
In this guide a deck with a plate, tips, and a trough is created. Tips are picked up to aspirate liquid from the trough and dispense into a plate. Both direct keyword arguments and parameter sets are demonstrated.
Prerequisites
- A switched on Agilent Bravo device
- A tip rack and Agilent 250 µL tips, a plate, and a trough
- A running Agilent Bravo connector
- Basic understanding of the liquid handler class (See the Agilent Bravo tutorial)
- Basic understanding of tip handling (See Tip handling)
Power On the System
Ensure that the Agilent Bravo is powered on and ready for operation. Verify that the connector is running and connected to the UniteLabs platform.
from unitelabs.sdk import AsyncApiClient
from unitelabs.liquid_handling.agilent import Bravo
client = AsyncApiClient()
# Initialize the Agilent Bravo
bravo = Bravo(
name="Bravo",
client=client,
)
await bravo.configure()
await bravo.initialize()
await bravo.activate()
Arrange the Deck
Arrange the deck layout using the components from the labware library. This guide uses:
- a tip rack filled with LT250 tips,
- a deep well reservoir pre-filled with water, and
- a standard 96 well plate as the destination.
from unitelabs.labware.agilent.tips import AgilentTipRack_250, AgilentTip_250
from unitelabs.labware.plates import Standard96Plate
from unitelabs.labware.agilent.troughs import Agilent_DW_Reservoir
from unitelabs.labware.liquids import PredefinedLiquids
tip_rack = AgilentTipRack_250(identifier="TipRack_96LT_250uL")
tip_rack.fill(AgilentTip_250)
source_reservoir = Agilent_DW_Reservoir(identifier="SourceReservoir_300mL")
source_reservoir[0].container.add_liquid(PredefinedLiquids.WATER, 100_000.0)
dest_plate = Standard96Plate(identifier="DestinationPlate_96Well")
bravo.deck.add(tip_rack, location=1)
bravo.deck.add(source_reservoir, location=4)
bravo.deck.add(dest_plate, location=5)
Aspirate
Make sure to pick up tips first:
await bravo.pipette_head.pick_up_tips_from(rack=tip_rack, press_depth=5.8)
Aspirate 100 µL of water from the source reservoir.
await bravo.pipette_head.aspirate(
plate=source_reservoir,
volume=100,
)
Dispense
Dispense the water from the tips into the destination plate.
await bravo.pipette_head.dispense(
plate=dest_plate,
volume=100,
)
Using Parameter Sets
For more control over pipetting operations, use BravoAspirateParameterSet and BravoDispenseParameterSet. Parameter sets allow you to configure pipette mode, liquid offset, and other advanced options.
from unitelabs.liquid_handling.agilent.interfaces.parameters import (
BravoAspirateParameterSet,
BravoDispenseParameterSet,
)
from unitelabs.liquid_handling.modules import PipetteMode
aspirate_params = BravoAspirateParameterSet(volume=51.0)
await bravo.pipette_head.aspirate(source_reservoir, aspirate_params)
dispense_params = BravoDispenseParameterSet(
volume=51.0,
pipette_mode=PipetteMode.BOTTOM,
liquid_offset=3.0,
)
await bravo.pipette_head.dispense(dest_plate, dispense_params)
Dispensing to Specific Wells with Partial Tips
When using a single tip or column, use well_offset in the parameter set to target specific wells on the destination plate. The offset is relative to the active nozzle positions on the head.
dispense_params = BravoDispenseParameterSet(
volume=51.0,
well_offset=(2, 5), # Target wells at row C, column 6 from head A1
pipette_mode=PipetteMode.BOTTOM,
liquid_offset=3.0,
)
await bravo.pipette_head.dispense(dest_plate, dispense_params)
well_offset parameter in dispense works the same way as in tip pickup; it shifts which wells the active nozzles target. This is especially useful when pipetting with a single tip or column to address different areas of the plate across multiple dispense steps.Touch-Side Dispense
Setting touch_side=True causes the tips to touch the well wall after dispensing. The touch distance and direction are automatically calculated from the container geometry, which helps reduce droplet retention on the tip.
dispense_params = BravoDispenseParameterSet(
volume=51.0,
touch_side=True,
)
await bravo.pipette_head.dispense(dest_plate, dispense_params)
Aspirate Parameter Reference
The following parameters are accepted by pipette_head.aspirate() as keyword arguments or via BravoAspirateParameterSet:
| Parameter | Type | Default | Description |
|---|---|---|---|
volume | Number | auto | Volume to aspirate in µL. Defaults to the minimum of free tip volume and container volume. |
liquid_class | BravoLiquidClass | auto | Liquid class for motion parameters and volume correction. Auto-selected by volume and tip type when not provided. |
velocity | Number | 50.0 | General movement velocity in mm/s. |
pipette_mode | AspiratePipetteMode | SURFACE | SURFACE positions the tip relative to the liquid surface. BOTTOM positions relative to the well bottom. |
liquid_offset | Number | 0.0 | Z offset from the reference point in mm. |
start_z_position | Number | container top | Approach Z before descent in mm. |
min_z_position | Number | container bottom | Floor Z (actual aspirate depth) in mm. |
well_offset | tuple | (0, 0) | Grid offset (row, col) for partial-tip operations. |
offset | Vector | (0, 0, 0) | Fine XY tuning offset in mm on top of well-positioned movement. |
min_traverse_height | Number | auto | Override safe traverse Z in mm. Defaults to connector value. |
mixing | MixingParameterSet | None | Optional mixing to perform during aspiration. |
follow_liquid | bool or Number | auto | Not supported on Bravo; parameter is ignored. |
pull_out_distance | Number | None | Not supported on Bravo; parameter is ignored. |
Dispense Parameter Reference
The following parameters are accepted by pipette_head.dispense() as keyword arguments or via BravoDispenseParameterSet:
| Parameter | Type | Default | Description |
|---|---|---|---|
volume | Number | auto | Volume to dispense in µL. Defaults to the minimum of tip volume and container free volume. |
liquid_class | BravoLiquidClass | auto | Liquid class for motion parameters and volume correction. Auto-selected when not provided. |
velocity | Number | 50.0 | General movement velocity in mm/s. |
pipette_mode | DispensePipetteMode | BOTTOM | SURFACE positions relative to liquid surface. BOTTOM positions relative to well bottom. |
liquid_offset | Number | 0.0 | Z offset from the reference point in mm. |
start_z_position | Number | container top | Approach Z before descent in mm. |
min_z_position | Number | container bottom | Floor Z (actual dispense depth) in mm. |
touch_side | bool or Number | False | True auto-calculates wall touch distance from container geometry. A Number specifies the exact distance in mm. |
touch_tip_direction | TouchTipDirection | auto | Explicit touch-off direction override. Auto-calculated from well position when not provided. |
touch_tip_retract_distance | Number | 0 | Z retract before touch in mm. |
touch_tip_distance | Number | auto | Lateral XY move toward wall in mm. Auto-calculated from tip and well diameter when not provided. |
well_offset | tuple | (0, 0) | Grid offset (row, col) for partial-tip operations. |
offset | Vector | (0, 0, 0) | Fine XY tuning offset in mm on top of well-positioned movement. |
min_traverse_height | Number | auto | Override safe traverse Z in mm. Defaults to connector value. |
mixing | MixingParameterSet | None | Optional mixing to perform during dispense. |
follow_liquid | bool or Number | auto | Not supported on Bravo; parameter is ignored. |
pull_out_distance | Number | None | Not supported on Bravo; parameter is ignored. |