I was wondering if its possible to pass an array into the liquid class field on aspirate with varying tip types?
Essentially I have a small test method with a sequence that has one 300uL tip and one 50ul tip. I then pass in an array for a 300ul liquid class and a 50ul liquid class:
Oddly I get an error the following error where it thinks the second channel tip is wrong: 2026-07-29 11:09:58.219 Microlab STAR : 1000ul Channel Tip Pick Up (Single Step) - start; 2026-07-29 11:09:58.515 Microlab STAR : 1000ul Channel Tip Pick Up (Single Step) - complete; > channel 1: STF_L_0001, 1 > channel 2: TIP_50ulF_L_0001, 1 2026-07-29 11:09:58.542 Microlab STAR : 1000ul Channel Aspirate (Single Step) - progress; WARNING: The used array index ‘2’ from array ‘t_arr_liquidclasses’ is out of bound. Data from the last available array element (index ‘1’) are used instead; liquid volume will allways be set to ‘0’. 2026-07-29 11:09:58.543 Microlab STAR : 1000ul Channel Aspirate (Single Step) - progress; WARNING: The used array index ‘2’ from array ‘t_arr_liquidclasses’ is out of bound. Data from the last available array element (index ‘1’) are used instead; liquid volume will allways be set to ‘0’. 2026-07-29 11:09:58.544 Microlab STAR : 1000ul Channel Aspirate (Single Step) - progress; WARNING: The used array index ‘2’ from array ‘t_arr_liquidclasses’ is out of bound. Data from the last available array element (index ‘1’) are used instead; liquid volume will allways be set to ‘0’. 2026-07-29 11:09:58.546 Microlab STAR : 1000ul Channel Aspirate (Single Step) - progress; WARNING: The used array index ‘2’ from array ‘t_arr_liquidclasses’ is out of bound. Data from the last available array element (index ‘1’) are used instead; liquid volume will allways be set to ‘0’. 2026-07-29 11:09:58.547 Microlab STAR : 1000ul Channel Aspirate (Single Step) - progress; WARNING: The used array index ‘2’ from array ‘t_arr_liquidclasses’ is out of bound. Data from the last available array element (index ‘1’) are used instead; liquid volume will allways be set to ‘0’. 2026-07-29 11:09:58.549 Microlab STAR : 1000ul Channel Aspirate (Single Step) - progress; WARNING: The used array index ‘2’ from array ‘t_arr_liquidclasses’ is out of bound. Data from the last available array element (index ‘1’) are used instead; liquid volume will allways be set to ‘0’. 2026-07-29 11:09:58.552 Microlab STAR : 1000ul Channel Aspirate (Single Step) - start; 2026-07-29 11:09:58.731 Microlab STAR : Main - error; An error occurred while running Vector. The error description is: Tip type mismatch. (Liquidclass ‘AbC_Channels_Water_Tip50ulFilter_DispenseSurface_Empty_Liquid_lowVol_1ul_15ul’ is defined for tip type ‘50ul Tip with filter (23)’ but ‘Channel 2’ uses a tip of type ‘300ul Standard Volume Tip with filter (1)’.) (0x28 - 0x1 - 0x827) 2026-07-29 11:09:58.735 Microlab STAR : 1000ul Channel Aspirate (Single Step) - complete with error; An error occurred while running Vector. The error description is: Tip type mismatch. (Liquidclass ‘AbC_Channels_Water_Tip50ulFilter_DispenseSurface_Empty_Liquid_lowVol_1ul_15ul’ is defined for tip type ‘50ul Tip with filter (23)’ but ‘Channel 2’ uses a tip of type ‘300ul Standard Volume Tip with filter (1)’.) (0x28 - 0x1 - 0x827) 2026-07-29 11:09:58.736 SYSTEM : Method has been aborted by the system - complete; 2026-07-29 11:09:58.736 SYSTEM : Abort method - start;
I’m guessing you can’t mix tips and liquid classes?
The liquidclass is important since it will instruct your pipetting controller to take a specific action for the liquid.
This works perfectly for normalizations etc. The only thing you need to have is a way to determine which channels have what liquidclass.
Create an array with N indexes (n = number of installed channels)
In my normalization I have SMT that looks to the volumes that need to be aspirated and creates a string for liquidclasses. These will be separated by a |
When I am working in the pipetting controller, I simply check the number of | I have. If I have >1 | sign, I have to fill the array with different liquidclasses. So I split the string. If not. I just fill the array with the same liquidclasses. For channels that are not active I set ““
Then - since I have everything in 2,5 layer - I need to adjust my channelpattern based upon the liquidclass. So I use that array with liquidclasses to pass out a channelpattern for 50, 300 en 1000 tips I have on deck. Then for each tip type I execute a pickup. This is the way how I have all tips type available and I can aspirate all at once.
Thanks Eric! Interesting didn’t think it would require separate tip pickups!
@Pascal yep! I have the liquid classes as an array with a wildcard * already, my mistake was trying to use a tip pickup sequence that had 50uL and 300uL concatenated together!
My secondary question for @Pascal why not just sort by volume “bins”, 300ul, 50ul, 10uL (we don’t use) then aspirate, this keeps your tips in a semi ordered pattern for pickup and you “dance” on the source aspiration. You can also bin the source plate volumes then sort the source plates by deck position to get a more ordered asp sequence. Either way it seems that you will do some “dancing” tip, source, and dest. Just wondering why you chose to “dance” on tip pickup. There is an argument there that an operator watching would understand it to then match their input file if you do a mixed tip pickup.
I think you get the most benefit from binning the aspirations by volume, this minimizes tip pickup dancing. Then sort those bins in the aspiration sequence by deck position again reducing, but not eliminating, dancing on the source aspiration. Another perk is that you can do your large transfer first and benefit from surface dispenses for highly concentrated samples as small volumes are more accurate when dispensing to a liquid instead of an empty well!
@cwehrhan the downside on this is that you might have some hitpicking going down. For a normalization we can have all kind of volumes in a plate, thus it can be scattered across. A tip pickup can take 14 seconds in a regular star. So the time lost on a tippickup dance vs. time lost on a hitpicking can be a consideration.
Since I am in an IVD regulated environment, I opted for the “Do not engage any discussion about tips hanging over other wells” discussion, so I do a column wise aspiration.
@Pascal Got it, that’s a design requirement I definitely didn’t account for!
Yes we hitpick as well, but I sort by x&y the hit picking for the source to make things a bit faster.
Thinking about it though if you’re source and destination are ordered in sets of 8 and you dance on tip pickup that does save time! Still we go for accuracy not speed so high volumes go first!
Fun to talk about this, there’s probably 100s of people in every company that have written normalizations and we all have done it different for different reasons hah collectively it does feel like a bit of a waste of human capitol that we’re all reinventing the wheel lol
It depends here indeed. But since my channels will be equipped with the correct liquidclass and correct tips for the volume, we have 8 samples that will be processed in one go, and dispensed in one go in the next plate.
The upside for this is mainly also in datahandling. Sure with sequence properties etc. you can do a perfect job on keeping the data transferred to correct wells. But in my example, the normalization of a complete plate with 96 samples can be done under 10 minutes. Rather than seeing it hitpick first the samples with 50 tips, 300 tips, 1000 tips.
To paraphrase the great British philosopher J.Clarkson: “SPEEEEEEEEEEEEEEEED and POWERRRR!”