Pooling

The Pooling protocol pools liquid from user-specified wells into a single tube.

The wells are specified in the code before the protocol is run. Users can copy and paste from a spreadsheet or manually change the values in the file.

selected_wells_data = """
        1   2       3       4       5       6       7       8       9       10      11      12
A   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
B   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
C   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
D   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
E   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
F   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
G   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
H   FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   TRUE    FALSE   FALSE
"""

This data is then converted to comma-separated value (CSV) format.

selected_wells_data = selected_wells_data.replace('\t', ',')

The run() function starts by reading selected_wells_data in order to determine which wells to pool from.

csv_wells_data = selected_wells_data.splitlines()[1:]
wells_data_reader = csv.DictReader(csv_wells_data)
selected_wells = []
for row in wells_data_reader:
    r = row[""]
    for i in range(1,13):
        new_key = r + str(i)
        row[new_key] = row.pop(f'{i}')
    del row[""]
    keys = list(row.keys())
    true_keys = []
    for key in keys:
        if row[key] == "TRUE":
            true_keys.append(key)
    selected_wells.extend(true_keys)

When we define the sample plate, we can now indicate that the water is in the wells specified by selected_wells.

dna_plate = protocol.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt", 2)
dna = protocol.define_liquid(
    name="DNA",
    description="The DNA samples.",
    display_color="#FD9381"
)
dna_plate.load_liquid(
    wells=selected_wells,
    volume=100,
    liquid=dna
)

Before starting, there should be water in a tube in well A1 of the tube rack.

The robot transfers x µl of water to well A2, where x = 100 - the number of samples.

left_pipette.transfer(volume=(100 - len(selected_wells)), source=tube_rack["A1"], dest=tube_rack["A2"], blow_out=True, blowout_location="destination well")

Then 1µl of each sample gets pooled into the tube at well A2.

for well in selected_wells:
    left_pipette.transfer(volume=1, source=dna_plate[well], dest=tube_rack["A2"], blow_out=True, blowout_location="destination well")