Opentrons / opentrons

Software for writing protocols and running them on the Opentrons Flex and Opentrons OT-2
https://opentrons.com
Apache License 2.0
429 stars 180 forks source link

bug: distibute function ignores new_tip='always' argument. #11721

Open lbcp opened 2 years ago

lbcp commented 2 years ago

Overview

The distibute command ignores the new_tip keyword 'always', if the volume exceedes the maximum volume of the tip. It does not change the tip after it distributed the liquid.

Steps to reproduce

Minimal working example:

metadata = {
    'protocolName': 'Distribute does not get a new tip',
    'description': 'Minimal working example.',
    'apiLevel': '2.13'
            }

def run(prot):
    tiprack_1_p300 = prot.load_labware('opentrons_96_filtertiprack_200ul', 2)
    samples_rack = prot.load_labware(
        'opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap', 5)
    p300 = prot.load_instrument('p300_single_gen2', 'left',
                                tip_racks=[tiprack_1_p300])
    cycler = prot.load_module('Thermocycler Module')
    pcr_plate = cycler.load_labware('opentrons_96_aluminumblock_nest_wellplate_100ul')

    sample_tubes = []
    for pos in range(2):
        sample_tubes.append(samples_rack.wells()[pos])

    for i in range(len(sample_tubes)):
        p300.distribute(35, sample_tubes[i],
                        pcr_plate.wells()[1:10],
                        new_tip='always')

Current behavior

The robot picks up a tip, aspirate its maximum volume and distributes it to the specified wells. For the given amount of wells, it must go back to the initial sample well and aspirate more liquid.

However, there is no difference in behaviour between new_tip='always' and new_tip='once'.

Sample output:

Distributing 35.0 from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 to B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7
    Transferring 35.0 from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 to B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7
        Picking up tip from A1 of Opentrons 96 Filter Tip Rack 200 µL on 2
        Aspirating 195.0 uL from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 at 92.86 uL/sec
        Dispensing 35.0 uL into B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into C1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into D1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into E1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into F1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Blowing out at A1 of Opentrons Fixed Trash on 12
        Aspirating 160.0 uL from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 at 92.86 uL/sec
        Dispensing 35.0 uL into G1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into H1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into A2 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into B2 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Blowing out at A1 of Opentrons Fixed Trash on 12
        Dropping tip into A1 of Opentrons Fixed Trash on 12
Distributing 35.0 from B1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 to B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7
    Transferring 35.0 from B1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 to B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7
        Picking up tip from B1 of Opentrons 96 Filter Tip Rack 200 µL on 2
        Aspirating 195.0 uL from B1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 at 92.86 uL/sec
        Dispensing 35.0 uL into B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into C1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into D1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into E1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into F1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Blowing out at A1 of Opentrons Fixed Trash on 12
        Aspirating 160.0 uL from B1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 at 92.86 uL/sec
        Dispensing 35.0 uL into G1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into H1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into A2 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into B2 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Blowing out at A1 of Opentrons Fixed Trash on 12
        Dropping tip into A1 of Opentrons Fixed Trash on 12

Expected behavior

I would expect that the desired behaviour is that the robot distributes the liquid and before aspirating for the second time, it changes the tip.

Otherwise, the tip would cross-contaminate the original sample.

Expected behaviour:

Distributing 35.0 from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 to B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7
    Transferring 35.0 from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 to B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7
        Picking up tip from A1 of Opentrons 96 Filter Tip Rack 200 µL on 2
        Aspirating 195.0 uL from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 at 92.86 uL/sec
        Dispensing 35.0 uL into B1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into C1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into D1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into E1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into F1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Blowing out at A1 of Opentrons Fixed Trash on 12

Here should be a Drop tip step.


        Aspirating 160.0 uL from A1 of Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap on 5 at 92.86 uL/sec
        Dispensing 35.0 uL into G1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into H1 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into A2 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Dispensing 35.0 uL into B2 of Opentrons 96 Well Aluminum Block with NEST Well Plate 100 µL on Thermocycler Module on 7 at 92.86 uL/sec
        Blowing out at A1 of Opentrons Fixed Trash on 12
        Dropping tip into A1 of Opentrons Fixed Trash on 12

Operating system

Windows

System and robot setup or anything else?

Api: 2.13 Version: 6.1

erictleung commented 11 months ago

@lbcp a late response to this, but you may consider using .transfer instead of .distribute.

The documentation on complex commands also suggests this:

distribute() and consolidate() only pick up one tip, even when new_tip="always". For example, this distribute command returns to the source well a second time, because the amount to be distributed (400 µL total plus disposal volume) exceeds the pipette capacity (300 μL): ... If this poses a contamination risk, you can work around it in a few ways:

  • Use transfer() with new_tip="always" instead. ...

Source: https://docs.opentrons.com/v2/complex_commands/parameters.html#avoiding-cross-contamination