STAR Pipetting Tools (Limitation?)

Hello everyone,

I am working on a protocol that involves a step where I transfer a reagent from a reservoir to some conical tubes. I am utilizing the HighVolumeHelper library to split any large volume of reagent transfer and the STAR Pipetting Tools library to subsequently mix the samples at different fixed heights. However, there seems to be a problem with how the STAR Tool processes the output sequence from the HighVolumeHelper Library.

The HighVolumeHelper Library can successfully split the large sequence and update the volume array and destination source accordingly (see below). For example, alpaqua_50_mL_0001, PositionID : A1 is duplicated twice to account for splitting a large volume of 1212 uL.

2024-06-28 13:51:59> TRACELEVEL : TraceArray - start;    --------------------------
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [1]: 134.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [2]: 606.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [3]: 606.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [4]: 105.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [5]: 292.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [6]: 145.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [7]: 645.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [8]: 120.0
2024-06-28 13:51:59> TRACELEVEL : TraceArray - progress; Glycerol_volume [9]: 210.0
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; Name:    l_seqTemp
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; Current: 1
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; Count:   9
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; Total:   9
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; Max:     9
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; Used:    0
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: output_1, PositionID : 1
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: alpaqua_50_mL_0001, PositionID : A1
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: alpaqua_50_mL_0001, PositionID : A1
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: output_1, PositionID : 3
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: alpaqua_50_mL_0001, PositionID : A2
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: output_1, PositionID : 5
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: alpaqua_50_mL_0001, PositionID : A3
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: output_1, PositionID : 7
2024-06-28 13:51:59> TRACELEVEL : TraceSequence - progress; LabwareID: output_1, PositionID : 8

However, when I am using the SPT::PIP_FindLiquidLevel function (for example) to build the pipetting height array based on this new sequence, it seems to only build the array based on unique positions, ignoring the duplicated ones.

2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [1]: 18.0   glycerol volume [1]: 134.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [2]: 18.0   glycerol volume [2]: 145.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [3]: 18.0   glycerol volume [3]: 105.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [4]: 18.0   glycerol volume [4]: 120.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [5]: 18.0   glycerol volume [5]: 210.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [6]: 18.0   glycerol volume [6]: 606.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [7]: 18.0   glycerol volume [7]: 606.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress; liquid level for glycerol destination [8]: 18.0   glycerol volume [8]: 292.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - progress;                                                   glycerol volume [9]: 645.0
2024-06-28 13:52:02> TRACELEVEL : TraceArraysFaceToFace - complete; ----------------------------------------------------------------------------

Because of this, I am receiving an error where the array index is out of bound since the two arrays are not equal, resulting in the step not working. :slightly_frowning_face:

I was wondering if there is a way around this limitation. I could split the reagent transfer step and mixing step, but that would increase time and use up more tips.

Any help greatly appreciated,

Nat

Hi @Nat ,

All of the Pipetting Tools functions require positions that do not require a serpentine movement, ie cherry pick or repeating positions. This is noted within the description of the functions:

You would need to use all unique positions (pre-split up sequence) that are sorted in channel order and can be performed in a single step.

This is most important for your mix step as it will keep the channels within the tubes in between cycles.

The BuildChannelPatternFromSequence function will create a channel pattern for the next set of positions that abide by X/Y restraints of the Pipetting Tools library.

Hi @BrandonBare_Hamilton

Thank you for in-depth explanation of these functions as I figured that was the case! I will clarify by saying that the step is working as expected, where the BuildChannelPatternSequence function is creating the channel pattern abiding by X/Y restraints, including the duplicated positions. For example, my sequence has 9 positions (8 unique and 1 duplicated positions) and the steps splitting the sequence/tips and pipetting accordingly. At the end, I can see that a total of 9 tips was picked up. So I can verify that the BuildChannelPatternSequence function is working as you explained it.

However, what is confusing is that the FindLiquidLevel function is not accommodating for the duplicated positions unlike the previous function. Instead of building an array that contains 9 indexes to match the total number of positions I have, it is creating an array that contains 8 indexes. Because of this, the LiquidHeightsFound array is being consumed before the my volume array in my single steps, leading to a:

2024-06-28 13:52:04> Microlab® STARplus : Main - error; An error occurred while running Vector.  The error description is: One or more arguments are invalid.  (The used array index '9' cannot be used for the array 'arr_LiquidLevelHeights' with only '8' elements.) (0x28 - 0x6 - 0x3)

If this library is not suitable for my protocol, then I completely understand and will look for another way. I am simply confused about the discrepancy I see between the two functions you explained and wondering if this design was intentional.

-Nat

(Edit: In case you are wondering how I am setting up the single steps with the library, here is a screenshot. I am using a regular single step for dispensing since it supports multiple array values, but for my mixing step (disabled) I will use the library pipetting steps)

Hi @Nat ,

Thank you for the example, it helped me visualize what you are trying to accomplish.

I replicated the sequence you were using with the replicate being within the second position. How the build channel pattern works is it stops as soon as the sequence violates the position rules, or the max number of channels has been used. For my test it stops after the second well which is where the replicate resides.

image
image

So, the pipetting finishes with 2 rounds. 1 with 2 channels and the remainder with 7.

One thing to keep in mind with the FindLiquidLevel function is the return will always have the same number of channels that are on the system. Even if a partial channel is used. Based on your screen shot, this means the liquid level array will always be 8 items within it.

I was able to reproduce your steps and complete by changing the index value for the dispense height to be 1 instead of t_intVolumeIndex. See below:

Your aspiration command can use use the t_intVolumeIndex variable, but the Liquid Heights array will always be refreshed after the function call.

Here is what my test method looked like:

1 Like

Thank you @BrandonBare_Hamilton! It works perfectly now! I honestly forgot that the array index can reset after a loop using that setting. I’m just so use to creating arrays of the same sizes :sweat_smile:

1 Like