UniteLabs
Agilent Bravo

Basic Pipetting

Aspirating and dispensing with the Agilent Bravo using liquid classes.

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)
The 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:

ParameterTypeDefaultDescription
volumeNumberautoVolume to aspirate in µL. Defaults to the minimum of free tip volume and container volume.
liquid_classBravoLiquidClassautoLiquid class for motion parameters and volume correction. Auto-selected by volume and tip type when not provided.
velocityNumber50.0General movement velocity in mm/s.
pipette_modeAspiratePipetteModeSURFACESURFACE positions the tip relative to the liquid surface. BOTTOM positions relative to the well bottom.
liquid_offsetNumber0.0Z offset from the reference point in mm.
start_z_positionNumbercontainer topApproach Z before descent in mm.
min_z_positionNumbercontainer bottomFloor Z (actual aspirate depth) in mm.
well_offsettuple(0, 0)Grid offset (row, col) for partial-tip operations.
offsetVector(0, 0, 0)Fine XY tuning offset in mm on top of well-positioned movement.
min_traverse_heightNumberautoOverride safe traverse Z in mm. Defaults to connector value.
mixingMixingParameterSetNoneOptional mixing to perform during aspiration.
follow_liquidbool or NumberautoNot supported on Bravo; parameter is ignored.
pull_out_distanceNumberNoneNot supported on Bravo; parameter is ignored.

Dispense Parameter Reference

The following parameters are accepted by pipette_head.dispense() as keyword arguments or via BravoDispenseParameterSet:

ParameterTypeDefaultDescription
volumeNumberautoVolume to dispense in µL. Defaults to the minimum of tip volume and container free volume.
liquid_classBravoLiquidClassautoLiquid class for motion parameters and volume correction. Auto-selected when not provided.
velocityNumber50.0General movement velocity in mm/s.
pipette_modeDispensePipetteModeBOTTOMSURFACE positions relative to liquid surface. BOTTOM positions relative to well bottom.
liquid_offsetNumber0.0Z offset from the reference point in mm.
start_z_positionNumbercontainer topApproach Z before descent in mm.
min_z_positionNumbercontainer bottomFloor Z (actual dispense depth) in mm.
touch_sidebool or NumberFalseTrue auto-calculates wall touch distance from container geometry. A Number specifies the exact distance in mm.
touch_tip_directionTouchTipDirectionautoExplicit touch-off direction override. Auto-calculated from well position when not provided.
touch_tip_retract_distanceNumber0Z retract before touch in mm.
touch_tip_distanceNumberautoLateral XY move toward wall in mm. Auto-calculated from tip and well diameter when not provided.
well_offsettuple(0, 0)Grid offset (row, col) for partial-tip operations.
offsetVector(0, 0, 0)Fine XY tuning offset in mm on top of well-positioned movement.
min_traverse_heightNumberautoOverride safe traverse Z in mm. Defaults to connector value.
mixingMixingParameterSetNoneOptional mixing to perform during dispense.
follow_liquidbool or NumberautoNot supported on Bravo; parameter is ignored.
pull_out_distanceNumberNoneNot supported on Bravo; parameter is ignored.