UniteLabs
Pipetting

Tip Handling

Picking up, returning, and discarding tips on Hamilton and Agilent Bravo liquid handlers.

See Tips and Tip Tracking for the conceptual model (state machine, channel vs. 96-head, inventory tracking). This guide covers the procedural API for picking up, returning, and discarding tips across both supported liquid handlers.

For deeper vendor detail see the Hamilton or Bravo guides.

Prerequisites

  • A running liquid handler connector connected to the UniteLabs platform
  • A tip rack loaded with tips

Connect to the Device

from unitelabs.sdk import AsyncApiClient
from unitelabs.liquid_handling.hamilton import MicrolabSTAR

client = AsyncApiClient()
hamilton = MicrolabSTAR(name="Microlab STAR", client=client)
await hamilton.initialize()

Arrange the Deck

Hamilton uses a track-based deck. Tip racks sit inside carriers which are added at specific tracks.

from unitelabs.labware.hamilton import TIP_CAR_480_A00, HamiltonTip_300, HamiltonTipRack_300

tip_carrier = TIP_CAR_480_A00()
tip_rack = HamiltonTipRack_300(filled_with=HamiltonTip_300)

tip_carrier[0] = tip_rack
hamilton.deck.add(tip_carrier, track=7)
print(hamilton.deck.summary())

Pick Up Tips

To pick up next available tips from a tip rack, use the pick_up_tips_from method and specifying the channels to use.Channels are zero-indexed.

await hamilton.pipettes.pick_up_tips_from(channels=range(4), rack=tip_rack)
If not enough tips are available, the method will raise an error: MissingError: No next tip available. The tip rack is empty.

Alternatively, specify the tip spots to use defined tip locations, for example when reusing the tips.

spots = tip_rack["B2":"C2"]
await hamilton.pipettes.pick_up_tips(channels=[1, 2], spots=spots)
tip_rack["A1"] and tip_rack[0] are equivalent. Inspect tip_rack[pos].get() to check dynamically whether a spot has a tip.

Pick Up a Partial Set of Tips

Use well_offset=(row, col) to shift which part of the rack the head's A1 nozzle aligns with. Only nozzles that overlap with the rack pick up tips.

# Pick up column 12 only (head A1-H1 aligns with rack A12-H12)
await bravo.pipette_head.pick_up_tips_from(
    rack=tip_rack,
    well_offset=(0, 11),
    press_depth=5.8,
)

# Pick up a single tip from H12 (head A1 aligns with rack H12)
await bravo.pipette_head.pick_up_tips_from(
    rack=tip_rack,
    well_offset=(7, 11),
    press_depth=5.8,
)

Put Down Tips

Return tips to the rack they were picked up from.

Use await hamilton.pipettes.return_tips() to return tips to the exact location they were picked up from.

await hamilton.pipettes.return_tips()

Alternatively, specify you can return tips to the first free positions in the specific tip rack or define exact tip spots to return tips to.

# return tips to first empty positions in tip rack
await hamilton.pipettes.put_down_tips_to(rack=tip_rack, channels=range(4))

# return tips to specific spots
spots = tip_rack["A1":"E1"]
await hamilton.pipettes.put_down_tips(channels=[0, 1, 2, 3], spots=spots)

Discard Tips

The tip waste location is stored in the device configuration and varies between models of Hamilton robots. discard_tips() discards all tips to the configured waste location. The command can also be used to discard tips from specific channels.

# Discard all present tips
await hamilton.pipettes.discard_tips()

# Discard tips from specific channels
await hamilton.pipettes.discard_tips(channels=[0, 1])
For more information on Hamilton STAR waste see Waste block.