PlateCarrier#

Plate carriers slide into rails on railed-decks like Hamilton STAR(let) and Tecan EVO, and are used to hold Plates.

Using a plate carrier#

The PyLabRobot Resource Library (PLR-RL) has a big number of predefined carriers. You can find these in the PLR-RL docs. Hamilton Plate Carriers may be of particular interest.

from pylabrobot.resources.hamilton import PLT_CAR_L5AC_A00
my_plate_carrier = PLT_CAR_L5AC_A00(name="my_plate_carrier")
my_plate_carrier.capacity
5

To assign a plate at a specific location in the plate carrier, simply set it at a specific index. In PLR, carriers are 0-indexed where the site at the front of the robot (nearest to the door) is 0.

from pylabrobot.resources import Cor_96_wellplate_360ul_Fb

my_plate = Cor_96_wellplate_360ul_Fb(name="my_plate")
my_plate_carrier[0] = my_plate

You can assign plates to a variable and to the carrier in a single line.

my_plate_carrier[1] = my_other_plate = Cor_96_wellplate_360ul_Fb(name="my_other_plate")

The children (in the arborescence) of a plate carrier are pylabrobot.resources.carrier.PlateHolder objects. These model the sites for plates on the carrier. A PlateHolder may or may not have a Plate as a child, depending on whether the spot is occupied.

my_plate_carrier[0]
PlateHolder(name=my_plate_carrier-0, location=Coordinate(004.000, 008.500, 086.150), size_x=127.0, size_y=86.0, size_z=0, category=plate_holder)
my_plate.parent
PlateHolder(name=my_plate_carrier-0, location=Coordinate(004.000, 008.500, 086.150), size_x=127.0, size_y=86.0, size_z=0, category=plate_holder)

You can use the PlateHolder.resource attribute to access the Plate object, if it exists.

my_plate_carrier[0].resource
Plate(name=my_plate, size_x=127.76, size_y=85.48, size_z=14.2, location=Coordinate(000.000, 000.000, -03.030))
my_plate_carrier[2].resource is None
True

Moving plates onto carrier sites#

If your liquid handling robot has a robotic arm, or if you are using an external robot arm that can interface with carriers, you can move plates out of or onto carriers using the move_plate method. For this, you can specify the destination by indexing into the carrier. This will return a PlateHolder object.

As an example, we will use the LiquidHandlerChatterboxBackend, but this code will work on any robot that supports moving plates.

from pylabrobot.liquid_handling import LiquidHandler, LiquidHandlerChatterboxBackend
from pylabrobot.resources import STARDeck
lh = LiquidHandler(backend=LiquidHandlerChatterboxBackend(), deck=STARDeck())
lh.deck.assign_child_resource(my_plate_carrier, rails=1)
await lh.setup()
Resource my_plate_carrier was assigned to the liquid handler.
Setting up the liquid handler.
Resource deck was assigned to the liquid handler.
Resource trash was assigned to the liquid handler.
Resource trash_core96 was assigned to the liquid handler.
Resource teaching_carrier was assigned to the liquid handler.
Resource my_plate_carrier was assigned to the liquid handler.
await lh.move_resource(my_plate, my_plate_carrier[2])
Picking up resource: ResourcePickup(resource=Plate(name=my_plate, size_x=127.76, size_y=85.48, size_z=14.2, location=Coordinate(000.000, 000.000, -03.030)), offset=Coordinate(x=0, y=0, z=0), pickup_distance_from_top=0, direction=<GripDirection.FRONT: 1>)
Dropping resource: ResourceDrop(resource=Plate(name=my_plate, size_x=127.76, size_y=85.48, size_z=14.2, location=Coordinate(000.000, 000.000, -03.030)), destination=Coordinate(x=104.0, y=263.5, z=183.12), destination_absolute_rotation=Rotation(x=0, y=0, z=0), offset=Coordinate(x=0, y=0, z=0), pickup_distance_from_top=0, pickup_direction=<GripDirection.FRONT: 1>, drop_direction=<GripDirection.FRONT: 1>, rotation=0)
Resource my_plate was unassigned from the liquid handler.
Resource my_plate was assigned to the liquid handler.