Add Carriers to Hamilton worktable using PyLabRobot

How do i add a ShakerCarrier, COOLER or MFXCarrier to my Hamilton worktable.

I am trying to recreate my Hamilton worktable in PyLabRobot. I can read in the basic.ipynb how to add basic labware from pylabrobot.resources.hamilton.
But i don’t understand how to add carriers such as ShakerCarrier and MFXCarrier as they are classes.

Can you show me an example of how to add such carriers?
For the COOLER Carrier i cannot find any such carrier. Is that because it has not been created yet?

Only the MFXCarrier and ShakerCarrier are supported, both contributed by @CamilloMoschner. Please feel free to add support for the COOLER and ask here if you need help!

From there, it should be easy to instantiate a resource with the parameters you want.

You can see an example of adding the MFXCarrier in one of Camillo’s PRs: Establishing Revvity resource folder (+ proposing readme files for each resource folder) by BioCam · Pull Request #58 · PyLabRobot/pylabrobot · GitHub.

Hi @Vilhelm,

The ShakerCarrier and MFXCarrier are both still in active development.

For both of these we have potentially two ways of defining them:

  1. Create specific definitions for sth like ShakerCarrier_empty_empty_HHS_HHS, i.e. the first two positions are emtpy and then there are two HHS. The HHS can then be used like a plate_site on a plate carrier. That means plates can be transported there and liquid can be transported to the plates on the HHSs.
  2. Create a generic ShakerCarrier instance with 4 empty slots, then add devices like the HHS into any slot inside our script, and then use HHS like plate_sites. This would mean that ShakerCarrier slots are very quickly adaptable but comes at the risk of people assigning devices to the wrong slot - for plates on a plate carrier that is not that big of a deal but for devices this could be dangerous to the machine.

Additionally, MFXCarriers and ShakerCarriers are different in how they are added to the deck:
MFXCarriers are slided onto the deck just like a normal carrier.
ShakerCarriers however are actually screwed into the deck, essentially becoming part of the deck and imo this means they are not “Carriers” at all… because they don’t “carry” anything, they are stationary.

I would love to get some feedback on this. What do you think would be the most useful definition for your needs?

  1. Create specific definitions
  2. Generic definitions whose device slots can be defined in the run script

And for which “carrier” do you think what?

  1. ShakerCarrier
  2. MFXCarrier

Finally, I am not familiar with a carrier called “COOLER”. Could you please share a cat no, URL or image?

Hey @CamilloMoschner
I am quit new to PLR and have close to no experience programming hamilton through anything but PLR.
My background is within Tecan Fluent, Tecan Evo and Opentrons so there is a lot of Hamilton terminology that i am missing.

I can see that if i was to use a tip carrier i would import it from the resources and write the following code:

tip_car = TIP_CAR_480_A00(name=‘tip carrier’)
tip_car[0] = HTF_L(name=‘tips_01’)
lh.deck.assign_child_resource(tip_car, rails=7)

For using the MFXCarrier and ShakersCarriers i don’t understand how to write the code to place them or how to define the HHS or HTF’s.

I am not sure exactly what you are asking or if i am the right one to ask as for the moment i am still just getting in to use PLR and I don’t really have any strong opinions on the architecture yet as i am still learning.

What i am really trying to do is to recreate the deck you see in the attachments. I opened the Hamilton program and took a screen shot of they deck layout. I also added the names of carriers and slots on the deck.

The COOLER is shown on the deck that is why i asked it looks like it has the dimensions of a PLT_CAR_L5AC but with the ability to cool plates.


IMO this is preferred over specific definitions like ShakerCarrier_empty_empty_HHS_HHS. There is a combinatorial explosion otherwise.

I think “the risk of people assigning devices to the wrong slot” is their freedom and responsibility.

However, you could only allow changes to a carrier at __init__, and always raise an error in a assign_child_resource-override method if you want.

Does this have a cable? What is it plugged into? How do you control it?

Sounds like you would like one interface to use all your machines and exchange protocols between them easily :slight_smile:

Don’t worry about it. I know what you are going through: entering a new liquid handler universe is quite a lot to take in all at once. It took me a couple of months and I am constantly learning new things.
But you have provided all the necessary information with your images and mission statement:

