Aspirate 8 channels from different plates, one command

Quick question, is it possible to make an aspirate command use multiple plates.

For example I have a 8 channel STAR and want to aspirate from the A1 of 3 separate plates, all in one aspiration command. I’ve mostly seen examples of singular resources being aspirated from:

await lh.aspirate(plate_1["A2"], vols=[200])

I know this is possible to do in Venus as the Hamilton is sent a C0AS command that holds the x, y, z of all the positions of all the wells.

Thanks,
Colin

nvm found it in the docs here:
https://docs.pylabrobot.org/api/_autosummary/pylabrobot.liquid_handling.liquid_handler.LiquidHandler.aspirate.html

1 Like

for future reference:

lh.aspirate (and dispense) take a list of Containers (like Well), which can be from any plate:

wells_plate_1 = plate_1["A1:A3"]  # List[Well]
wells_plate_2 = plate_2["A1:A3"]  # List[Well]
await lh.aspirate(wells_plate_1 + wells_plate_2, vols=[200])
2 Likes

Another question on this, about that command lh.aspirate

pylabrobot.liquid_handling.liquid_handler.LiquidHandler.aspirate it looks like to me the command wants a sequence with a list containing Containers

Though it looks like you are using the parameters for, pylabrobot.liquid_handling.standard.AspirationPlate, where it takes in a list of wells?

Are these two interchangeable? I guess I’m confused on how lh.aspirate is working with just:
await lh.aspirate(wells_plate_1 + wells_plate_2, vols=[200])

aspirate96 is for the 96 head. The screenshot form the docs is actually just one object that LiquidHandlerBackend.aspirate96 takes, it can also take AspirationContainer in case you’re aspirating from big container with all 96 channels at the same time (should probably be renamed to AspirationContainer96 to avoid confusion with Aspiration, for single-channel aspirations).

Excuse the confusing names, I shall rename:

  • AspirationSingleChannelAspiration: single channel aspiration, like PIP on Hamilton
  • AspirationPlateMultiHeadAspirationPlate: aspirate from wells with 96 (or 384) head
  • AspirationContainerMultiHeadAspirationContainer: aspirate from wells with 96 (or 384) head

idem ditto for Dispense

you’re right, vols should be a list of as many volumes as there are wells

await lh.aspirate(wells_plate_1 + wells_plate_2, vols=[200] * (len(wells_plate_1) + len(wells_plate_2))

Ok I’m getting it, I think but for this documentation of lh.aspirate the docs say it wants a sequence of containers? Though in the examples aren’t you passing it a list of wells?

Can I suggest that:

  • AspirationPlateMultiHeadAspirationPlate: aspirate from wells with 96 (or 384) head

Could be:

  • AspirationPlateMultiHeadAspirationStamp: aspirate from wells with 96 (or 384) head

yes, because there are multiple channels that may operate simultaneously on the pip head. List[SingleChannelAspiration] is clearer.

i thought Stamp typically refers to aspirate + dispense with the 96/384 head, but I could be wrong. Also if we have Stamp for Plate, does that mean aspirating from a Container with the 96 head is not part of stamping? i’m not a biologist, so please enlighten me

also i’m thinking we can use above terminology for fixed-interval 8-channel heads like those on OT or the ML Prep. lh.aspirate8 (cc @CamilloMoschner). That could use the same standard class, but is almost certainly not stamping? just planning, happy to discuss

1 Like

Ok sorry, still might not be getting it. For some reason I’m thinking that a plate is not a container?

Isn’t that what is going on, aspirating with a 96 or 384 head?

a Plate is not a Container, but a Well is

it is also possible to aspirate from a reservoir (“one big well” that all channels go into)

My bad, just realized my assumption was wrong, I’m too ingrained in Hamilton Venus, I was thinking “A1, B1, C1 etc…” was a string and a file was the actual container object…

I get it now its a sequence taking in a container

2 Likes

venus mind virus

2 Likes

lol its no joke, context switching between the two is hard

what is needed in plr to make you stop using venus?

We’re too integrated in Venus at this point unfortunately. Only thing would be PyLabRobot to be operational 4.5 years ago. With over 40 methods on 10 different robots porting over the technical debt would be too much of a risk and time drain.

Possibly CLD/GMP approval as well.

1 Like

On this note, input ['A12', 'A11', 'A10', 'A9', 'A8', 'A7'] as the “sources” for aspirate and got the error that channel 0 and channel 1 were too close together because the y position was the same. Wondering if this is a me problem or a different problem. Using a 12-channel trough for this btw

in this case would you expect the liquid handler to go column by column, x left to right, aspirating from one well at a time?

yes, I think so. doesn’t seem like that functionality isn’t available so maybe it’s user error trying to get it to do something it can’t

no it can.

the check for y-spacing is actually not done when x is different:

        if x1 != x2:  # channels not on the same column -> will be two operations on the machine
          continue

is it possible your plate is rotated? otherwise could you share a reproducible example with the chatterbox backend?

The code ran on chatterbox but gave an error when I moved to the physical machine