384-well plate dispensing with CO-RE 96 head

No, this is definitely possible with VENUS.

I have seen it at a company (I can’t name) a long time ago (before my Hamilton Universe journey really began).
You need a slightly different tip_rack, one with lower side walls, so the MHP doesn’t crash into the walls of tip_rack.

Plus, one has to ensure that the MHP won’t crash into other labware around.

I’m going to generate a PR either tonight or tomorrow for use of MFX modules (was more complicated than expected), with showcases of DWP and universal tip rack modules.
The tip rack module is ideal to test out the MPH pick up because it can be surrounded by plate positions which are much lower in z.

And PLR-wise, shouldn’t one be able to just give the MPH the position of the back-left tip_spot, i e. there is no software constraint?

1 Like

Just verified that the following works:

await lh.aspirate96(plate384.get_quadrant(1), volume=10)
await lh.aspirate96(plate384.get_quadrant(2), volume=10)
await lh.aspirate96(plate384.get_quadrant(3), volume=10)
await lh.aspirate96(plate384.get_quadrant(4), volume=10)

I needed a little offset of , offset=Coordinate(x=1, y=0, z=0) but that was also present for a 96 well plate, so potentially a hardware issue.

1 Like

Are you talking about the tip support with shifted tip pickup on 96 head?

2 Likes

Yes!

Thank you @bowlineknot !

That’s exactly what I was talking about… look at that - a 13 year old video showcasing a super-OP single tip pickup with a 96-MPH :smiley:

3 Likes

(playing the grumpy admin here to keep this organized, for maximizing productivity of future readers: I think this should be moved to a separate thread. But happy to work on this!)

2 Likes

Will try to test this tomorrow!

1 Like

Hey @rickwierenga this .get_quadrant() thing is not working for me. I’m just doing some dry testing right now getting back up to speed on PLR after a couple months away, so forgive me if I missed something that changed. This is all on a current updated install.

I’m using the Revvity_384_wellplate_28ul_Ub as a test plate definition. When I do:

plate_car[1] = Revvity_384_wellplate_28ul_Ub(name='test_plate384')
plate384 = lh.deck.get_resource('test_plate384')
await lh.aspirate96(plate384.get_quadrant(1), volume = 10)

I get the following error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[14], line 1
----> 1 await lh.aspirate96(plate384.get_quadrant(1), volume = 10)

File ~/Documents/FutureHouse/Lab/Automation/pylabrobot/pylabrobot/liquid_handling/liquid_handler.py:1365, in LiquidHandler.aspirate96(self, resource, volume, offset, flow_rate, blow_out_air_volume, **backend_kwargs)
   1343 """ Aspirate from all wells in a plate or from a container of a sufficient size.
   1344 
   1345 Examples:
   (...)
   1360   backend_kwargs: Additional keyword arguments for the backend, optional.
   1361 """
   1363 if not isinstance(resource, (Plate, Container)) or \
   1364   (isinstance(resource, list) and all(isinstance(w, Well) for w in resource)):
-> 1365   raise TypeError(f"Resource must be a Plate, Container, or list of Wells, got {resource}")
   1367 extras = self._check_args(self.backend.aspirate96, backend_kwargs, default={"aspiration"})
   1368 for extra in extras:

TypeError: Resource must be a Plate, Container, or list of Wells, got [Well(name=test_plate384_well_0_0, location=(008.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_0, location=(017.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_0, location=(026.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_0, location=(035.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_0, location=(044.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_0, location=(053.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_0, location=(062.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_0, location=(071.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_0, location=(080.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_0, location=(089.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_0, location=(098.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_0, location=(107.830, 073.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_2, location=(008.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_2, location=(017.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_2, location=(026.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_2, location=(035.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_2, location=(044.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_2, location=(053.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_2, location=(062.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_2, location=(071.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_2, location=(080.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_2, location=(089.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_2, location=(098.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_2, location=(107.830, 064.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_4, location=(008.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_4, location=(017.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_4, location=(026.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_4, location=(035.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_4, location=(044.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_4, location=(053.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_4, location=(062.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_4, location=(071.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_4, location=(080.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_4, location=(089.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_4, location=(098.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_4, location=(107.830, 055.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_6, location=(008.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_6, location=(017.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_6, location=(026.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_6, location=(035.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_6, location=(044.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_6, location=(053.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_6, location=(062.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_6, location=(071.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_6, location=(080.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_6, location=(089.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_6, location=(098.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_6, location=(107.830, 046.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_8, location=(008.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_8, location=(017.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_8, location=(026.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_8, location=(035.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_8, location=(044.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_8, location=(053.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_8, location=(062.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_8, location=(071.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_8, location=(080.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_8, location=(089.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_8, location=(098.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_8, location=(107.830, 037.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_10, location=(008.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_10, location=(017.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_10, location=(026.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_10, location=(035.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_10, location=(044.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_10, location=(053.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_10, location=(062.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_10, location=(071.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_10, location=(080.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_10, location=(089.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_10, location=(098.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_10, location=(107.830, 028.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_12, location=(008.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_12, location=(017.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_12, location=(026.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_12, location=(035.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_12, location=(044.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_12, location=(053.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_12, location=(062.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_12, location=(071.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_12, location=(080.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_12, location=(089.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_12, location=(098.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_12, location=(107.830, 019.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_0_14, location=(008.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_2_14, location=(017.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_4_14, location=(026.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_6_14, location=(035.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_8_14, location=(044.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_10_14, location=(053.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_12_14, location=(062.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_14_14, location=(071.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_16_14, location=(080.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_18_14, location=(089.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_20_14, location=(098.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well), Well(name=test_plate384_well_22_14, location=(107.830, 010.190, 008.200), size_x=3.3, size_y=3.3, size_z=5.3, category=well)]
1 Like

strange error. are you using a notebook with autoreload? this sometimes causes isinstance checks to fail unexpectedly

can you run all(isinstance(w, Well) for w in =plate384.get_quadrant(1))) for debugging?

I am using autoreload in my notebook, but I just restarted it and ran without autoreload activated and had the same error.

I ran all(isinstance(w, Well) for w in plate384.get_quadrant(1)) (I think you had an extra ) and =?)

and got:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[24], line 1
----> 1 all(isinstance(w, Well) for w in plate384.get_quadrant(1))

Cell In[24], line 1
----> 1 all(isinstance(w, Well) for w in plate384.get_quadrant(1))

NameError: name 'Well' is not defined

from pylabrobot.resources import Well

from pylabrobot.resources import Well
all(isinstance(w, Well) for w in plate384.get_quadrant(1))

Evaluates True

heh, so why does it not work in aspirate96? (this really seems like an autoload issue…)

I just opened a fresh notebook to work from scratch without the autoreload and it’s still doing the same thing :upside_down_face:

was my bad. please pull from plr:main for fix

2 Likes

Working now, thank you!

1 Like