UniteLabs
Labware

Carriers and Adapters

Define custom plate carriers, tip carriers, trough carriers, and plate adapters for the deck.

Adapters

Sometimes labware is not placed directly into a carrier site, but onto an adapter. An adapter always modifies the position of the labware it holds, and can provide additional functions like magnetic separation or temperature control.

In this example, we build a magnetic plate adapter — specifically the Magnum FLX® adapter from Alpaqua:

import collections.abc
import dataclasses

from unitelabs.labware import Adapter, Decimal, Labware, Spot, StandardMicroplateDimensions, Vector


@dataclasses.dataclass
class PLT_ADP_MAG_MAGNUM_FLX(
    Adapter[Spot[StandardMicroplateDimensions], StandardMicroplateDimensions], StandardMicroplateDimensions, Labware
):
    """Magnum FLX® with Solid-Core™ Technology magnetic plate by Alpaqua."""

    height: Decimal = dataclasses.field(default=Decimal(default=28.55))
    children: collections.abc.Sequence[Spot[StandardMicroplateDimensions]] = dataclasses.field(
        repr=False,
        default_factory=lambda: [Spot(dimensions=Vector(x=127.76, y=85.48), location=Vector(x=0, y=0, z=28.55))],
    )

The Adapter class is generic. We parameterize it to specify two things:

  1. The Spot type: the kind of spot the adapter itself fits into (e.g., Spot[StandardMicroplateDimensions])
  2. The placeable type: what the adapter can hold (e.g., StandardMicroplateDimensions)

Multiple inheritance also applies:

  • StandardMicroplateDimensions: defines it as having a standard footprint, so it can be placed on standard carriers
  • Labware: marks it as a physical resource managed by the library

Carriers

Carriers are resources that hold other labware on the deck. They are defined with a set of CarrierSite slots, each at a specific position relative to the carrier origin.

The dimension examples below are specific to Hamilton carriers. If building for a different vendor, measure your carrier directly or consult its technical specification.

Plate Carriers

A plate carrier holds labware of the Plate type (anything with StandardMicroplateDimensions). The carrier sites are 2-dimensional planes — they define x and y position only; z is the height of the carrier.

The plate carrier in this example has the following dimensions:

  • Rows: 5
  • Length, width, height (mm): 157.5 mm, 497.0 mm, 130.0 mm
  • Carrier site dimensions (mm): 127.0 mm, 86.0 mm
  • Distance between carrier sites (mm): 96 mm
import collections.abc
import dataclasses

from unitelabs.labware import CarrierSite, Orientation, StandardMicroplateDimensions, Vector
from unitelabs.labware.hamilton import HamiltonCarrier, LabwareType


@dataclasses.dataclass
class PLT_CAR_L5FLEX_MD_A00(HamiltonCarrier[StandardMicroplateDimensions]):
    rows: int = 5
    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=157.5, y=497.0, z=130.0))
    labware: LabwareType = LabwareType.PLATES
    orientation: Orientation = Orientation.LANDSCAPE

    children: collections.abc.Sequence[CarrierSite] = dataclasses.field(
        repr=False,
        default_factory=lambda: [
            CarrierSite(dimensions=Vector(x=127.0, y=86.0)).copy(location=Vector(x=15.25, y=y, z=115.8))
            for y in [392.5, 296.5, 200.5, 104.5, 8.5]
        ],
    )

Tip Carriers

Tip carriers are built analogously to plate carriers, except that they can only hold labware of the type TipRack.

The tip carrier in this example has the following dimensions:

  • Rows: 5
  • Length, width, height (mm): 135.0 mm, 497.0 mm, 130.0 mm
  • Carrier site dimensions (mm): 122.4 mm, 82.6 mm
  • Carrier site 1 offsets (mm): 6.2 mm, 10.0 mm, 114.95 mm
  • Distance between carrier sites (mm): 96 mm
import collections.abc
import dataclasses

from unitelabs.labware import CarrierSite, Orientation, TipRack, Vector
from unitelabs.labware.hamilton import HamiltonCarrier, LabwareType


@dataclasses.dataclass
class TIP_CAR_480_A00(HamiltonCarrier[TipRack]):
    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=135.0, y=497.0, z=130.0))
    labware: LabwareType = LabwareType.TIPS
    orientation: Orientation = Orientation.LANDSCAPE

    children: collections.abc.Sequence[CarrierSite] = dataclasses.field(
        repr=False,
        default_factory=lambda: [
            CarrierSite(dimensions=Vector(x=122.4, y=82.6)).copy(location=Vector(x=6.2, y=y, z=114.95))
            for y in [394.0, 298.0, 202.0, 106.0, 10.0]
        ],
    )

Trough Carriers

Trough carriers are built analogously to plate carriers, except that they can only hold labware of the type Trough.

The trough carrier in this example has the following dimensions:

  • Rows: 5
  • Length, width, height (mm): 22.5 mm, 497.0 mm, 93.0 mm
  • Carrier site dimensions (mm): 20.0 mm, 89.9 mm
  • Carrier site 1 offsets (mm): 1.2 mm, 6.0 mm, 63.2 mm
  • Distance between carrier sites (mm): 96 mm
import collections.abc
import dataclasses

from unitelabs.labware import CarrierSite, Orientation, Vector
from unitelabs.labware.hamilton import HamiltonCarrier, LabwareType, RGT_CONT_50ml


@dataclasses.dataclass
class RGT_CAR_5R_A00(HamiltonCarrier[RGT_CONT_50ml]):
    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(x=22.5, y=497, z=82))
    labware: LabwareType = LabwareType.REAGENT
    orientation: Orientation = Orientation.PORTRAIT

    children: collections.abc.Sequence[CarrierSite] = dataclasses.field(
        repr=False,
        default_factory=lambda: [
            CarrierSite(
                dimensions=Vector(x=20, y=90),
                location=Vector(x=1.25, y=390.5, z=18.5),
            )
            for y in [390.5, 294.5, 198.5, 102.5, 6.5]
        ],
    )