UniteLabs
How-to

Hamilton MFX Carriers

Assemble a Hamilton MFX carrier from a base plate and MFX modules.

The MFX carrier system is specific to Hamilton liquid handlers, including Microlab STAR and Vantage. MFX carrier hardware is assembled from a base plate and individual MFX modules, so one base plate can hold modules with different functions and geometries. The labware library models this system: you select a base plate, the MFX modules, and their positions, and the library computes the sites, their heights, and the overall carrier geometry.

Use an MFX carrier when your hardware is a Hamilton base plate with MFX modules. For fixed carriers such as the 5-position plate or tip carrier, see Carriers and Adapters.

Prerequisites

  • unitelabs-labware 0.15.0 or later installed
  • The base plate and module part numbers of your physical carrier
  • Understanding of labware concept

Concepts

TermMeaning
Base plateThe flat base of an MFX carrier. Defines the carrier's number of positions, width in tracks, and orientation (landscape or portrait).
ModuleAn MFX module mounted on a base plate position. It sets the site height and type (tip, plate, etc.).
PositionA slot on the base plate, counted from 1 at the top of the carrier (the side with the highest y-value).
SiteThe CarrierSite the library creates for each position that has a module. Empty positions do not get a site.

The UniteLabs labware library defines the following base plates:

ClassPositionsTracksWidth (mm)OrientationProduct number
MFX_Baseplate_6T_5Pos56135.0Landscape188039
MFX_Baseplate_6T_4Pos46135.0Landscape188039
MFX_Baseplate_Shaker_7T_4Pos47157.5Landscape187001
MFX_Baseplate_Portrait_5T_3Pos35112.5Portrait188053

MFX_Baseplate_6T_4Pos and MFX_Baseplate_6T_5Pos are the same physical plate (188039) with two site layouts. The 4-position layout shifts the sites down by half a position (48 mm), so the pipetting channels of a 16-channel robot can reach them with random access. Choose the layout that matches how the modules are mounted on your instrument.

MFX modules live in unitelabs.labware.hamilton.carriers and are named after the Hamilton part, for example MFX_Mod_Tip_Module, MFX_Mod_PCR_96, MFX_Mod_MIDI_HP_Flat, MFX_Mod_HHC, and MFX_Mod_HHS_2mm_Flat_DWP. The Hamilton product number of a module is stored in its model attribute. Base plates carry theirs in the same attribute. Use it to match a class to the part on your carrier:

from unitelabs.labware.hamilton.carriers import MFX_Mod_HHC, MFX_Mod_PCR_96, MFX_Mod_Tip_Module

print(MFX_Mod_Tip_Module().model)  # 188040
print(MFX_Mod_PCR_96().model)  # 188049
print(MFX_Mod_HHC().model)  # 6601900-01

MFX modules have variants ending in _Brackets which represent the same module mounted on the MFX Module Bracket PN 188133 (brackets are needed to mount 6T modules onto the 7T base plates) and raise the site by 10 mm. Use the variant that represents your actual hardware setup.

Assemble a Custom MFX Carrier

To define an MFX carrier, use the make_mfx_carrier function. It takes a list of (position, module) tuples and returns a carrier class. Positions are 1-based and must be unique.

from unitelabs.labware.hamilton import MFX_Baseplate_6T_5Pos, make_mfx_carrier
from unitelabs.labware.hamilton.carriers import MFX_Mod_MIDI_HP_Flat, MFX_Mod_Tip_Module

MyCarrier = make_mfx_carrier(
    [
        (1, MFX_Mod_Tip_Module()),
        (2, MFX_Mod_Tip_Module()),
        (3, MFX_Mod_Tip_Module()),
        (4, MFX_Mod_MIDI_HP_Flat()),
        (5, MFX_Mod_MIDI_HP_Flat()),
    ],
    base=MFX_Baseplate_6T_5Pos,
)

carrier = MyCarrier(identifier="mfx_carrier")

print(MyCarrier.__name__)
print(carrier.dimensions)
for site in carrier.children:
    print(site.location)

All five positions hold a module, so the defined carrier has five sites:

MFX_CAR_L5_3Tip_2MIDI
Vector(x=135, y=497, z=112)
Vector(x=4, y=392.5, z=112)
Vector(x=4, y=296.5, z=112)
Vector(x=4, y=200.5, z=112)
Vector(x=4, y=104.5, z=95)
Vector(x=4, y=8.5, z=95)

What happens in detail:

  • Base plate. The example sets base=MFX_Baseplate_6T_5Pos as the carrier's base plate.
  • Site height. Each site's z is the base plate height (18 mm) plus the module's site height. For example, the tip module site is at a combined height of 18 + 94 = 112 mm.
  • Carrier height. The carrier's z is defined as the tallest base plate and module combination, here 112 mm.
  • Name. The class name follows the MFX_CAR_{L|P}{positions}_{count}{Module}_… convention, where L is landscape, P is portrait, and positions is the base plate's total. You can override it by passing name="..." to make_mfx_carrier.

