From 868cce400c728e9a5e0fc1043d52f53b13a1dcfb Mon Sep 17 00:00:00 2001 From: Ryan howard Date: Wed, 17 Jul 2024 17:59:36 -0400 Subject: [PATCH 1/3] add protocols --- .../hardware_testing/liquid_sense/__main__.py | 18 +++++---- .../liquid_sense_ot3_p1000_96_1well.py | 40 +++++++++++++++++++ .../liquid_sense_ot3_p1000_multi_12well.py | 33 +++++++++++++++ ...> liquid_sense_ot3_p1000_single_96well.py} | 2 +- ...y => liquid_sense_ot3_p50_multi_12well.py} | 1 + ... => liquid_sense_ot3_p50_single_96well.py} | 4 +- 6 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py create mode 100644 hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py rename hardware-testing/hardware_testing/protocols/liquid_sense_lpc/{liquid_sense_ot3_p1000_96_well.py => liquid_sense_ot3_p1000_single_96well.py} (93%) rename hardware-testing/hardware_testing/protocols/liquid_sense_lpc/{liquid_sense_ot3_p50_multi.py => liquid_sense_ot3_p50_multi_12well.py} (96%) rename hardware-testing/hardware_testing/protocols/liquid_sense_lpc/{liquid_sense_ot3_p50_single_vial.py => liquid_sense_ot3_p50_single_96well.py} (88%) diff --git a/hardware-testing/hardware_testing/liquid_sense/__main__.py b/hardware-testing/hardware_testing/liquid_sense/__main__.py index ca0b632290c..f17c08677fd 100644 --- a/hardware-testing/hardware_testing/liquid_sense/__main__.py +++ b/hardware-testing/hardware_testing/liquid_sense/__main__.py @@ -37,9 +37,11 @@ from .post_process import process_csv_directory, process_google_sheet from hardware_testing.protocols.liquid_sense_lpc import ( - liquid_sense_ot3_p50_single_vial, - liquid_sense_ot3_p1000_96_well, - liquid_sense_ot3_p50_multi, + liquid_sense_ot3_p50_single_96well, + liquid_sense_ot3_p1000_96_1well, + liquid_sense_ot3_p1000_single_96well, + liquid_sense_ot3_p50_multi_12well, + liquid_sense_ot3_p1000_multi_12well, ) try: @@ -71,13 +73,13 @@ LIQUID_SENSE_CFG: Dict[int, Dict[int, Any]] = { 50: { - 1: liquid_sense_ot3_p50_single_vial, - 8: liquid_sense_ot3_p50_multi, + 1: liquid_sense_ot3_p50_single_96well, + 8: liquid_sense_ot3_p50_multi_12well, }, 1000: { - 1: liquid_sense_ot3_p1000_96_well, - 8: None, - 96: None, + 1: liquid_sense_ot3_p1000_single_96well, + 8: liquid_sense_ot3_p1000_multi_12well, + 96: liquid_sense_ot3_p1000_96_1well, }, } diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py new file mode 100644 index 00000000000..736e0b8b4a1 --- /dev/null +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py @@ -0,0 +1,40 @@ +"""lld OT3 P1000.""" +from opentrons.protocol_api import ProtocolContext, OFF_DECK + +metadata = {"protocolName": "liquid-sense-ot3-p1000-96"} +requirements = {"robotType": "Flex", "apiLevel": "2.17"} + +SLOT_SCALE = 1 +SLOT_DIAL = 9 + +SLOTS_TIPRACK = { + 50: [2, 3, 4, 5, 6], + 200: [2, 3, 4, 5, 6], + 1000: [2, 3, 4, 5, 6], +} + +LABWARE_ON_SCALE = "nest_1_reservoir_195ml" + +def run(ctx: ProtocolContext) -> None: + """Run.""" + trash = ctx.load_trash_bin("A3") + vial = ctx.load_labware(LABWARE_ON_SCALE, SLOT_SCALE) + dial = ctx.load_labware("dial_indicator", SLOT_DIAL) + pipette = ctx.load_instrument("flex_96channel_1000", "left") + adapters = [ + ctx.load_adapter("opentrons_flex_96_tiprack_adapter", slot) + for slot in SLOTS_TIPRACK[50] + ] + for size, slots in SLOTS_TIPRACK.items(): + tipracks = [ + adapter.load_labware(f"opentrons_flex_96_tiprack_{size}uL") + for adapter in adapters + ] + for rack in tipracks: + pipette.pick_up_tip(rack["A1"]) + pipette.aspirate(10, vial["A1"].top()) + pipette.dispense(10, vial["A1"].top()) + pipette.drop_tip(trash) + ctx.move_labware(rack, OFF_DECK) + + diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py new file mode 100644 index 00000000000..a4a27811560 --- /dev/null +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py @@ -0,0 +1,33 @@ +"""Liquid Sense OT3 P1000.""" +from opentrons.protocol_api import ProtocolContext + +metadata = {"protocolName": "liquid-sense-ot3-p50-multi"} +requirements = {"robotType": "Flex", "apiLevel": "2.15"} + +SLOT_SCALE = 1 +SLOT_DIAL = 9 +SLOTS_TIPRACK = { + 50: [3], + 200: [3], + 1000: [3], +} +LABWARE_ON_SCALE = "nest_12_reservoir_15ml" + + +def run(ctx: ProtocolContext) -> None: + """Run.""" + trash = ctx.load_trash_bin("A3") + vial = ctx.load_labware(LABWARE_ON_SCALE, SLOT_SCALE) + dial = ctx.load_labware("dial_indicator", SLOT_DIAL) + pipette = ctx.load_instrument("flex_8channel_1000", "left") + for size, slots in SLOTS_TIPRACK.items(): + for slot in slots: + rack = ctx.load_labware(f"opentrons_flex_96_tiprack_{size}uL", slot) + pipette.pick_up_tip(rack["A1"]) + pipette.aspirate(10, vial["A1"].top()) + pipette.dispense(10, vial["A1"].top()) + pipette.aspirate(10, dial["A1"].top()) + pipette.dispense(10, dial["A1"].top()) + pipette.drop_tip(trash) + ctx.move_labware(rack, OFF_DECK) + diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_well.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_single_96well.py similarity index 93% rename from hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_well.py rename to hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_single_96well.py index 306abe2d48d..af96858af57 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_well.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_single_96well.py @@ -1,7 +1,7 @@ """Liquid Sense OT3.""" from opentrons.protocol_api import ProtocolContext, OFF_DECK -metadata = {"protocolName": "liquid-sense-ot3-p1000-single-vial"} +metadata = {"protocolName": "liquid-sense-ot3-p1000-single-96well"} requirements = {"robotType": "Flex", "apiLevel": "2.17"} SLOT_SCALE = 1 diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py similarity index 96% rename from hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi.py rename to hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py index 69d571f0259..8a55ab6833c 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py @@ -12,6 +12,7 @@ def run(ctx: ProtocolContext) -> None: """Run.""" + trash = ctx.load_trash_bin("A3") tipracks = [ ctx.load_labware(f"opentrons_flex_96_tiprack_{size}uL", slot) for size, slots in SLOTS_TIPRACK.items() diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_single_vial.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_single_96well.py similarity index 88% rename from hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_single_vial.py rename to hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_single_96well.py index 7a7e607d08e..9b597074a34 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_single_vial.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_single_96well.py @@ -1,7 +1,7 @@ """Liquid Sense OT3.""" from opentrons.protocol_api import ProtocolContext, OFF_DECK -metadata = {"protocolName": "liquid-sense-ot3-p50-single-vial"} +metadata = {"protocolName": "liquid-sense-ot3-p50-single-96well"} requirements = {"robotType": "Flex", "apiLevel": "2.17"} SLOT_SCALE = 1 @@ -9,7 +9,7 @@ SLOTS_TIPRACK = { 50: [3], } -LABWARE_ON_SCALE = "radwag_pipette_calibration_vial" +LABWARE_ON_SCALE = "corning_96_wellplate_360ul_flat" def run(ctx: ProtocolContext) -> None: From a91e99e2ab612b33a94fd039aac367f001fed530 Mon Sep 17 00:00:00 2001 From: Ryan howard Date: Thu, 18 Jul 2024 12:24:57 -0400 Subject: [PATCH 2/3] floor the plunger speed for the 96 to prevent stalls --- api/src/opentrons/hardware_control/ot3api.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index 6d567b7a667..ab3f94e232f 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -2631,6 +2631,14 @@ async def liquid_probe( ) max_speeds = self.config.motion_settings.default_max_speed p_prep_speed = max_speeds[self.gantry_load][OT3AxisKind.P] + # We need to significatly slow down the 96 channel liquid probe + if self.gantry_load == GantryLoad.HIGH_THROUGHPUT: + max_plunger_speed = self.config.motion_settings.max_speed_discontinuity[ + GantryLoad.HIGH_THROUGHPUT + ][OT3AxisKind.P] + probe_settings.plunger_speed = min( + max_plunger_speed, probe_settings.plunger_speed + ) error: Optional[PipetteLiquidNotFoundError] = None pos = await self.gantry_position(checked_mount, refresh=True) From b541c921f371f1c4359fb1b7f7f5f95694fbac4b Mon Sep 17 00:00:00 2001 From: Ryan howard Date: Fri, 19 Jul 2024 15:10:45 -0400 Subject: [PATCH 3/3] format --- .../liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py | 5 +++-- .../liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py | 3 +-- .../liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py index 736e0b8b4a1..ae89b4550a7 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_96_1well.py @@ -15,6 +15,7 @@ LABWARE_ON_SCALE = "nest_1_reservoir_195ml" + def run(ctx: ProtocolContext) -> None: """Run.""" trash = ctx.load_trash_bin("A3") @@ -34,7 +35,7 @@ def run(ctx: ProtocolContext) -> None: pipette.pick_up_tip(rack["A1"]) pipette.aspirate(10, vial["A1"].top()) pipette.dispense(10, vial["A1"].top()) + pipette.aspirate(10, dial["A1"].top()) + pipette.dispense(10, dial["A1"].top()) pipette.drop_tip(trash) ctx.move_labware(rack, OFF_DECK) - - diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py index a4a27811560..b77461598c8 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p1000_multi_12well.py @@ -1,5 +1,5 @@ """Liquid Sense OT3 P1000.""" -from opentrons.protocol_api import ProtocolContext +from opentrons.protocol_api import ProtocolContext, OFF_DECK metadata = {"protocolName": "liquid-sense-ot3-p50-multi"} requirements = {"robotType": "Flex", "apiLevel": "2.15"} @@ -30,4 +30,3 @@ def run(ctx: ProtocolContext) -> None: pipette.dispense(10, dial["A1"].top()) pipette.drop_tip(trash) ctx.move_labware(rack, OFF_DECK) - diff --git a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py index 8a55ab6833c..455565001cf 100644 --- a/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py +++ b/hardware-testing/hardware_testing/protocols/liquid_sense_lpc/liquid_sense_ot3_p50_multi_12well.py @@ -27,4 +27,4 @@ def run(ctx: ProtocolContext) -> None: pipette.dispense(10, vial["A1"].top()) pipette.aspirate(1, dial["A1"].top()) pipette.dispense(1, dial["A1"].top()) - pipette.drop_tip(home_after=False) + pipette.drop_tip(trash)