To be frank, integrating your deck layout will take a little bit of time. Reason: Your deck is filled with not-yet integrated resources which multiple people are currently actively working on integrating:

From left to right (using the picture of your STAR):

  1. ShakerCarrier - 7T - does not slide - screwed into deck - contains four slots → not yet integrated
  2. HeaterShaker - requires ShakerCarrier (or some sturdy fixation) → partly integrated: yes, as a direct connection to the STAR itself, no as a separate machine (including through a heater shaker box)
  3. Crystal Vacuum System (CVS) → not yet integrated
  4. TIP_CAR_NTR - 6T tip carrier → not yet integrated
  5. NTR - nested tip racks for 50ul, 300ul, 1000ul tips - require specialised holder system given by the carrier (4.) → not yet integrated, requires PLR design of nesting
  6. RGT_CAR_3R_A01(?) - reagent carrier for 3x troughs, 120ml capacity each → not yet integrated
  7. RGT_CAR_5R60_A00(?) - reagent carrier for 5x troughs, 50ml capacity each → not yet integrated
  8. some version of an SMP_CAR_32 - a sample carrier able to hold 32 tubes → not yet integrated
  9. plate carriers → integrated (tough I’m, not sure about your exact carrier number)
  10. carriers named “COOLER” - interesting one: from the looks of it I would say these are two “temperature controlled carriers” (TCCs); I haven’t seen one in real life though. To confirm do you see a connection from these COOLERs to a bottle looking like this?:
  11. CO-RE grippers → already integrated
  12. Looks like a 2D barcode scanner? → not yet integrated
  13. no autoload system → already integrated but not useful to you because not installed
  14. Looks like you have CO-RE I technology channels - doesn’t matter to PLR
  15. you got rid of the annoying front cover and taped over the sensor that checks its presence… nice :sweat_smile:

This is an awesome and powerful setup and well integrated with its neighbours.
I recommend you check out @EricSindelar_Hamilton’s extremely useful compendium of information if you are new to the Hamilton universe and want to get started quickly.

In regards to PLR integration, in the next month we should have integrated 1, 2, 4, 5, 6, 7, 8.
@rickwierenga, please let us know whether there are integrations that I mislabelled as not yet integrated.

Can you please confirm whether you have a Heater Shaker Box (HSB), this would be a separate metal box that your heater-shaker would be attached to?
I’d assume that your TCCs are connected directly into the STAR.

1 Like

Thank you for the very thorough answer :slight_smile:
Great that things are on the way. I have no expectation of everything working out of the box. My first PLR script will be cherry picking so i will not need anything expect tips and slots for plates.

The ManifoldTop is connected to a vacuum pump with a container identical to the one you show in your image for the TCC. So the HHS does not have any box.

The COOLING_5 is attached to this cooling unit. It contains cooling liquid which is circulated between the cooler and the cooling unit. The carriers have a serial number on them: P/N 188035/00. Cannot see where it connect to the Hamilton though.

List number 4 you say that TIP_CAR_NTR is not integrated, but when i look in line 1390 in script: pylabrobot/resources/ml_star/
I can find: TIP_CAR_NTR_A00
Is this the same carrier?

My current challenge is understanding how to use the MFX_CAR carrier shown on the image.
pylabrobot/resources/ line 203 i see a MFXCarrier class, but i dont understand how to alter it to fit my deck layout.

1 Like


Does it plug in anywhere else / is it controlled with software or just the ‘gadget’ sitting on top of it in your image?

I’m pretty sure it is. Are you able to pick up tips using this definition?

You’d simply create an instance by calling the initializer with the appropriate parameters:

def __init__(
    name: str,
    size_x: float,
    size_y: float,
    size_z: float,
    sites: Optional[List[CarrierSite]] = None,
    model: Optional[str] = None):

CarrierSites are easily created using

def create_homogeneous_carrier_sites(
  locations: List[Coordinate],
  site_size_x: float,
  site_size_y: float) -> List[CarrierSite]

from resources/

Check out for examples.

added greiner plates

Thank you for sharing the labware files!

Check out STAR.disable_cover_control()

1 Like