Help with worklist for serial dillutions

Apologies for posting the same topic twice, but I cannot delete my previous post.

Thank you, Stefan, for answering. However, I would like to re-express my problem a bit more clearly (sorry, I realized that yesterday I didn’t provide much information).

I have had my system for a few months now, and I am exploring the more complex parts of Venus: arrays, worklists, and building sequences on the fly.

What I want to do:

I have a basic deck with some tips on the left, a reservoir containing diluent, and a carrier with up to 32 samples. I want to be able to dilute these samples to 1/10, 1/100, 1/1000, and 1/10000:

For the dilution, I will use a worklist. Something like that that the user can browse for. It will look like that:

Column A: sample name (for instance, 1 to 32).

Then, there are 4 other columns: 1/10, 1/100, 1/1000, and 1/10000.

In each of these columns, we enter the final preparation volume.

For example, in column 1/10, sample 1: 600 µL (cell B2). Since this is a 1/10 dilution and we need to prepare a total volume of 600 µL, we must pipette 60 µL from sample 1:1 and add 540 µL of diluent.

Another example: cell B9. We need to prepare 500 µL of a 1/10 dilution. Therefore, we take 50 µL of sample and dilute it with 450 µL of diluent.

Where it becomes tricky (and where I need to build the sequence on the fly…) is that not all samples are diluted to 1/10,000. For instance, sample 1 is only diluted to 1/10 (row 2), while sample 4 goes to 1/1,000 (row 5), and sample 13 goes to 1/10,000 (row 14). Here, I’m having some difficulty building the sequence on the fly and determining where it should stop.

Do ay of you have something similar that you have built so I can get some inspiration?

Thank you very much! :slight_smile:

1 Like

Hi @Hondatbertrand,

I think you will find that there are may ways to accomplish this and some are significantly easier than others. Since you are utilizing a worklist that a user can browse to I would start with reading the file ascii after declaring everything that you will or could need in terms of sequences and arrays. You can lump all the diluent into one single sequence and array as well.

  1. Sequence for diluent target
  2. Array of volumes for diluent target
  3. Sequence for 1st dilution sample source
  4. Sequence for 1st dilution sample target
  5. Array of volumes for 1st sample source to target
  6. Sequence for 2nd dilution sample source
  7. Sequence for 2nd dilution sample target
  8. Array of volumes for 2nd sample source to target
  9. Same 3 as above for the 1/1000 dilution and the 1/10000 dilution

When you read a file as ascii it must be a structured text file (.csv, .txt, etc.) and you will be reading the file with a single variable where each row is concatenated into that variable. So the second line would look something like “1,600,” or “1,600” and the third line like “2,900,800,900,” or “2,900,800,900” (noting the commas and their placements) if the file is a .csv (comma separated values). You can then use the split function of the HslExtensions string library to turn those strings into an array of values delimited by the comma character - so you end up with arrays of 1 and 600, 2 900 800 and 900, and so on. But these values are strings - you can use the regular string library or the HslExtensions Core library to convert the necessary values into integers or floats. And then with a few if/else statements and some simple arithmetic you can plug and chug values into the above sequences and arrays:

  1. Loop over the file and skip the first line since its a header
  2. Line two has the read variable “1,600” - split it into an array of “1” and “600”
  3. Since an array value is in the second position (“600”) you know at least a first dilution needs to be made - convert 600 to an integer or a float and divide by 10. Add that value to the “Array of volumes for 1st sample source to target”
  4. Subtract that value from 600 (or multiply by 9) and add that value to the “Array of volumes for diluent target”
  5. You have the “1” as the position value from the first value of the array - Add that position with the source labware to “Sequence for 1st dilution sample source” and that position with the first target labware to “Sequence for 1st dilution sample target”. Also add the target sequence position to the “Sequence for diluent target”
  6. You now have 1 value in each of 2 arrays and 1 sequence position in each of 3 sequences. Since no more values exist in the array that was made from the read string move on to the next row. But if more values did exist then treat them like you did with the “600” and add the corresponding values to the correct arrays and sequences.
  7. Once you move on to the next row you have a brand new read string to convert into an array. Repeat these steps with each row building onto the above arrays and sequences until you complete reading the file.

Then perform your pipetting using the correct sequences and arrays in a step-by-step fashion. Pipette all of your diluent first, then perform the first dilution for all samples, then the truncated second dilution for the necessary samples, and so on.

Matt

4 Likes

Hi Matt

Thank you for the answer.

I am starting digesting it and my first question is:

Why would you use ASCII instead of CSV?

Thank you!

Hi @Hondatbertrand,

My apologies if this wasn’t clear in my previous post, but you use ASCII to read the .csv:

You are more than welcome to do otherwise as I mentioned that there are many solutions to a single problem in VENUS. But from my experience ASCII gives you full control of the file with little room for error. In particular, when it comes to reading .csv files handling them as ASCII does not rely on the use of the adjacent schema.ini file that gets generated. Sometimes this file steers automated file handling in the wrong direction.

Matt

5 Likes

Great, thank you!