Portrait Carriers

All modules on a carrier must share one orientation. To build a portrait carrier from landscape modules, pass orientation. The library re-orients every module:

from unitelabs.labware import Orientation
from unitelabs.labware.hamilton import MFX_Baseplate_Portrait_5T_3Pos, make_mfx_carrier
from unitelabs.labware.hamilton.carriers import MFX_Mod_Stacker_Module

StackCarrier = make_mfx_carrier(
    [(1, MFX_Mod_Stacker_Module()), (2, MFX_Mod_Stacker_Module())],
    base=MFX_Baseplate_Portrait_5T_3Pos,
    orientation=Orientation.PORTRAIT,
    name="MyStackCarrier",
)

Define as Dataclasses

To reuse an MFX carrier configuration across scripts, define it once as a dataclass. Subclass the base plate and set the modules. You can also define fixed carriers without modules in the same way, as shown under Plate Carriers.

mfx_carriers.py
import collections.abc
import dataclasses

from unitelabs.labware.hamilton import MFX_Baseplate_6T_5Pos
from unitelabs.labware.hamilton.carriers import HamiltonMFXModule, MFX_Mod_MIDI_HP_Flat, MFX_Mod_Tip_Module


@dataclasses.dataclass
class MFX_CAR_L5_3Tip_2MIDI(MFX_Baseplate_6T_5Pos):
    """MFX 5-position carrier: 3x Tip Module, 2x MIDI HP Flat."""

    modules: dataclasses.InitVar[collections.abc.Sequence[tuple[int, HamiltonMFXModule]]] = (
        (1, MFX_Mod_Tip_Module()),
        (2, MFX_Mod_Tip_Module()),
        (3, MFX_Mod_Tip_Module()),
        (4, MFX_Mod_MIDI_HP_Flat()),
        (5, MFX_Mod_MIDI_HP_Flat()),
    )

Import it wherever you need the carrier:

from mfx_carriers import MFX_CAR_L5_3Tip_2MIDI

carrier = MFX_CAR_L5_3Tip_2MIDI(identifier="mfx_carrier")

Validation Errors

The library checks the configuration when you build it and raises a ValueError on incorrect use, for example when position 6 is specified on a 5-position plate:

Position 6 is out of range for 'MFX_Baseplate_6T_5Pos' (valid: 1-5). No standard base plate supports 6 landscape positions.

It also rejects duplicate positions, mixed module orientations without an orientation argument, and modules whose site is wider than the base plate.

Place Labware on the Carrier

Labware is placed on the carrier by site index, like any other carrier. The index counts sites, not positions. Empty positions are skipped. In the example above every position is filled, so the index is the position minus 1. On a carrier with only positions 1 and 5 filled, position 5 is index 1.

from unitelabs.labware import Standard96Plate
from unitelabs.labware.hamilton import HamiltonTip_300_Filter, HamiltonTipRack_300
from unitelabs.liquid_handling.testing import MicrolabSTARMock

# Instantiate the simulated Hamilton Microlab STAR
hamilton = MicrolabSTARMock()

# MFX_CAR_L5_3Tip_2MIDI is the class built in the example above
carrier = MFX_CAR_L5_3Tip_2MIDI(identifier="mfx_carrier")

carrier[0] = HamiltonTipRack_300(identifier="tips_1", filled_with=HamiltonTip_300_Filter)  # position 1
carrier[1] = HamiltonTipRack_300(identifier="tips_2", filled_with=HamiltonTip_300_Filter)  # position 2
carrier[2] = HamiltonTipRack_300(identifier="tips_3", filled_with=HamiltonTip_300_Filter)  # position 3
carrier[3] = Standard96Plate(identifier="plate_1")  # position 4
carrier[4] = Standard96Plate(identifier="plate_2")  # position 5

hamilton.deck.add(carrier, track=10)

print(hamilton.deck.summary())

The carrier occupies tracks 10 to 15 and holds all five labware items:

  Tracks  Name                             ID          Capacity     Content        X-Range   Height
====================================================================================================
  1 -  9  ┌─
 10 - 15  ├─ MFX_CAR_L5_3Tip_2MIDI         mfx_carrier          5           5   302.5 - 437.5    232.0
          │   ├─ HamiltonTipRack_300       tips_1       96 tips     96 tips
          │   ├─ HamiltonTipRack_300       tips_2       96 tips     96 tips
          │   ├─ HamiltonTipRack_300       tips_3       96 tips     96 tips
          │   ├─ Standard96Plate           plate_1     28800 µl        0 µl
          │   └─ Standard96Plate           plate_2     28800 µl        0 µl
 16 - 30  └─

See Building a Deck for how decks, tracks, and carriers fit together.

Match the modules to your physical carrier, including the _Brackets variants. A wrong module results in incorrect site height, which can cause runtime errors or a crash.

Last updated