UniteLabs
Labware

Tips and Tip Racks

Define custom tip types and tip racks for Hamilton liquid handlers.

Tips

In this example we will use the Hamilton standard 300 μL conductive tips.

We need the length, width, and height of the tip (x, y, z), as well as the fitting-depth in millimeters. Fitting depth, length and width are constant for all conventional Hamilton tips. Furthermore, we need the collar type to check for compatibility with the pipetting heads. Only the height and collar type can be extracted from the technical specification. The dimensions of the regular channels are 9x9 mm.

The tip in this example has the following parameters:

  • Length, width, height (mm): 9.0 mm, 9.0 mm, 59.9 mm
  • Fitting depth (mm): 8 mm
  • Collar type: STANDARD

Other collar types: LOW_VOLUME, HIGH_VOLUME, CORE_384_AXYGEN, XL, CORE_384_HAMILTON.

Finding tip parameters: Most tip parameters are stored in the liquid handler vendor software. For Hamilton Venus, look in the Labware folder. You can also reach out to UniteLabs if you can't find the right dimensions.
Version note: Tip names changed in Labware SDK v0.22.0 / LHSDK v0.22.0. Previous names such as StandardTip, LT250Tip, and HighVolumeTip are deprecated but still work with a warning. Update your imports to the new names below to avoid deprecation warnings.
Volume limits: Make sure maximum volumes are correct. Over-aspirating may damage the pipetting channel. The max_volume field limits the liquid volume to be aspirated — it does not account for transport air or blowout air, which can cause the channel to exceed this limit if set incorrectly.
import dataclasses
import typing

from unitelabs.labware import ComplexShape, Container, Decimal, Vector
from unitelabs.labware.hamilton import CollarType, HamiltonTip


@dataclasses.dataclass
class CustomHamiltonTip(HamiltonTip):
    tip_type: typing.ClassVar[int] = 20
    model: str = "235902"
    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=9, y=9, z=59.9))
    container: Container = dataclasses.field(
        default_factory=lambda: Container(
            max_volume=400,
            sections=[ComplexShape(factor=36.3168, height=8), ComplexShape(factor=12.8596, height=52)],
        )
    )
    has_filter: bool = False
    fitting_depth: Decimal = dataclasses.field(default=Decimal(default=8))
    collar_type: CollarType = CollarType.STANDARD

To use the newly defined tip on a Hamilton liquid handler, it must be registered first:

hamilton = MicrolabSTAR( ... )
tip = CustomHamiltonTip()
await hamilton.api.define_tip(tip.tip_type, tip, pick_up_method=PickUpTipMethod.NORMAL)

Tip Racks

A peculiarity about the tip rack is the negative z-offset of the TipSpot children. Instead of modeling the tips hanging in the tip rack, it is assumed that the tips stand on the virtual bottom of the tip rack.

How the z-offset is calculated: The height of the tip rack in this example is 20 mm. The height of a HamiltonTip_1000 is 95.1 mm. The approach height for tip pick-up is 8.4 mm above the tip — placing the TipSpot at 103.5 mm. Assuming the top of the tip levels out with the tip rack (20 mm high), the tip is 103.5 mm − 20 mm = −83.5 mm below the top of the rack.

The TipSpot dimensions match the dimensions of the tip type the rack is designed for. Since the tip spot is 2-dimensional, the z-component can be set to 0 or omitted.

The following parameters were used in the example below:

  • Cols, rows: 12, 8
  • Length, width, height (mm): 122.4 mm, 82.6 mm, 20 mm
  • Tip spot A1 offsets (mm): 7.2 mm, 5.3 mm, −83.5 mm
  • Tip spot width, length, depth (mm): 9 mm, 9 mm, 0 mm

For Hamilton: All parameters except the x/y offsets of the tip spot can be found in the Venus labware file.

import collections.abc
import dataclasses

from unitelabs.labware import TipRack, TipSpot, Vector, place


@dataclasses.dataclass
class HamiltonTipRack_1000(TipRack):
    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=122.4, y=82.6, z=20.0))
    rows: int = 8
    cols: int = 12
    children: collections.abc.Sequence[TipSpot] = dataclasses.field(
        repr=False,
        default_factory=lambda: [
            TipSpot(dimensions=dimensions).copy(location=location)
            for location, dimensions in place(
                HamiltonTipRack_1000.cols,
                HamiltonTipRack_1000.rows,
                item=Vector(x=9.0, y=9.0, z=0),
                boundary=Vector(x=122.4, y=82.6, z=0),
                offset=Vector(z=-83.5),
            )
        ],
    )