Labware

Building a deck

Building a deck from labware components.

Decks are typically used for arranging labware on the working deck of a liquid handler. Labware can be placed on the deck and the location of the labware will then be measured relative to the deck origin. The coordinate system of the deck is 3-dimensional with x-, y-, z- coordinates which correspond to width, depth, height respectively. When standing in front of the device, the origin is in the bottom, left corner that is in the front of the device. Depending on the device, the origin can be below the deck and beyond the marked tracks. Make sure to familiarize yourself with the respective deck specifics using the guide for that device (e.g. see Liquid handling / Positioning and movement).

Decks have a dimension that is constrained by the liquid handler space. When importing the deck directly as shown below, no such constraints are imposed.

from unitelabs.liquid_handling.hamilton import HamiltonDeck

deck = HamiltonDeck()
print(deck.summary())

Which returns:

'Deck: 0 x 0 mm'

However, if the deck is created automatically using the specific liquid handler class, the deck dimensions are pre-configured for that particular liquid handler model (See Liquid handling / Getting started with liquid handlers for reference).

from unitelabs.sdk import Client
from unitelabs.liquid_handling.hamilton import MicrolabSTAR
from unitelabs.inout import create_remote_connection

client = Client()

# Initialize the Hamilton Microlab STAR
hamilton = MicrolabSTAR(
    transport_factory=create_remote_connection,
    client=client,
    name="Microlab STAR",
)

await hamilton.initialize()

print(hamilton.deck)

Now we can start and add our first carrier. We will use a landscape tip carrier with 5 slots for tips racks. The location of the carrier on the deck is provided in absolute coordinates and passed using the Vector class. We place the carrier starting on rail 16.

from unitelabs.liquid_handling.hamilton import HamiltonDeck
from unitelabs.labware import Vector
from unitelabs.labware.carriers.hamilton import TIP_CAR_480_A00

deck = HamiltonDeck()
tip_carrier = TIP_CAR_480_A00(identifier="tip_carrier")
deck.add(tip_carrier, track=16)
# Alternatively the exact location can be set
# deck.add(tip_carrier, location=Vector(x=100.0 + (16 - 1) * 22.5, y=63, z=100))
print(deck.summary())

Now our deck looks like this:

Deck: 0 x 0 mm

tip_carrier: TIP_CAR_480_A00(identifier='tip_carrier', rotation=0, dimensions=Vector(x=135.0, y=497.0, z=130.0), location=Vector(x=437.5, y=63, z=100), capacity=1, rows=1, cols=1, labware=<LabwareType.TIPS: 'TIP'>, orientation=<Orientation.LANDSCAPE: 'L'>, revision='A00', model='182085')
Dynamic max deck size and deck dimension: When using a dedicated liquid handler class, like the MicrolabSTAR class, a deck is autogenerated and dynamically configured during the initialization process.

We can add more labware to the carrier like a pre-defined Hamilton tip rack and Hamilton standard filter tips. In the following code we first instantiate the StandardTipRack, then fill it with StandardFilterTips and then set the tip rack into the first slot of the tip carrier we created earlier. The tip_carrier object is linked to the deck.

from unitelabs.labware.tips.hamilton import StandardFilterTip, StandardTipRack

tip_rack = StandardTipRack()
tip_rack.fill(StandardFilterTip())
tip_carrier[1] = tip_rack

print(tip_carrier[1])
print(tip_carrier[1].children)

Printing the output of the first carrier site and its children shows that the tip rack and the tips were added successfully.

CarrierSite(identifier='65ef769c', rotation=0, dimensions=Vector(x=Decimal('122.4'), y=Decimal('82.6'), z=Decimal('0')), location=Vector(x=Decimal('6.2'), y=Decimal('298'), z=Decimal('114.95')), orientation=<Orientation.LANDSCAPE: 'LANDSCAPE'>)

[StandardTipRack(identifier='d1e9facd', rotation=0, dimensions=Vector(x=Decimal('122.4'), y=Decimal('82.6'), z=Decimal('20.0')), location=Vector(x=Decimal('0.0'), y=Decimal('0.0'), z=Decimal('0')), tags={}, cols=12, rows=8)]

Adding plates can be done in the same way as adding racks. We will import a plate carrier and add a standard plate to it. We place the carrier starting on rail 10:

from unitelabs.labware.carriers.hamilton import TIP_CAR_480_A00, PLT_CAR_L5MD_A00
from unitelabs.labware.plates.corning_costar import Cos_96_DW_1mL  # A deep-well plate from Corning (Costar)

plate_1 = Cos_96_FB()
plate_carrier = PLT_CAR_L5MD_A00(identifier="plate_carrier")
plate_carrier[1] = plate_1
deck.add(plate_carrier, track=10)

It is often required to create custom labware. Check out the Creating custom labware guide to learn more on that topic! The Getting started with liquid handlers guide explains how the deck is added to the liquid handler class and used in operation.


Copyright © 2024