Tip Handling
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()
from unitelabs.sdk import AsyncApiClient
from unitelabs.liquid_handling.agilent import Bravo
client = AsyncApiClient()
bravo = Bravo(name="Bravo", client=client)
await bravo.configure()
await bravo.initialize()
await bravo.activate()
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())
The Bravo has a 3×3 grid of nine numbered deck locations. Labware is added directly to a location.
from unitelabs.labware.agilent.tips import AgilentTipRack_250, AgilentTip_250
tip_rack = AgilentTipRack_250(identifier="TipRack_96LT_250uL")
tip_rack.fill(AgilentTip_250)
bravo.deck.add(tip_rack, location=1)
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)
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.The 96-nozzle head picks up tips as a unit. By default all 96 nozzles are active.
await bravo.pipette_head.pick_up_tips_from(
rack=tip_rack,
press_depth=5.8,
)
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)
Use the same well_offset that was used during pickup.
await bravo.pipette_head.put_down_tips_to(
rack=tip_rack,
well_offset=(7, 11),
)
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])
Pass an empty deck location as the discard target.
# Discard to empty location 3
await bravo.pipette_head.discard_tips(bravo.deck[3])