From 3c5d1604c4b271f8ddb355fc067c540b700efb06 Mon Sep 17 00:00:00 2001 From: Ryan Howard Date: Thu, 4 Apr 2024 12:28:21 -0400 Subject: [PATCH] feat(hardware-testing): collected work for upgrading scripts to PE (#14245) # Overview This upgrades our pipette QC scripts to using protocol engine interface, this simplifies a lot of the code and lets us use new features: push out labware adapters using the normal ot3 deck definitions partial tip configuration With the reduction in the amount of changes to the base repo required, we now don't need to use patches before running the tests, this means we only need the hardware-testing directory to be pushed to the bot with no changes to the base software. # Test Plan # Changelog # Review requests # Risk assessment --- .../backends/ot3controller.py | 5 + .../hardware_control/backends/ot3simulator.py | 16 +- api/src/opentrons/hardware_control/ot3api.py | 5 + .../protocol_api/core/engine/instrument.py | 5 + .../opentrons/protocol_api/core/instrument.py | 3 + .../core/legacy/legacy_instrument_core.py | 4 + .../legacy_instrument_core.py | 4 + .../protocol_api/instrument_context.py | 6 + api/src/opentrons/simulate.py | 18 +- hardware-testing/Makefile | 20 +- .../hardware_testing/drivers/asair_sensor.py | 2 +- .../hardware_testing/gravimetric/__main__.py | 89 +- .../hardware_testing/gravimetric/config.py | 5 +- .../gravimetric/daily_setup.py | 5 +- .../hardware_testing/gravimetric/execute.py | 57 +- .../gravimetric/execute_photometric.py | 14 +- .../hardware_testing/gravimetric/helpers.py | 175 ++- .../gravimetric/liquid_class/defaults.py | 38 +- .../gravimetric/liquid_class/pipetting.py | 56 +- .../gravimetric/overrides/api.patch | 111 -- .../gravimetric/overrides/shared-data.patch | 1052 +++-------------- .../hardware_testing/gravimetric/tips.py | 24 +- .../gravimetric/workarounds.py | 17 +- .../1.json | 1017 ---------------- .../1.json | 1017 ---------------- .../opentrons_flex_96_tiprack_50ul_adp/1.json | 1017 ---------------- .../opentrons_api/helpers_ot3.py | 2 +- .../gravimetric/gravimetric_ot3_p1000_96.py | 37 +- .../photometric/photometric_ot3_p1000_96.py | 38 +- .../hardware_testing/liquid/test_heights.py | 2 +- 30 files changed, 549 insertions(+), 4312 deletions(-) delete mode 100644 hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_1000ul_adp/1.json delete mode 100644 hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_200ul_adp/1.json delete mode 100644 hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_50ul_adp/1.json diff --git a/api/src/opentrons/hardware_control/backends/ot3controller.py b/api/src/opentrons/hardware_control/backends/ot3controller.py index 83439c0896b..0edf7e4dfd3 100644 --- a/api/src/opentrons/hardware_control/backends/ot3controller.py +++ b/api/src/opentrons/hardware_control/backends/ot3controller.py @@ -1647,3 +1647,8 @@ async def get_hepa_uv_state(self) -> Optional[HepaUVState]: if res else None ) + + def _update_tip_state(self, mount: OT3Mount, status: bool) -> None: + """This is something we only use in the simulator. + It is required so that PE simulations using ot3api don't break.""" + pass diff --git a/api/src/opentrons/hardware_control/backends/ot3simulator.py b/api/src/opentrons/hardware_control/backends/ot3simulator.py index 638b0094a85..741018adc52 100644 --- a/api/src/opentrons/hardware_control/backends/ot3simulator.py +++ b/api/src/opentrons/hardware_control/backends/ot3simulator.py @@ -506,13 +506,20 @@ def _attached_pipette_to_mount( ), "id": None, } - if found_model and expected_instr or found_model: + if found_model and init_instr["id"] is not None: # Instrument detected matches instrument expected (note: # "instrument detected" means passed as an argument to the # constructor of this class) # OR Instrument detected and no expected instrument specified - converted_name = pipette_load_name.convert_pipette_model(found_model) + + found_model_version = "" + if found_model.find("flex") > -1: + found_model = found_model.replace("_flex", "") # type: ignore + found_model_version = f"{init_instr['id'][4]}.{init_instr['id'][5]}" + converted_name = pipette_load_name.convert_pipette_model( + found_model, found_model_version + ) return { "config": load_pipette_data.load_definition( converted_name.pipette_type, @@ -843,3 +850,8 @@ async def set_hepa_uv_state(self, light_on: bool, timeout_s: int) -> bool: async def get_hepa_uv_state(self) -> Optional[HepaUVState]: return None + + def _update_tip_state(self, mount: OT3Mount, status: bool) -> None: + """This is something we only use in the simulator. + It is required so that PE simulations using ot3api don't break.""" + self._sim_tip_state[mount] = status diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index ae7be339673..e6ae891359b 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -2133,6 +2133,8 @@ async def pick_up_tip( def add_tip_to_instr() -> None: instrument.add_tip(tip_length=tip_length) instrument.set_current_volume(0) + if isinstance(self._backend, OT3Simulator): + self._backend._update_tip_state(realmount, True) await self._move_to_plunger_bottom(realmount, rate=1.0) if ( @@ -2233,6 +2235,9 @@ def _remove_tips() -> None: await self._home([Axis.by_mount(mount)]) _remove_tips() + # call this in case we're simulating + if isinstance(self._backend, OT3Simulator): + self._backend._update_tip_state(realmount, False) async def clean_up(self) -> None: """Get the API ready to stop cleanly.""" diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index 6bf569bcd67..9c88a4f7ecb 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -777,3 +777,8 @@ def configure_nozzle_layout( self._engine_client.configure_nozzle_layout( pipette_id=self._pipette_id, configuration_params=configuration_model ) + + def retract(self) -> None: + """Retract this instrument to the top of the gantry.""" + z_axis = self._engine_client.state.pipettes.get_z_axis(self._pipette_id) + self._engine_client.home([z_axis]) diff --git a/api/src/opentrons/protocol_api/core/instrument.py b/api/src/opentrons/protocol_api/core/instrument.py index 061e7d13960..fec252a009e 100644 --- a/api/src/opentrons/protocol_api/core/instrument.py +++ b/api/src/opentrons/protocol_api/core/instrument.py @@ -289,6 +289,9 @@ def configure_nozzle_layout( @abstractmethod def is_tip_tracking_available(self) -> bool: """Return whether auto tip tracking is available for the pipette's current nozzle configuration.""" + + def retract(self) -> None: + """Retract this instrument to the top of the gantry.""" ... diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py index 57f129c32b3..3755b093e78 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py @@ -558,3 +558,7 @@ def get_nozzle_map(self) -> NozzleMap: def is_tip_tracking_available(self) -> bool: # Tip tracking is always available in legacy context return True + + def retract(self) -> None: + """Retract this instrument to the top of the gantry.""" + self._protocol_interface.get_hardware.retract(self._mount) # type: ignore [attr-defined] diff --git a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py index 2ee61adf24e..ffcdda5019c 100644 --- a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +++ b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py @@ -476,3 +476,7 @@ def get_nozzle_map(self) -> NozzleMap: def is_tip_tracking_available(self) -> bool: # Tip tracking is always available in legacy context return True + + def retract(self) -> None: + """Retract this instrument to the top of the gantry.""" + self._protocol_interface.get_hardware.retract(self._mount) # type: ignore [attr-defined] diff --git a/api/src/opentrons/protocol_api/instrument_context.py b/api/src/opentrons/protocol_api/instrument_context.py index 26f24899fad..e070b896a6e 100644 --- a/api/src/opentrons/protocol_api/instrument_context.py +++ b/api/src/opentrons/protocol_api/instrument_context.py @@ -1532,6 +1532,12 @@ def move_to( return self + @requires_version(2, 18) + def _retract( + self, + ) -> None: + self._core.retract() + @property @requires_version(2, 0) def mount(self) -> str: diff --git a/api/src/opentrons/simulate.py b/api/src/opentrons/simulate.py index f552a99571f..9626fa86b96 100644 --- a/api/src/opentrons/simulate.py +++ b/api/src/opentrons/simulate.py @@ -223,6 +223,7 @@ def get_protocol_api( # type checking, like Jupyter Notebook. *, robot_type: Optional[_UserSpecifiedRobotType] = None, + use_virtual_hardware: bool = True, ) -> protocol_api.ProtocolContext: """ Build and return a ``protocol_api.ProtocolContext`` @@ -260,6 +261,7 @@ def get_protocol_api( :param robot_type: The type of robot to simulate: either ``"Flex"`` or ``"OT-2"``. If you're running this function on a robot, the default is the type of that robot. Otherwise, the default is ``"OT-2"``, for backwards compatibility. + :param use_virtual_hardware: If true, use the protocol engines virtual hardware, if false use the lower level hardware simulator. :return: The protocol context. """ if isinstance(version, str): @@ -317,6 +319,7 @@ def get_protocol_api( hardware_api=checked_hardware, bundled_data=bundled_data, extra_labware=extra_labware, + use_virtual_hardware=use_virtual_hardware, ) # Intentional difference from execute.get_protocol_api(): @@ -790,6 +793,7 @@ def _create_live_context_pe( deck_type: str, extra_labware: Dict[str, "LabwareDefinitionDict"], bundled_data: Optional[Dict[str, bytes]], + use_virtual_hardware: bool = True, ) -> ProtocolContext: """Return a live ProtocolContext that controls the robot through ProtocolEngine.""" assert api_version >= ENGINE_CORE_API_VERSION @@ -798,7 +802,9 @@ def _create_live_context_pe( pe, loop = _LIVE_PROTOCOL_ENGINE_CONTEXTS.enter_context( create_protocol_engine_in_thread( hardware_api=hardware_api.wrapped(), - config=_get_protocol_engine_config(robot_type), + config=_get_protocol_engine_config( + robot_type, virtual=use_virtual_hardware + ), drop_tips_after_run=False, post_run_hardware_state=PostRunHardwareState.STAY_ENGAGED_IN_PLACE, load_fixed_trash=should_load_fixed_trash_labware_for_python_protocol( @@ -899,7 +905,7 @@ def _run_file_pe( async def run(protocol_source: ProtocolSource) -> _SimulateResult: protocol_engine = await create_protocol_engine( hardware_api=hardware_api.wrapped(), - config=_get_protocol_engine_config(robot_type), + config=_get_protocol_engine_config(robot_type, virtual=True), load_fixed_trash=should_load_fixed_trash(protocol_source.config), ) @@ -934,15 +940,15 @@ async def run(protocol_source: ProtocolSource) -> _SimulateResult: return asyncio.run(run(protocol_source)) -def _get_protocol_engine_config(robot_type: RobotType) -> Config: +def _get_protocol_engine_config(robot_type: RobotType, virtual: bool) -> Config: """Return a Protocol Engine config to execute protocols on this device.""" return Config( robot_type=robot_type, deck_type=DeckType(deck_type_for_simulation(robot_type)), ignore_pause=True, - use_virtual_pipettes=True, - use_virtual_modules=True, - use_virtual_gripper=True, + use_virtual_pipettes=virtual, + use_virtual_modules=virtual, + use_virtual_gripper=virtual, use_simulated_deck_config=True, ) diff --git a/hardware-testing/Makefile b/hardware-testing/Makefile index 5e6d7264113..6c12dc305a0 100755 --- a/hardware-testing/Makefile +++ b/hardware-testing/Makefile @@ -79,36 +79,26 @@ sdist: .PHONY: test test: - -$(MAKE) apply-patches-gravimetric $(pytest) $(tests) $(test_opts) - -$(MAKE) remove-patches-gravimetric .PHONY: test-cov test-cov: - -$(MAKE) apply-patches-gravimetric $(pytest) $(tests) $(test_opts) $(cov_opts) - -$(MAKE) remove-patches-gravimetric .PHONY: test-photometric-single test-photometric-single: - -$(MAKE) apply-patches-gravimetric $(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 50 --channels 1 --tip 50 $(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 50 --channels 1 --tip 50 --photoplate-col-offset 3 $(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 50 --channels 1 --tip 50 --dye-well-col-offset 3 - -$(MAKE) remove-patches-gravimetric .PHONY: test-photometric-multi test-photometric-multi: - -$(MAKE) apply-patches-gravimetric $(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 50 --channels 8 --tip 50 - -$(MAKE) remove-patches-gravimetric .PHONY: test-photometric test-photometric: - -$(MAKE) apply-patches-gravimetric $(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 1000 --channels 96 --tip 50 --trials 1 $(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 1000 --channels 96 --tip 200 --trials 1 - -$(MAKE) remove-patches-gravimetric .PHONY: test-gravimetric-single test-gravimetric-single: @@ -134,14 +124,12 @@ test-gravimetric-96: .PHONY: test-gravimetric test-gravimetric: - -$(MAKE) apply-patches-gravimetric $(python) -m hardware_testing.gravimetric.daily_setup --simulate $(python) -m hardware_testing.gravimetric.daily_setup --simulate --calibrate $(MAKE) test-gravimetric-single $(MAKE) test-gravimetric-multi $(MAKE) test-gravimetric-96 $(MAKE) test-photometric - -$(MAKE) remove-patches-gravimetric .PHONY: test-production-qc test-production-qc: @@ -172,11 +160,9 @@ test-integration: test-production-qc test-examples test-scripts test-gravimetric .PHONY: lint lint: - -$(MAKE) apply-patches-gravimetric $(python) -m mypy hardware_testing tests $(python) -m black --check hardware_testing tests setup.py $(python) -m flake8 hardware_testing tests setup.py - -$(MAKE) remove-patches-gravimetric .PHONY: format format: @@ -297,9 +283,11 @@ sync-ot3: sync-sw-ot3 sync-fw-ot3 .PHONY: push-ot3-gravimetric push-ot3-gravimetric: + $(MAKE) push-ot3 + ssh $(ssh_helper_ot3) root@$(host) "mkdir -p /data/labware/v2/custom_definitions/custom_beta" + scp $(ssh_helper_ot3) -r hardware_testing/labware/* root@$(host):/data/labware/v2/custom_definitions/custom_beta/ $(MAKE) apply-patches-gravimetric - -$(MAKE) sync-sw-ot3 - scp $(ssh_helper_ot3) -r hardware_testing/labware root@$(host):/data/labware/v2/custom_definitions/custom_beta/ + cd ../ && $(MAKE) -C shared-data push-ot3 $(MAKE) remove-patches-gravimetric .PHONY: apply-patches-gravimetric diff --git a/hardware-testing/hardware_testing/drivers/asair_sensor.py b/hardware-testing/hardware_testing/drivers/asair_sensor.py index 350741ebc79..00b73893e6d 100644 --- a/hardware-testing/hardware_testing/drivers/asair_sensor.py +++ b/hardware-testing/hardware_testing/drivers/asair_sensor.py @@ -92,7 +92,7 @@ def BuildAsairSensor(simulate: bool, autosearch: bool = True) -> AsairSensorBase ui.print_info(f"Trying to connect to env sensor on port {port}") sensor = AsairSensor.connect(port) ser_id = sensor.get_serial() - if len(ser_id) != 0: + if ser_id == " ": ui.print_info(f"Found env sensor {ser_id} on port {port}") return sensor except: # noqa: E722 diff --git a/hardware-testing/hardware_testing/gravimetric/__main__.py b/hardware-testing/hardware_testing/gravimetric/__main__.py index 54a8278adef..0855345598b 100644 --- a/hardware-testing/hardware_testing/gravimetric/__main__.py +++ b/hardware-testing/hardware_testing/gravimetric/__main__.py @@ -2,10 +2,8 @@ from json import load as json_load from pathlib import Path import argparse -from time import time from typing import List, Union, Dict, Optional, Any, Tuple from dataclasses import dataclass -from opentrons.hardware_control.types import OT3Mount from opentrons.protocol_api import ProtocolContext from . import report import subprocess @@ -42,16 +40,15 @@ from .measurement.record import GravimetricRecorder from .measurement import DELAY_FOR_MEASUREMENT from .measurement.scale import Scale -from .measurement.environment import read_environment_data from .trial import TestResources, _change_pipettes from .tips import get_tips from hardware_testing.drivers import asair_sensor from opentrons.protocol_api import InstrumentContext +from opentrons.protocol_engine.types import LabwareOffset -# FIXME: bump to v2.15 to utilize protocol engine -API_LEVEL = "2.13" +API_LEVEL = "2.18" -LABWARE_OFFSETS: List[dict] = [] +LABWARE_OFFSETS: List[LabwareOffset] = [] # Keyed by pipette volume, channel count, and tip volume in that order GRAVIMETRIC_CFG = { @@ -90,6 +87,19 @@ }, } +PIPETTE_MODEL_NAME = { + 50: { + 1: "p50_single_flex", + 8: "p50_multi_flex", + }, + 1000: { + 1: "p1000_single_flex", + 8: "p1000_multi_flex", + 96: "p1000_96_flex", + }, +} + + PHOTOMETRIC_CFG = { 50: { 1: { @@ -148,22 +158,18 @@ def _get_protocol_context(cls, args: argparse.Namespace) -> ProtocolContext: ui.print_info( "Starting opentrons-robot-server, so we can http GET labware offsets" ) - offsets = workarounds.http_get_all_labware_offsets() - ui.print_info(f"found {len(offsets)} offsets:") - for offset in offsets: - ui.print_info(f"\t{offset['createdAt']}:") - ui.print_info(f"\t\t{offset['definitionUri']}") - ui.print_info(f"\t\t{offset['vector']}") - LABWARE_OFFSETS.append(offset) + LABWARE_OFFSETS.extend(workarounds.http_get_all_labware_offsets()) + ui.print_info(f"found {len(LABWARE_OFFSETS)} offsets:") + for offset in LABWARE_OFFSETS: + ui.print_info(f"\t{offset.createdAt}:") + ui.print_info(f"\t\t{offset.definitionUri}") + ui.print_info(f"\t\t{offset.vector}") # gather the custom labware (for simulation) custom_defs = {} if args.simulate: labware_dir = Path(__file__).parent.parent / "labware" custom_def_uris = [ "radwag_pipette_calibration_vial", - "opentrons_flex_96_tiprack_50ul_adp", - "opentrons_flex_96_tiprack_200ul_adp", - "opentrons_flex_96_tiprack_1000ul_adp", ] for def_uri in custom_def_uris: with open(labware_dir / def_uri / "1.json", "r") as f: @@ -172,9 +178,12 @@ def _get_protocol_context(cls, args: argparse.Namespace) -> ProtocolContext: _ctx = helpers.get_api_context( API_LEVEL, # type: ignore[attr-defined] is_simulating=args.simulate, - deck_version="2", + pipette_left=PIPETTE_MODEL_NAME[args.pipette][args.channels], extra_labware=custom_defs, ) + for offset in LABWARE_OFFSETS: + engine = _ctx._core._engine_client._transport._engine # type: ignore[attr-defined] + engine.state_view._labware_store._add_labware_offset(offset) return _ctx @classmethod @@ -301,7 +310,7 @@ def build_run_args(cls, args: argparse.Namespace) -> "RunArgs": # noqa: C901 trials=trials, name=name, robot_serial=robot_serial, - fw_version=_ctx._core.get_hardware().fw_version, + fw_version=workarounds.get_sync_hw_api(_ctx).fw_version, ) else: if args.increment: @@ -334,7 +343,7 @@ def build_run_args(cls, args: argparse.Namespace) -> "RunArgs": # noqa: C901 name=name, environment_sensor=environment_sensor, trials=trials, - fw_version=_ctx._core.get_hardware().fw_version, + fw_version=workarounds.get_sync_hw_api(_ctx).fw_version, ) return RunArgs( @@ -387,7 +396,6 @@ def build_gravimetric_cfg( pipette_channels=run_args.pipette_channels, tip_volume=tip_volume, trials=run_args.trials, - labware_offsets=LABWARE_OFFSETS, labware_on_scale=run_args.protocol_cfg.LABWARE_ON_SCALE, # type: ignore[attr-defined] slot_scale=run_args.protocol_cfg.SLOT_SCALE, # type: ignore[attr-defined] slots_tiprack=run_args.protocol_cfg.SLOTS_TIPRACK[tip_volume], # type: ignore[attr-defined] @@ -436,7 +444,6 @@ def build_photometric_cfg( increment=False, tip_volume=tip_volume, trials=run_args.trials, - labware_offsets=LABWARE_OFFSETS, photoplate=run_args.protocol_cfg.PHOTOPLATE_LABWARE, # type: ignore[attr-defined] photoplate_slot=run_args.protocol_cfg.SLOT_PLATE, # type: ignore[attr-defined] reservoir=run_args.protocol_cfg.RESERVOIR_LABWARE, # type: ignore[attr-defined] @@ -569,7 +576,6 @@ def _main( parser.add_argument( "--mode", type=str, choices=["", "default", "lowVolumeDefault"], default="" ) - parser.add_argument("--pre-heat", action="store_true") args = parser.parse_args() run_args = RunArgs.build_run_args(args) if not run_args.ctx.is_simulating(): @@ -580,48 +586,13 @@ def _main( shell=True, ) sleep(1) - hw = run_args.ctx._core.get_hardware() + hw = workarounds.get_sync_hw_api(run_args.ctx) try: if not run_args.ctx.is_simulating() and not args.photometric: ui.get_user_ready("CLOSE the door, and MOVE AWAY from machine") ui.print_info("homing...") run_args.ctx.home() - if args.pre_heat: - ui.print_header("PRE-HEAT") - mnt = OT3Mount.LEFT - hw.add_tip(mnt, 1) - hw.prepare_for_aspirate(mnt) - env_data = read_environment_data( - mnt.name.lower(), hw.is_simulator, run_args.environment_sensor - ) - start_temp = env_data.celsius_pipette - temp_limit = min(start_temp + 3.0, 28.0) - max_pre_heat_seconds = 60 * 10 - now = time() - start_time = now - while ( - now - start_time < max_pre_heat_seconds - and env_data.celsius_pipette < temp_limit - ): - ui.print_info( - f"pre-heat {int(now - start_time)} seconds " - f"({max_pre_heat_seconds} limit): " - f"{round(env_data.celsius_pipette, 2)} C " - f"({round(temp_limit, 2)} C limit)" - ) - # NOTE: moving slowly helps make sure full current is sent to coils - hw.aspirate(mnt, rate=0.1) - hw.dispense(mnt, rate=0.1, push_out=0) - env_data = read_environment_data( - mnt.name.lower(), hw.is_simulator, run_args.environment_sensor - ) - if run_args.ctx.is_simulating(): - now += 1 - else: - now = time() - hw.remove_tip(mnt) - for tip, volumes in run_args.volumes: if args.channels == 96 and not run_args.ctx.is_simulating(): ui.alert_user_ready(f"prepare the {tip}ul tipracks", hw) @@ -634,5 +605,5 @@ def _main( _change_pipettes(run_args.ctx, run_args.pipette) if not run_args.ctx.is_simulating(): serial_logger.terminate() - del hw._backend.eeprom_driver._gpio + del hw._backend.eeprom_driver._gpio # still need this? print("done\n\n") diff --git a/hardware-testing/hardware_testing/gravimetric/config.py b/hardware-testing/hardware_testing/gravimetric/config.py index 3af376a04cf..993e8716a92 100644 --- a/hardware-testing/hardware_testing/gravimetric/config.py +++ b/hardware-testing/hardware_testing/gravimetric/config.py @@ -24,7 +24,6 @@ class VolumetricConfig: pipette_mount: str tip_volume: int trials: int - labware_offsets: List[dict] slots_tiprack: List[int] increment: bool return_tip: bool @@ -194,11 +193,11 @@ def _get_liquid_probe_settings( plunger_speed=lqid_cfg["plunger_speed"], sensor_threshold_pascals=lqid_cfg["sensor_threshold_pascals"], expected_liquid_height=110, - output_option=OutputOptions.stream_to_csv, + output_option=OutputOptions.sync_only, aspirate_while_sensing=False, auto_zero_sensor=True, num_baseline_reads=10, - data_file="/var/pressure_sensor_data.csv", + data_file="/data/testing_data/pressure.csv", ) diff --git a/hardware-testing/hardware_testing/gravimetric/daily_setup.py b/hardware-testing/hardware_testing/gravimetric/daily_setup.py index bc13dc9d0bf..77569b43c11 100644 --- a/hardware-testing/hardware_testing/gravimetric/daily_setup.py +++ b/hardware-testing/hardware_testing/gravimetric/daily_setup.py @@ -13,8 +13,9 @@ ) from hardware_testing.gravimetric.config import GANTRY_MAX_SPEED from hardware_testing.gravimetric.measurement.scale import Scale # type: ignore[import] -from hardware_testing.gravimetric import helpers, workarounds +from hardware_testing.gravimetric import helpers from hardware_testing.gravimetric.__main__ import API_LEVEL +from hardware_testing.gravimetric.workarounds import get_sync_hw_api TEST_NAME = "gravimetric-daily-setup" @@ -253,7 +254,7 @@ def _calibrate() -> None: API_LEVEL, # type: ignore[attr-defined] is_simulating=args.simulate, ) - _hw = workarounds.get_sync_hw_api(_ctx) + _hw = get_sync_hw_api(_ctx) _hw.set_status_bar_state(COLOR_STATES["idle"]) _rec = GravimetricRecorder( GravimetricRecorderConfig( diff --git a/hardware-testing/hardware_testing/gravimetric/execute.py b/hardware-testing/hardware_testing/gravimetric/execute.py index cf2b8fb1ecc..76b8ff037e2 100644 --- a/hardware-testing/hardware_testing/gravimetric/execute.py +++ b/hardware-testing/hardware_testing/gravimetric/execute.py @@ -18,7 +18,6 @@ _calculate_average, _jog_to_find_liquid_height, _sense_liquid_height, - _apply_labware_offsets, _pick_up_tip, _drop_tip, ) @@ -53,6 +52,7 @@ import glob from opentrons.hardware_control.types import StatusBarState +from hardware_testing.gravimetric.workarounds import get_sync_hw_api _MEASUREMENTS: List[Tuple[str, MeasurementData]] = list() @@ -89,7 +89,7 @@ def _generate_callbacks_for_trial( if blank_measurement: volume = None - hw_api = ctx._core.get_hardware() + hw_api = get_sync_hw_api(ctx) hw_mount = OT3Mount.LEFT if pipette.mount == "left" else OT3Mount.RIGHT pip_ax = Axis.of_main_tool_actuator(hw_mount) estimate_bottom: float = -1 @@ -179,7 +179,6 @@ def _load_labware(ctx: ProtocolContext, cfg: config.GravimetricConfig) -> Labwar labware_on_scale = ctx.load_labware( cfg.labware_on_scale, location=cfg.slot_scale, namespace=namespace ) - _apply_labware_offsets(cfg, [labware_on_scale]) return labware_on_scale @@ -283,9 +282,13 @@ def _record_measurement_and_store(m_type: MeasurementType) -> MeasurementData: m_tag = _tag(m_type) if trial.recorder.is_simulator and not trial.blank: if m_type == MeasurementType.ASPIRATE: - trial.recorder.add_simulation_mass(trial.volume * -0.001) + trial.recorder.add_simulation_mass( + trial.channel_count * trial.volume * -0.001 + ) elif m_type == MeasurementType.DISPENSE: - trial.recorder.add_simulation_mass(trial.volume * 0.001) + trial.recorder.add_simulation_mass( + trial.channel_count * trial.volume * 0.001 + ) m_data = record_measurement_data( trial.ctx, m_tag, @@ -327,8 +330,7 @@ def _record_measurement_and_store(m_type: MeasurementType) -> MeasurementData: else: # center channel over well trial.pipette.move_to(trial.well.top(50).move(trial.channel_offset)) - mnt = OT3Mount.RIGHT if trial.pipette.mount == "right" else OT3Mount.LEFT - trial.ctx._core.get_hardware().retract(mnt) # retract to top of gantry + trial.pipette._retract() # retract to top of gantry m_data_init = _record_measurement_and_store(MeasurementType.INIT) ui.print_info(f"\tinitial grams: {m_data_init.grams_average} g") # update the vials volumes, using the last-known weight @@ -357,7 +359,7 @@ def _record_measurement_and_store(m_type: MeasurementType) -> MeasurementData: mode=trial.mode, clear_accuracy_function=trial.cfg.increment, ) - trial.ctx._core.get_hardware().retract(mnt) # retract to top of gantry + trial.pipette._retract() # retract to top of gantry _take_photos(trial, "aspirate") m_data_aspirate = _record_measurement_and_store(MeasurementType.ASPIRATE) @@ -379,7 +381,7 @@ def _record_measurement_and_store(m_type: MeasurementType) -> MeasurementData: mode=trial.mode, clear_accuracy_function=trial.cfg.increment, ) - trial.ctx._core.get_hardware().retract(mnt) # retract to top of gantry + trial.pipette._retract() # retract to top of gantry _take_photos(trial, "dispense") m_data_dispense = _record_measurement_and_store(MeasurementType.DISPENSE) ui.print_info(f"\tgrams after dispense: {m_data_dispense.grams_average} g") @@ -500,8 +502,7 @@ def _calculate_evaporation( resources.env_sensor, ) ui.print_info(f"running {config.NUM_BLANK_TRIALS}x blank measurements") - mnt = OT3Mount.RIGHT if resources.pipette.mount == "right" else OT3Mount.LEFT - resources.ctx._core.get_hardware().retract(mnt) + resources.pipette._retract() for i in range(config.SCALE_SECONDS_TO_TRUE_STABILIZE): ui.print_info( f"wait for scale to stabilize " @@ -545,7 +546,7 @@ def _get_liquid_height( if not resources.ctx.is_simulating() and not cfg.same_tip: ui.alert_user_ready( f"Please replace the {cfg.tip_volume}ul tips in slot 2", - resources.ctx._core.get_hardware(), + get_sync_hw_api(resources.ctx), ) _tip_counter[0] = 0 if cfg.jog: @@ -595,7 +596,7 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq recorder._recording = GravimetricRecording() report.store_config_gm(resources.test_report, cfg) calibration_tip_in_use = True - hw_api = resources.ctx._core.get_hardware() + hw_api = get_sync_hw_api(resources.ctx) if resources.ctx.is_simulating(): _PREV_TRIAL_GRAMS = None _MEASUREMENTS = list() @@ -605,8 +606,6 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq setup_channel_offset = _get_channel_offset(cfg, channel=0) first_tip_location = first_tip.top().move(setup_channel_offset) _pick_up_tip(resources.ctx, resources.pipette, cfg, location=first_tip_location) - mnt = OT3Mount.LEFT if cfg.pipette_mount == "left" else OT3Mount.RIGHT - resources.ctx._core.get_hardware().retract(mnt) ui.print_info("moving to scale") well = labware_on_scale["A1"] _liquid_height = _get_liquid_height(resources, cfg, well) @@ -642,6 +641,7 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq resources.pipette, return_tip=False, minimum_z_height=_minimum_z_height(cfg), + offset=_get_channel_offset(cfg, 0), ) # always trash calibration tips calibration_tip_in_use = False trial_count = 0 @@ -662,7 +662,7 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq actual_asp_list_all = [] actual_disp_list_all = [] ui.print_title(f"{volume} uL") - + resources.pipette.configure_for_volume(volume) trial_asp_dict: Dict[int, List[float]] = { trial: [] for trial in range(cfg.trials) } @@ -694,12 +694,7 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq cfg, location=next_tip_location, ) - mnt = ( - OT3Mount.LEFT - if cfg.pipette_mount == "left" - else OT3Mount.RIGHT - ) - resources.ctx._core.get_hardware().retract(mnt) + resources.pipette._retract() # retract to top of gantry ( actual_aspirate, aspirate_data, @@ -742,14 +737,12 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq ) ui.print_info("dropping tip") if not cfg.same_tip: - mnt = ( - OT3Mount.LEFT - if cfg.pipette_mount == "left" - else OT3Mount.RIGHT - ) - resources.ctx._core.get_hardware().retract(mnt) + resources.pipette._retract() # retract to top of gantry _drop_tip( - resources.pipette, cfg.return_tip, _minimum_z_height(cfg) + resources.pipette, + cfg.return_tip, + _minimum_z_height(cfg), + _get_channel_offset(cfg, run_trial.channel), ) ui.print_header(f"{volume} uL channel {channel + 1} CALCULATIONS") @@ -809,7 +802,7 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq acceptable_d = trials[volume][channel][0].acceptable_d print(f"acceptable cv {acceptable_cv} acceptable_d {acceptable_d}") print(f"dispense cv {dispense_cv} aspirate_cv {aspirate_cv}") - print(f"dispense d {dispense_cv} aspirate_d {aspirate_d}") + print(f"dispense d {dispense_d} aspirate_d {aspirate_d}") if ( not cfg.ignore_fail and acceptable_cv is not None @@ -820,8 +813,8 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq if ( dispense_cv > acceptable_cv or aspirate_cv > acceptable_cv - or aspirate_d > acceptable_d - or dispense_d > acceptable_d + or abs(aspirate_d) > acceptable_d + or abs(dispense_d) > acceptable_d ): raise RuntimeError( f"Trial with volume {volume} on channel {channel} did not pass spec" diff --git a/hardware-testing/hardware_testing/gravimetric/execute_photometric.py b/hardware-testing/hardware_testing/gravimetric/execute_photometric.py index 5b36acc46f3..217109dd89d 100644 --- a/hardware-testing/hardware_testing/gravimetric/execute_photometric.py +++ b/hardware-testing/hardware_testing/gravimetric/execute_photometric.py @@ -5,7 +5,7 @@ from opentrons.protocol_api import ProtocolContext, Well, Labware from hardware_testing.data import ui -from hardware_testing.opentrons_api.types import Point, OT3Mount +from hardware_testing.opentrons_api.types import Point from .measurement import ( MeasurementType, create_measurement_tag, @@ -18,7 +18,6 @@ from .helpers import ( _jog_to_find_liquid_height, _sense_liquid_height, - _apply_labware_offsets, _pick_up_tip, _drop_tip, get_list_of_wells_affected, @@ -110,7 +109,6 @@ def _load_labware( photoplate = loaded_labwares[cfg.photoplate_slot] else: photoplate = ctx.load_labware(cfg.photoplate, location=cfg.photoplate_slot) - _apply_labware_offsets(cfg, [photoplate]) if ( cfg.reservoir_slot in loaded_labwares.keys() @@ -119,7 +117,6 @@ def _load_labware( reservoir = loaded_labwares[cfg.reservoir_slot] else: reservoir = ctx.load_labware(cfg.reservoir, location=cfg.reservoir_slot) - _apply_labware_offsets(cfg, [reservoir]) return photoplate, reservoir @@ -218,11 +215,10 @@ def _record_measurement_and_store(m_type: MeasurementType) -> EnvironmentData: touch_tip=trial.cfg.touch_tip, ) _record_measurement_and_store(MeasurementType.DISPENSE) - trial.ctx._core.get_hardware().retract(OT3Mount.LEFT) + trial.pipette._retract() # retract to top of gantry if (i + 1) == num_dispenses: if not trial.cfg.same_tip: _drop_tip(trial.pipette, trial.cfg.return_tip) - trial.ctx._core.get_hardware().retract(OT3Mount.LEFT) if not trial.ctx.is_simulating() and trial.channel_count == 96: ui.get_user_ready("add SEAL to plate and remove from DECK") return @@ -350,13 +346,13 @@ def _find_liquid_height( setup_tip = _next_tip(resources, cfg, cfg.pipette_channels == 1) volume_for_setup = max(resources.test_volumes) _pick_up_tip(resources.ctx, resources.pipette, cfg, location=setup_tip.top()) - mnt = OT3Mount.LEFT if cfg.pipette_mount == "left" else OT3Mount.RIGHT - resources.ctx._core.get_hardware().retract(mnt) if ( not resources.ctx.is_simulating() and not cfg.same_tip and cfg.pipette_channels == 96 ): + + resources.pipette._retract() ui.get_user_ready("REPLACE first tip with NEW TIP") required_ul_per_src = (volume_for_setup * channel_count * cfg.trials) / len( cfg.dye_well_column_offset @@ -411,10 +407,8 @@ def _find_liquid_height( raise RuntimeError( f"bad volume in reservoir: {round(reservoir_ul / 1000, 1)} ml" ) - resources.ctx._core.get_hardware().retract(OT3Mount.LEFT) if not cfg.same_tip: resources.pipette.drop_tip(home_after=False) # always trash setup tips - resources.ctx._core.get_hardware().retract(OT3Mount.LEFT) # NOTE: the first tip-rack should have already been replaced # with new tips by the operator diff --git a/hardware-testing/hardware_testing/gravimetric/helpers.py b/hardware-testing/hardware_testing/gravimetric/helpers.py index 179701e0d83..7844f8d8d5e 100644 --- a/hardware-testing/hardware_testing/gravimetric/helpers.py +++ b/hardware-testing/hardware_testing/gravimetric/helpers.py @@ -2,7 +2,7 @@ import asyncio from random import random, randint from types import MethodType -from typing import Any, List, Dict, Optional, Tuple +from typing import Any, List, Dict, Optional, Tuple, Union from statistics import stdev from . import config from .liquid_class.defaults import get_liquid_class @@ -15,21 +15,34 @@ guess_from_global_config as guess_deck_type_from_global_config, ) from opentrons.protocol_api.labware import Well, Labware +from opentrons.protocol_api._types import OffDeckType +from opentrons.protocol_api._nozzle_layout import NozzleLayout from opentrons.protocols.types import APIVersion from opentrons.hardware_control.thread_manager import ThreadManager from opentrons.hardware_control.types import OT3Mount, Axis from opentrons.hardware_control.ot3api import OT3API from opentrons.hardware_control.instruments.ot3.pipette import Pipette +from opentrons import execute, simulate from opentrons.types import Point, Location from opentrons_shared_data.labware.dev_types import LabwareDefinition from hardware_testing.opentrons_api import helpers_ot3 from opentrons.protocol_api import ProtocolContext, InstrumentContext -from .workarounds import get_sync_hw_api, get_latest_offset_for_labware +from .workarounds import get_sync_hw_api from hardware_testing.opentrons_api.helpers_ot3 import clear_pipette_ul_per_mm +import opentrons.protocol_engine.execution.pipetting as PE_pipetting +from opentrons.protocol_engine.notes import CommandNoteAdder + +from opentrons.protocol_engine import ( + StateView, + WellLocation, + DropTipWellLocation, +) +from opentrons.protocol_api.core.engine import deck_conflict as DeckConflit + def _add_fake_simulate( ctx: protocol_api.ProtocolContext, is_simulating: bool @@ -79,13 +92,21 @@ async def _thread_manager_build_hw_api( stall_detection_enable=stall_detection_enable, ) - return protocol_api.create_protocol_context( - api_version=APIVersion.from_string(api_level), - hardware_api=ThreadManager(_thread_manager_build_hw_api), # type: ignore[arg-type] - deck_type="ot3_standard", - extra_labware=extra_labware, - deck_version=2, - ) + papi: protocol_api.ProtocolContext + if is_simulating: + papi = simulate.get_protocol_api( + version=APIVersion.from_string(api_level), + extra_labware=extra_labware, + hardware_simulator=ThreadManager(_thread_manager_build_hw_api), + robot_type="Flex", + use_virtual_hardware=False, + ) + else: + papi = execute.get_protocol_api( + version=APIVersion.from_string(api_level), extra_labware=extra_labware + ) + + return papi def well_is_reservoir(well: protocol_api.labware.Well) -> bool: @@ -203,6 +224,50 @@ def _check_if_software_supports_high_volumes() -> bool: return modified_a and modified_b +def _override_set_current_volume(self, new_volume: float) -> None: # noqa: ANN001 + assert new_volume >= 0 + # assert new_volume <= self.working_volume + self._current_volume = new_volume + + +def _override_add_current_volume(self, volume_incr: float) -> None: # noqa: ANN001 + self._current_volume += volume_incr + + +def _override_ok_to_add_volume(self, volume_incr: float) -> bool: # noqa: ANN001 + return True + + +def _override_validate_asp_vol( + state_view: StateView, + pipette_id: str, + aspirate_volume: float, + command_note_adder: CommandNoteAdder, +) -> float: + return aspirate_volume + + +def _override_check_safe_for_pipette_movement( + engine_state: StateView, + pipette_id: str, + labware_id: str, + well_name: str, + well_location: Union[WellLocation, DropTipWellLocation], +) -> None: + pass + + +def _override_software_supports_high_volumes() -> None: + # yea so ok this is pretty ugly but this is super helpful for us + # with this we don't need to apply patches, and can run the testing scripts + # without pushing modified code to the robot + + Pipette.set_current_volume = _override_set_current_volume # type: ignore[assignment] + Pipette.ok_to_add_volume = _override_ok_to_add_volume # type: ignore[assignment] + Pipette.add_current_volume = _override_add_current_volume # type: ignore[assignment] + PE_pipetting._validate_aspirate_volume = _override_validate_asp_vol # type: ignore[assignment] + + def _get_channel_offset(cfg: config.VolumetricConfig, channel: int) -> Point: assert ( channel < cfg.pipette_channels @@ -252,23 +317,6 @@ def _get_tip_batch(is_simulating: bool, tip: int) -> str: return "simulation-tip-batch" -def _apply(labware: Labware, cfg: config.VolumetricConfig) -> None: - o = get_latest_offset_for_labware(cfg.labware_offsets, labware) - ui.print_info( - f'Apply labware offset to "{labware.name}" (slot={labware.parent}): ' - f"x={round(o.x, 2)}, y={round(o.y, 2)}, z={round(o.z, 2)}" - ) - labware.set_calibration(o) - - -def _apply_labware_offsets( - cfg: config.VolumetricConfig, - labwares: List[Labware], -) -> None: - for lw in labwares: - _apply(lw, cfg) - - def _pick_up_tip( ctx: ProtocolContext, pipette: InstrumentContext, @@ -280,8 +328,6 @@ def _pick_up_tip( f"from slot #{location.labware.parent.parent}" ) pipette.pick_up_tip(location) - if pipette.channels == 96: - get_sync_hw_api(ctx).retract(OT3Mount.LEFT) # NOTE: the accuracy-adjust function gets set on the Pipette # each time we pick-up a new tip. if cfg.increment: @@ -293,12 +339,27 @@ def _pick_up_tip( def _drop_tip( - pipette: InstrumentContext, return_tip: bool, minimum_z_height: int = 0 + pipette: InstrumentContext, + return_tip: bool, + minimum_z_height: int = 0, + offset: Optional[Point] = None, ) -> None: if return_tip: pipette.return_tip(home_after=False) else: - pipette.drop_tip(home_after=False) + if offset is not None: + # we don't actually need the offset, if this is an 8 channel we always center channel + # a1 over the back of the trash + trash_well = pipette.trash_container.well(0) # type: ignore[union-attr] + trash_container = trash_well.center().move( + Point(0, trash_well.width / 2, 0) # type: ignore[union-attr, operator] + ) + pipette.drop_tip( + trash_container, + home_after=False, + ) + else: + pipette.drop_tip(home_after=False) if minimum_z_height > 0: cur_location = pipette._get_last_location_by_api_version() if cur_location is not None: @@ -337,11 +398,8 @@ def _get_volumes( kind, channels, pipette_volume, tip_volume, extra ) if not _check_if_software_supports_high_volumes(): - if ctx.is_simulating(): - test_volumes = _reduce_volumes_to_not_exceed_software_limit( - test_volumes, pipette_volume, channels, tip_volume - ) - else: + _override_software_supports_high_volumes() + if not _check_if_software_supports_high_volumes(): raise RuntimeError("you are not the correct branch") return test_volumes @@ -363,7 +421,9 @@ def _load_pipette( if pipette_mount in loaded_pipettes.keys(): return loaded_pipettes[pipette_mount] + trash = ctx.load_labware("opentrons_1_trash_3200ml_fixed", "A3") pipette = ctx.load_instrument(pip_name, pipette_mount) + loaded_pipettes = ctx.loaded_instruments assert pipette.max_volume == pipette_volume, ( f"expected {pipette_volume} uL pipette, " f"but got a {pipette.max_volume} uL pipette" @@ -374,12 +434,12 @@ def _load_pipette( # NOTE: 8ch QC testing means testing 1 channel at a time, # so we need to decrease the pick-up current to work with 1 tip. if pipette.channels == 8 and not increment and not photometric: - hwapi = get_sync_hw_api(ctx) - mnt = OT3Mount.LEFT if pipette_mount == "left" else OT3Mount.RIGHT - hwpipette: Pipette = hwapi.hardware_pipettes[mnt.to_mount()] - hwpipette._config.pick_up_tip_configurations.press_fit.current_by_tip_count[ - 8 - ] = 0.2 + pipette.configure_nozzle_layout(NozzleLayout.SINGLE, "A1") + # override deck conflict checking cause we specially lay out our tipracks + DeckConflit.check_safe_for_pipette_movement = ( + _override_check_safe_for_pipette_movement + ) + pipette.trash_container = trash return pipette @@ -402,23 +462,22 @@ def _load_tipracks( cfg: config.VolumetricConfig, use_adapters: bool = False, ) -> List[Labware]: - adp_str = "_adp" if use_adapters else "" tiprack_load_settings: List[Tuple[int, str]] = [ ( slot, - f"opentrons_flex_96_tiprack_{cfg.tip_volume}ul{adp_str}", + f"opentrons_flex_96_tiprack_{cfg.tip_volume}ul", ) for slot in cfg.slots_tiprack ] for ls in tiprack_load_settings: ui.print_info(f'Loading tiprack "{ls[1]}" in slot #{ls[0]}') - if use_adapters: - tiprack_namespace = "custom_beta" - else: - tiprack_namespace = "opentrons" + adapter: Optional[str] = ( + "opentrons_flex_96_tiprack_adapter" if use_adapters else None + ) # If running multiple tests in one run, the labware may already be loaded loaded_labwares = ctx.loaded_labwares + print(f"Loaded labwares {loaded_labwares}") pre_loaded_tips: List[Labware] = [] for ls in tiprack_load_settings: if ls[0] in loaded_labwares.keys(): @@ -430,15 +489,25 @@ def _load_tipracks( ui.print_info( f"Removing {loaded_labwares[ls[0]].name} from slot {ls[0]}" ) - del ctx._core.get_deck()[ls[0]] # type: ignore[attr-defined] + ctx._core.move_labware( + loaded_labwares[ls[0]]._core, + new_location=OffDeckType.OFF_DECK, + use_gripper=False, + pause_for_manual_move=False, + pick_up_offset=None, + drop_offset=None, + ) if len(pre_loaded_tips) == len(tiprack_load_settings): return pre_loaded_tips - tipracks = [ - ctx.load_labware(ls[1], location=ls[0], namespace=tiprack_namespace) - for ls in tiprack_load_settings - ] - _apply_labware_offsets(cfg, tipracks) + tipracks: List[Labware] = [] + for ls in tiprack_load_settings: + if ctx.deck[ls[0]] is not None: + tipracks.append( + ctx.deck[ls[0]].load_labware(ls[1]) # type: ignore[union-attr] + ) + else: + tipracks.append(ctx.load_labware(ls[1], location=ls[0], adapter=adapter)) return tipracks diff --git a/hardware-testing/hardware_testing/gravimetric/liquid_class/defaults.py b/hardware-testing/hardware_testing/gravimetric/liquid_class/defaults.py index 1146d6bb432..a37f21b1b36 100644 --- a/hardware-testing/hardware_testing/gravimetric/liquid_class/defaults.py +++ b/hardware-testing/hardware_testing/gravimetric/liquid_class/defaults.py @@ -11,8 +11,6 @@ _default_submerge_aspirate_mm = 1.5 _p50_multi_submerge_aspirate_mm = 1.5 _default_submerge_dispense_mm = 1.5 -_96_default_submerge_aspirate_mm = 2.5 -_96_default_submerge_dispense_mm = 3.0 _default_retract_mm = 5.0 _default_retract_discontinuity = 20 @@ -273,7 +271,7 @@ 1000: { # P1000 50: { # T50 5: DispenseSettings( # 5uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -282,7 +280,7 @@ blow_out_submerged=5, ), 10: DispenseSettings( # 10uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -291,7 +289,7 @@ blow_out_submerged=5, ), 50: DispenseSettings( # 50uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -302,7 +300,7 @@ }, 200: { # T200 5: DispenseSettings( # 5uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -311,7 +309,7 @@ blow_out_submerged=5, ), 50: DispenseSettings( # 50uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -320,7 +318,7 @@ blow_out_submerged=5, ), 200: DispenseSettings( # 200uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -331,7 +329,7 @@ }, 1000: { # T1000 10: DispenseSettings( # 10uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -340,7 +338,7 @@ blow_out_submerged=20, ), 100: DispenseSettings( # 100uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -349,7 +347,7 @@ blow_out_submerged=20, ), 1000: DispenseSettings( # 1000uL - z_submerge_depth=_96_default_submerge_dispense_mm, + z_submerge_depth=_default_submerge_dispense_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_dispense_delay_seconds, @@ -635,7 +633,7 @@ 1000: { # P1000 50: { # T50 5: AspirateSettings( # 5uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=6.5, # ul/sec delay=_default_aspirate_delay_seconds, @@ -645,7 +643,7 @@ trailing_air_gap=0.1, ), 10: AspirateSettings( # 10uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=6.5, # ul/sec delay=_default_aspirate_delay_seconds, @@ -655,7 +653,7 @@ trailing_air_gap=0.1, ), 50: AspirateSettings( # 50uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=6.5, # ul/sec delay=_default_aspirate_delay_seconds, @@ -667,7 +665,7 @@ }, 200: { # T200 5: AspirateSettings( # 5uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_aspirate_delay_seconds, @@ -677,7 +675,7 @@ trailing_air_gap=2, ), 50: AspirateSettings( # 50uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_aspirate_delay_seconds, @@ -687,7 +685,7 @@ trailing_air_gap=3.5, ), 200: AspirateSettings( # 200uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=80, # ul/sec delay=_default_aspirate_delay_seconds, @@ -699,7 +697,7 @@ }, 1000: { # T1000 10: AspirateSettings( # 10uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=160, # ul/sec delay=_default_aspirate_delay_seconds, @@ -709,7 +707,7 @@ trailing_air_gap=10, ), 100: AspirateSettings( # 100uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=160, # ul/sec delay=_default_aspirate_delay_seconds, @@ -719,7 +717,7 @@ trailing_air_gap=10, ), 1000: AspirateSettings( # 1000uL - z_submerge_depth=_96_default_submerge_aspirate_mm, + z_submerge_depth=_default_submerge_aspirate_mm, plunger_acceleration=_default_accel_96ch_ul_sec_sec, plunger_flow_rate=160, # ul/sec delay=_default_aspirate_delay_seconds, diff --git a/hardware-testing/hardware_testing/gravimetric/liquid_class/pipetting.py b/hardware-testing/hardware_testing/gravimetric/liquid_class/pipetting.py index 473877208ea..9f059559f13 100644 --- a/hardware-testing/hardware_testing/gravimetric/liquid_class/pipetting.py +++ b/hardware-testing/hardware_testing/gravimetric/liquid_class/pipetting.py @@ -8,6 +8,7 @@ from hardware_testing.opentrons_api.types import OT3AxisKind from hardware_testing.gravimetric import config +from hardware_testing.gravimetric.workarounds import get_sync_hw_api from hardware_testing.gravimetric.liquid_height.height import LiquidTracker from hardware_testing.opentrons_api.types import OT3Mount, Point from hardware_testing.opentrons_api.helpers_ot3 import clear_pipette_ul_per_mm @@ -177,7 +178,7 @@ def _pipette_with_liquid_settings( # noqa: C901 ) -> None: """Run a pipette given some Pipetting Liquid Settings.""" # FIXME: stop using hwapi, and get those functions into core software - hw_api = ctx._core.get_hardware() + hw_api = get_sync_hw_api(ctx) hw_mount = OT3Mount.LEFT if pipette.mount == "left" else OT3Mount.RIGHT hw_pipette = hw_api.hardware_pipettes[hw_mount.to_mount()] _check_aspirate_dispense_args(mix, aspirate, dispense) @@ -189,20 +190,6 @@ def _get_max_blow_out_ul() -> float: blow_out = hw_pipette.plunger_positions.blow_out return (blow_out - bottom) * blow_out_ul_per_mm - def _dispense_with_added_blow_out() -> None: - # dispense all liquid, plus some air - # FIXME: push-out is not supported in Legacy core, so here - # we again use the hardware controller - hw_api = ctx._core.get_hardware() - hw_mount = OT3Mount.LEFT if pipette.mount == "left" else OT3Mount.RIGHT - push_out = min(liquid_class.dispense.blow_out_submerged, _get_max_blow_out_ul()) - hw_api.dispense(hw_mount, push_out=push_out) - - def _blow_out_remaining_air() -> None: - # FIXME: using the HW-API to specify that we want to blow-out the full - # available blow-out volume - hw_api.blow_out(hw_mount, _get_max_blow_out_ul()) - # ASPIRATE/DISPENSE SEQUENCE HAS THREE PHASES: # 1. APPROACH # 2. SUBMERGE @@ -237,16 +224,17 @@ def _aspirate_on_approach() -> None: "WARNING: removing trailing air-gap from pipette, " "this should only happen during blank trials" ) - hw_api.dispense(hw_mount) + pipette.dispense(volume=pipette.current_volume) if mode: # NOTE: increment test requires the plunger's "bottom" position # does not change during the entire test run hw_api.set_liquid_class(hw_mount, mode) else: - hw_api.configure_for_volume(hw_mount, aspirate if aspirate else dispense) + cfg_volume: float = aspirate if aspirate else dispense # type: ignore[assignment] + pipette.configure_for_volume(cfg_volume) if clear_accuracy_function: clear_pipette_ul_per_mm(hw_api, hw_mount) # type: ignore[arg-type] - hw_api.prepare_for_aspirate(hw_mount) + pipette.prepare_to_aspirate() if liquid_class.aspirate.leading_air_gap > 0: pipette.aspirate(liquid_class.aspirate.leading_air_gap) @@ -260,14 +248,18 @@ def _aspirate_on_mix() -> None: if i < _num_mixes - 1: pipette.dispense(mix) else: - _dispense_with_added_blow_out() + if added_blow_out: + push_out = min( + liquid_class.dispense.blow_out_submerged, _get_max_blow_out_ul() + ) + pipette.dispense(dispense, push_out=push_out) ctx.delay(liquid_class.dispense.delay) # don't go all the way up to retract position, but instead just above liquid _retract( ctx, pipette, well, channel_offset, approach_mm, retract_speed, _z_disc ) - _blow_out_remaining_air() - hw_api.prepare_for_aspirate(hw_mount) + pipette.blow_out() + pipette.prepare_to_aspirate() assert pipette.current_volume == 0 def _aspirate_on_submerge() -> None: @@ -283,18 +275,22 @@ def _aspirate_on_submerge() -> None: def _aspirate_on_retract() -> None: # add trailing-air-gap - pipette.aspirate(liquid_class.aspirate.trailing_air_gap) + if not blank: + pipette.air_gap(liquid_class.aspirate.trailing_air_gap, height=0) def _dispense_on_approach() -> None: # remove trailing-air-gap - pipette.dispense(liquid_class.aspirate.trailing_air_gap) + if not blank: + pipette.dispense(liquid_class.aspirate.trailing_air_gap) def _dispense_on_submerge() -> None: callbacks.on_dispensing() + push_out = None if added_blow_out: - _dispense_with_added_blow_out() - else: - pipette.dispense(dispense) + push_out = min( + liquid_class.dispense.blow_out_submerged, _get_max_blow_out_ul() + ) + pipette.dispense(dispense, push_out=push_out) # update liquid-height tracker liquid_tracker.update_affected_wells( well, dispense=dispense, channels=channel_count @@ -306,13 +302,13 @@ def _dispense_on_retract() -> None: if pipette.current_volume <= 0 and added_blow_out: # blow-out any remaining air in pipette (any reason why not?) callbacks.on_blowing_out() - _blow_out_remaining_air() - hw_api.prepare_for_aspirate(hw_mount) + pipette.blow_out() + pipette.prepare_to_aspirate() if touch_tip: pipette.touch_tip(speed=config.TOUCH_TIP_SPEED) # NOTE: always do a trailing-air-gap, regardless of if tip is empty or not # to avoid droplets from forming and falling off the tip - pipette.aspirate(liquid_class.aspirate.trailing_air_gap) + pipette.air_gap(liquid_class.aspirate.trailing_air_gap, height=0) # PHASE 1: APPROACH pipette.flow_rate.aspirate = liquid_class.aspirate.plunger_flow_rate @@ -337,7 +333,7 @@ def _dispense_on_retract() -> None: # EXIT callbacks.on_exiting() - hw_api.retract(hw_mount) + pipette._retract() def mix_with_liquid_class( diff --git a/hardware-testing/hardware_testing/gravimetric/overrides/api.patch b/hardware-testing/hardware_testing/gravimetric/overrides/api.patch index 4e2ab9b6c23..e69de29bb2d 100644 --- a/hardware-testing/hardware_testing/gravimetric/overrides/api.patch +++ b/hardware-testing/hardware_testing/gravimetric/overrides/api.patch @@ -1,111 +0,0 @@ -diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py -index 2d36460ca6..8578768930 100644 ---- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py -+++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py -@@ -427,11 +427,11 @@ class Pipette(AbstractInstrument[PipetteConfigurations]): - - def set_current_volume(self, new_volume: float) -> None: - assert new_volume >= 0 -- assert new_volume <= self.working_volume -+ # assert new_volume <= self.working_volume - self._current_volume = new_volume - - def add_current_volume(self, volume_incr: float) -> None: -- assert self.ok_to_add_volume(volume_incr) -+ # assert self.ok_to_add_volume(volume_incr) - self._current_volume += volume_incr - - def remove_current_volume(self, volume_incr: float) -> None: -@@ -439,7 +439,8 @@ class Pipette(AbstractInstrument[PipetteConfigurations]): - self._current_volume -= volume_incr - - def ok_to_add_volume(self, volume_incr: float) -> bool: -- return self.current_volume + volume_incr <= self.working_volume -+ # return self.current_volume + volume_incr <= self.working_volume -+ return True - - def ok_to_push_out(self, push_out_dist_mm: float) -> bool: - return push_out_dist_mm <= ( -diff --git a/api/src/opentrons/protocol_api/core/engine/deck_conflict.py b/api/src/opentrons/protocol_api/core/engine/deck_conflict.py -index 0ba7e17621..4d6682f5e4 100644 ---- a/api/src/opentrons/protocol_api/core/engine/deck_conflict.py -+++ b/api/src/opentrons/protocol_api/core/engine/deck_conflict.py -@@ -341,18 +341,12 @@ def check_safe_for_tip_pickup_and_return( - f" when picking up fewer than 96 tips." - ) - elif not is_partial_config and not is_96_ch_tiprack_adapter: -- raise UnsuitableTiprackForPipetteMotion( -- f"{tiprack_name} must be on an Opentrons Flex 96 Tip Rack Adapter" -- f" in order to pick up or return all 96 tips simultaneously." -- ) -+ pass - - elif ( - not is_partial_config - ): # tiprack is not on adapter and pipette is in full config -- raise UnsuitableTiprackForPipetteMotion( -- f"{tiprack_name} must be on an Opentrons Flex 96 Tip Rack Adapter" -- f" in order to pick up or return all 96 tips simultaneously." -- ) -+ pass - - - # TODO (spp, 2023-02-06): update the extents check to use all nozzle bounds instead of -diff --git a/api/src/opentrons/protocol_api/core/legacy/deck.py b/api/src/opentrons/protocol_api/core/legacy/deck.py -index 9a9092af5a..33aa5941ce 100644 ---- a/api/src/opentrons/protocol_api/core/legacy/deck.py -+++ b/api/src/opentrons/protocol_api/core/legacy/deck.py -@@ -55,11 +55,11 @@ class DeckItem(Protocol): - class Deck(UserDict): # type: ignore[type-arg] - data: Dict[int, Optional[DeckItem]] - -- def __init__(self, deck_type: str) -> None: -+ def __init__( -+ self, deck_type: str, version: int = DEFAULT_LEGACY_DECK_DEFINITION_VERSION -+ ) -> None: - super().__init__() -- self._definition = load_deck( -- name=deck_type, version=DEFAULT_LEGACY_DECK_DEFINITION_VERSION -- ) -+ self._definition = load_deck(name=deck_type, version=version) - self._positions = {} - for slot in self._definition["locations"]["orderedSlots"]: - self.data[int(slot["id"])] = None -diff --git a/api/src/opentrons/protocol_api/create_protocol_context.py b/api/src/opentrons/protocol_api/create_protocol_context.py -index 5a64e70cf9..7d5047cc4b 100644 ---- a/api/src/opentrons/protocol_api/create_protocol_context.py -+++ b/api/src/opentrons/protocol_api/create_protocol_context.py -@@ -22,6 +22,7 @@ from .deck import Deck - - from .core.common import ProtocolCore as AbstractProtocolCore - from .core.legacy.deck import Deck as LegacyDeck -+from opentrons_shared_data.deck import DEFAULT_DECK_DEFINITION_VERSION - from .core.legacy.legacy_protocol_core import LegacyProtocolCore - from .core.legacy.labware_offset_provider import ( - AbstractLabwareOffsetProvider, -@@ -52,6 +53,7 @@ def create_protocol_context( - extra_labware: Optional[Dict[str, LabwareDefinition]] = None, - bundled_labware: Optional[Dict[str, LabwareDefinition]] = None, - bundled_data: Optional[Dict[str, bytes]] = None, -+ deck_version: int = DEFAULT_DECK_DEFINITION_VERSION, - ) -> ProtocolContext: - """Create a ProtocolContext for use in a Python protocol. - -@@ -121,7 +123,7 @@ def create_protocol_context( - - # TODO(mc, 2022-8-22): remove `disable_fast_protocol_upload` - elif use_simulating_core and not feature_flags.disable_fast_protocol_upload(): -- legacy_deck = LegacyDeck(deck_type=deck_type) -+ legacy_deck = LegacyDeck(deck_type=deck_type, version=deck_version) - core = LegacyProtocolCoreSimulator( - sync_hardware=sync_hardware, - labware_offset_provider=labware_offset_provider, -@@ -133,7 +135,7 @@ def create_protocol_context( - ) - - else: -- legacy_deck = LegacyDeck(deck_type=deck_type) -+ legacy_deck = LegacyDeck(deck_type=deck_type, version=deck_version) - core = LegacyProtocolCore( - sync_hardware=sync_hardware, - labware_offset_provider=labware_offset_provider, diff --git a/hardware-testing/hardware_testing/gravimetric/overrides/shared-data.patch b/hardware-testing/hardware_testing/gravimetric/overrides/shared-data.patch index b2d08d109e9..5d688841b91 100644 --- a/hardware-testing/hardware_testing/gravimetric/overrides/shared-data.patch +++ b/hardware-testing/hardware_testing/gravimetric/overrides/shared-data.patch @@ -1,872 +1,180 @@ -diff --git a/shared-data/deck/definitions/2/ot3_standard.json b/shared-data/deck/definitions/2/ot3_standard.json -new file mode 100644 -index 0000000000..8ad4397cba ---- /dev/null -+++ b/shared-data/deck/definitions/2/ot3_standard.json -@@ -0,0 +1,866 @@ -+{ -+ "otId": "ot3_standard", -+ "schemaVersion": 3, -+ "cornerOffsetFromOrigin": [-204.31, -76.59, 0], -+ "dimensions": [854.995, 581.74, 0], -+ "metadata": { -+ "displayName": "OT-3 Standard Deck", -+ "tags": ["ot3", "12 slots", "standard"] -+ }, -+ "robot": { -+ "model": "OT-3 Standard" -+ }, -+ "locations": { -+ "orderedSlots": [ -+ { -+ "id": "1", -+ "position": [0.0, 0.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot D1", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "2", -+ "position": [164.0, 0.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot D2", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "3", -+ "position": [328.0, 0.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot D3", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "4", -+ "position": [0.0, 107, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot C1", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "5", -+ "position": [164.0, 107, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot C2", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "6", -+ "position": [328.0, 107, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot C3", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "7", -+ "position": [0.0, 214.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot B1", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "thermocyclerModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "8", -+ "position": [164.0, 214.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot B2", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "9", -+ "position": [328.0, 214.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot B3", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "10", -+ "position": [0.0, 321.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot A1", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "11", -+ "position": [164.0, 321.0, 0.0], -+ "matingSurfaceUnitVector": [-1, 1, -1], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot A2", -+ "compatibleModuleTypes": [ -+ "magneticModuleType", -+ "temperatureModuleType", -+ "heaterShakerModuleType" -+ ] -+ }, -+ { -+ "id": "12", -+ "position": [328.0, 321.0, 0.0], -+ "boundingBox": { -+ "xDimension": 128.0, -+ "yDimension": 86.0, -+ "zDimension": 0 -+ }, -+ "displayName": "Slot A3", -+ "compatibleModuleTypes": [] -+ } -+ ], -+ "calibrationPoints": [], -+ "fixtures": [ -+ { -+ "id": "fixedTrash", -+ "slot": "12", -+ "labware": "opentrons_1_trash_3200ml_fixed", -+ "displayName": "Fixed Trash" -+ } -+ ] -+ }, -+ "layers": [ -+ { -+ "name": "style", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "type": "text/css" -+ }, -+ "children": [ -+ { -+ "name": "", -+ "type": "text", -+ "value": "\n.st0{fill:#CCCCCC;}\n.st1{fill:none;stroke:#16212D;stroke-width:3.2047;stroke-opacity:0.7;}\n.st2{fill:none;stroke:#16212D;stroke-width:3.156;stroke-opacity:0.7;}\n", -+ "attributes": {}, -+ "children": [] -+ } -+ ] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_A1_EXPANSION", -+ "class": "st0", -+ "d": "M-97.8,496.6h239c2.3,0,4.2-1.9,4.2-4.2v-70c0-2.3-1.9-4.2-4.2-4.2h-239c-2.3,0-4.2,1.9-4.2,4.2v70\nC-102,494.7-100.1,496.6-97.8,496.6z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_A1", -+ "class": "st0", -+ "d": "M-97.7,417.1h238.8c2.4,0,4.3-1.9,4.3-4.3v-97.4c0-2.4-1.9-4.3-4.3-4.3H-97.7c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC-102,415.1-100.1,417.1-97.7,417.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_A2", -+ "class": "st0", -+ "d": "M150.8,417.1h154.3c2.4,0,4.3-1.9,4.3-4.3v-97.4c0-2.4-1.9-4.3-4.3-4.3H150.8c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC146.5,415.1,148.4,417.1,150.8,417.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_A3", -+ "class": "st0", -+ "d": "M314.8,417.1h238.9c2.4,0,4.3-1.9,4.3-4.3v-97.4c0-2.4-1.9-4.3-4.3-4.3H314.8c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC310.5,415.1,312.4,417.1,314.8,417.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_B1", -+ "class": "st0", -+ "d": "M-97.7,310h238.8c2.4,0,4.3-1.9,4.3-4.3v-97.2c0-2.4-1.9-4.3-4.3-4.3H-97.7c-2.4,0-4.3,1.9-4.3,4.3v97.2\nC-102,308.1-100.1,310-97.7,310z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_B2", -+ "class": "st0", -+ "d": "M150.8,310h154.3c2.4,0,4.3-1.9,4.3-4.3v-97.2c0-2.4-1.9-4.3-4.3-4.3H150.8c-2.4,0-4.3,1.9-4.3,4.3v97.2\nC146.5,308.1,148.4,310,150.8,310z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_B3", -+ "class": "st0", -+ "d": "M314.8,310h238.9c2.4,0,4.3-1.9,4.3-4.3v-97.2c0-2.4-1.9-4.3-4.3-4.3H314.8c-2.4,0-4.3,1.9-4.3,4.3v97.2\nC310.5,308.1,312.4,310,314.8,310z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_C1", -+ "class": "st0", -+ "d": "M-97.7,203.1h238.8c2.4,0,4.3-1.9,4.3-4.3v-97.4c0-2.4-1.9-4.3-4.3-4.3H-97.7c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC-102,201.2-100.1,203.1-97.7,203.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_C2", -+ "class": "st0", -+ "d": "M150.8,203.1h154.3c2.4,0,4.3-1.9,4.3-4.3v-97.4c0-2.4-1.9-4.3-4.3-4.3H150.8c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC146.5,201.2,148.4,203.1,150.8,203.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_C3", -+ "class": "st0", -+ "d": "M314.8,203.1h238.9c2.4,0,4.3-1.9,4.3-4.3v-97.4c0-2.4-1.9-4.3-4.3-4.3H314.8c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC310.5,201.2,312.4,203.1,314.8,203.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_D1", -+ "class": "st0", -+ "d": "M-97.7,96.1h238.8c2.4,0,4.3-1.9,4.3-4.3V-5.6c0-2.4-1.9-4.3-4.3-4.3H-97.7c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC-102,94.2-100.1,96.1-97.7,96.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_D2", -+ "class": "st0", -+ "d": "M150.8,96.1h154.3c2.4,0,4.3-1.9,4.3-4.3V-5.6c0-2.4-1.9-4.3-4.3-4.3H150.8c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC146.5,94.2,148.4,96.1,150.8,96.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_BASE_D3", -+ "class": "st0", -+ "d": "M314.8,96.1h238.9c2.4,0,4.3-1.9,4.3-4.3V-5.6c0-2.4-1.9-4.3-4.3-4.3H314.8c-2.4,0-4.3,1.9-4.3,4.3v97.4\nC310.5,94.2,312.4,96.1,314.8,96.1z" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "g", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "id": "SLOT_CLIPS" -+ }, -+ "children": [ -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M-1.9,398.9V409H8.9" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M-1.9,329.8v-10.5H8.7" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,398.9V409h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,329.8v-10.7h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M162.1,398.9V409h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M162.1,329.8v-10.5h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,398.9V409h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,329.8v-10.7h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M326,398.9V409h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M326,329.8v-10.5h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,398.9V409H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,329.8v-10.7H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M-1.9,291.9V302H8.9" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M-1.9,222.8v-10.5H8.7" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,291.9V302h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,222.8v-10.7h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M162.1,291.9V302h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M162.1,222.8v-10.5h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,291.9V302h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,222.8v-10.7h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M326,291.9V302h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M326,222.8v-10.5h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,291.9V302H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,222.8v-10.7H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M-1.9,185v10.1H8.9" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M-1.9,115.8v-10.5H8.7" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,185v10.1h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,115.8v-10.7h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M162.1,185v10.1h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M162.1,115.8v-10.5h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,185v10.1h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,115.8v-10.7h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M326,185v10.1h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M326,115.8v-10.5h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,185v10.1H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,115.8v-10.7H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M-1.9,77.9V88H8.9" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M-1.9,8.8V-1.7H8.7" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,77.9V88h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M129.9,8.8V-1.9h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M162.1,77.9V88h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M162.1,8.8V-1.7h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,77.9V88h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M293.9,8.8V-1.9h-10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M326,77.9V88h10.8" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st2", -+ "d": "M326,8.8V-1.7h10.6" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,77.9V88H447" -+ }, -+ "children": [] -+ }, -+ { -+ "name": "path", -+ "type": "element", -+ "value": "", -+ "attributes": { -+ "class": "st1", -+ "d": "M457.8,8.8V-1.9H447" -+ }, -+ "children": [] -+ } -+ ] -+ } -+ ] -+} +diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json +index c798ce421a..14fc4a5b67 100644 +--- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json ++++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json +@@ -20,50 +20,50 @@ + "aspirate": { + "default": { + "1": [ +- [0.462, 0.5646, 0.0415], +- [0.648, 0.3716, 0.1307], +- [1.032, 0.2742, 0.1938], +- [1.37, 0.1499, 0.3221], +- [2.014, 0.1044, 0.3845], +- [2.772, 0.0432, 0.5076], +- [3.05, -0.0809, 0.8517], +- [3.4, 0.0256, 0.5268], +- [3.962, 0.0612, 0.4057], +- [4.438, 0.0572, 0.4217], +- [5.164, 0.018, 0.5955], +- [5.966, 0.0095, 0.6393], +- [7.38, 0.0075, 0.6514], +- [9.128, 0.0049, 0.6705], +- [10.16, 0.0033, 0.6854], +- [13.812, 0.0024, 0.6948], +- [27.204, 0.0008, 0.7165], +- [50.614, 0.0002, 0.7328], +- [53.046, -0.0005, 0.7676] ++ [0.31, 0.591, 0.0197], ++ [0.39, 0.2586, 0.1227], ++ [0.86, 0.3697, 0.0794], ++ [1.29, 0.231, 0.1987], ++ [1.93, 0.1144, 0.3491], ++ [2.7, 0.0536, 0.4664], ++ [2.95, -0.1041, 0.8923], ++ [3.28, 0.0216, 0.5214], ++ [3.76, 0.048, 0.4349], ++ [4.38, 0.083, 0.3032], ++ [5.08, 0.0153, 0.5996], ++ [5.9, 0.0136, 0.6083], ++ [7.29, 0.007, 0.6474], ++ [9.04, 0.0059, 0.6551], ++ [10.08, 0.0045, 0.6682], ++ [13.74, 0.0029, 0.6842], ++ [27.15, 0.001, 0.7104], ++ [50.48, 0.0002, 0.7319], ++ [52.89, -0.0006, 0.7703] + ] + } + }, + "dispense": { + "default": { + "1": [ +- [0.462, 0.5646, 0.0415], +- [0.648, 0.3716, 0.1307], +- [1.032, 0.2742, 0.1938], +- [1.37, 0.1499, 0.3221], +- [2.014, 0.1044, 0.3845], +- [2.772, 0.0432, 0.5076], +- [3.05, -0.0809, 0.8517], +- [3.4, 0.0256, 0.5268], +- [3.962, 0.0612, 0.4057], +- [4.438, 0.0572, 0.4217], +- [5.164, 0.018, 0.5955], +- [5.966, 0.0095, 0.6393], +- [7.38, 0.0075, 0.6514], +- [9.128, 0.0049, 0.6705], +- [10.16, 0.0033, 0.6854], +- [13.812, 0.0024, 0.6948], +- [27.204, 0.0008, 0.7165], +- [50.614, 0.0002, 0.7328], +- [53.046, -0.0005, 0.7676] ++ [0.31, 0.591, 0.0197], ++ [0.39, 0.2586, 0.1227], ++ [0.86, 0.3697, 0.0794], ++ [1.29, 0.231, 0.1987], ++ [1.93, 0.1144, 0.3491], ++ [2.7, 0.0536, 0.4664], ++ [2.95, -0.1041, 0.8923], ++ [3.28, 0.0216, 0.5214], ++ [3.76, 0.048, 0.4349], ++ [4.38, 0.083, 0.3032], ++ [5.08, 0.0153, 0.5996], ++ [5.9, 0.0136, 0.6083], ++ [7.29, 0.007, 0.6474], ++ [9.04, 0.0059, 0.6551], ++ [10.08, 0.0045, 0.6682], ++ [13.74, 0.0029, 0.6842], ++ [27.15, 0.001, 0.7104], ++ [50.48, 0.0002, 0.7319], ++ [52.89, -0.0006, 0.7703] + ] + } + }, +diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json +index 644d93354e..4eba92a089 100644 +--- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json ++++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json +@@ -20,46 +20,48 @@ + "aspirate": { + "default": { + "1": [ +- [0.11, 0.207815, 0.040201], +- [0.65, 0.43933, 0.014735], +- [1.04, 0.256666, 0.133466], +- [1.67, 0.147126, 0.247388], +- [2.45, 0.078774, 0.361536], +- [2.89, 0.042387, 0.450684], +- [3.2, 0.014781, 0.530464], +- [3.79, 0.071819, 0.347944], +- [4.22, 0.051592, 0.424605], +- [4.93, 0.021219, 0.552775], +- [5.81, 0.023461, 0.541725], +- [7.21, 0.008959, 0.625982], +- [8.93, 0.005456, 0.651235], +- [10.0, 0.007108, 0.636489], +- [13.61, 0.002591, 0.681656], +- [26.99, 0.001163, 0.701094], +- [45.25, 0.000207, 0.726887] ++ [0.3, 0.459, 0.0586], ++ [0.47, 0.43, 0.0674], ++ [0.9, 0.3404, 0.1095], ++ [1.26, 0.1925, 0.2425], ++ [1.95, 0.1314, 0.3195], ++ [2.76, 0.0604, 0.458], ++ [2.95, -0.2085, 1.2002], ++ [3.33, 0.0425, 0.4597], ++ [3.87, 0.0592, 0.404], ++ [4.31, 0.0518, 0.4327], ++ [5.07, 0.0264, 0.5424], ++ [5.93, 0.0186, 0.5818], ++ [7.34, 0.0078, 0.6458], ++ [9.08, 0.005, 0.6664], ++ [10.09, 0.0022, 0.6918], ++ [13.74, 0.0027, 0.6868], ++ [27.13, 0.0009, 0.7109], ++ [45.43, -0.0038, 0.8391] + ] + } + }, + "dispense": { + "default": { + "1": [ +- [0.11, 0.207815, 0.040201], +- [0.65, 0.43933, 0.014735], +- [1.04, 0.256666, 0.133466], +- [1.67, 0.147126, 0.247388], +- [2.45, 0.078774, 0.361536], +- [2.89, 0.042387, 0.450684], +- [3.2, 0.014781, 0.530464], +- [3.79, 0.071819, 0.347944], +- [4.22, 0.051592, 0.424605], +- [4.93, 0.021219, 0.552775], +- [5.81, 0.023461, 0.541725], +- [7.21, 0.008959, 0.625982], +- [8.93, 0.005456, 0.651235], +- [10.0, 0.007108, 0.636489], +- [13.61, 0.002591, 0.681656], +- [26.99, 0.001163, 0.701094], +- [45.25, 0.000207, 0.726887] ++ [0.3, 0.459, 0.0586], ++ [0.47, 0.43, 0.0674], ++ [0.9, 0.3404, 0.1095], ++ [1.26, 0.1925, 0.2425], ++ [1.95, 0.1314, 0.3195], ++ [2.76, 0.0604, 0.458], ++ [2.95, -0.2085, 1.2002], ++ [3.33, 0.0425, 0.4597], ++ [3.87, 0.0592, 0.404], ++ [4.31, 0.0518, 0.4327], ++ [5.07, 0.0264, 0.5424], ++ [5.93, 0.0186, 0.5818], ++ [7.34, 0.0078, 0.6458], ++ [9.08, 0.005, 0.6664], ++ [10.09, 0.0022, 0.6918], ++ [13.74, 0.0027, 0.6868], ++ [27.13, 0.0009, 0.7109], ++ [45.43, -0.0038, 0.8391] + ] + } + }, diff --git a/hardware-testing/hardware_testing/gravimetric/tips.py b/hardware-testing/hardware_testing/gravimetric/tips.py index 8edf66a5797..7e72c6884a2 100644 --- a/hardware-testing/hardware_testing/gravimetric/tips.py +++ b/hardware-testing/hardware_testing/gravimetric/tips.py @@ -60,18 +60,18 @@ 7: "A", } CHANNEL_TO_TIP_ROW_LOOKUP_BY_SLOT = { - "1": CHANNEL_TO_TIP_ROW_LOOKUP, - "2": CHANNEL_TO_TIP_ROW_LOOKUP, - "3": CHANNEL_TO_TIP_ROW_LOOKUP, - "4": CHANNEL_TO_TIP_ROW_LOOKUP, - "5": CHANNEL_TO_TIP_ROW_LOOKUP, - "6": CHANNEL_TO_TIP_ROW_LOOKUP, - "7": CHANNEL_TO_TIP_ROW_LOOKUP, - "8": CHANNEL_TO_TIP_ROW_LOOKUP, - "9": CHANNEL_TO_TIP_ROW_LOOKUP, - "10": CHANNEL_TO_TIP_ROW_LOOKUP_BACK, - "11": CHANNEL_TO_TIP_ROW_LOOKUP_BACK, - "12": CHANNEL_TO_TIP_ROW_LOOKUP_BACK, + "D1": CHANNEL_TO_TIP_ROW_LOOKUP, + "D2": CHANNEL_TO_TIP_ROW_LOOKUP, + "D3": CHANNEL_TO_TIP_ROW_LOOKUP, + "C1": CHANNEL_TO_TIP_ROW_LOOKUP, + "C2": CHANNEL_TO_TIP_ROW_LOOKUP, + "C3": CHANNEL_TO_TIP_ROW_LOOKUP, + "B1": CHANNEL_TO_TIP_ROW_LOOKUP, + "B2": CHANNEL_TO_TIP_ROW_LOOKUP, + "B3": CHANNEL_TO_TIP_ROW_LOOKUP, + "A1": CHANNEL_TO_TIP_ROW_LOOKUP_BACK, + "A2": CHANNEL_TO_TIP_ROW_LOOKUP_BACK, + "A3": CHANNEL_TO_TIP_ROW_LOOKUP_BACK, } REAR_CHANNELS = [0, 1, 2, 3] FRONT_CHANNELS = [4, 5, 6, 7] diff --git a/hardware-testing/hardware_testing/gravimetric/workarounds.py b/hardware-testing/hardware_testing/gravimetric/workarounds.py index 0d2c425d830..7c182ddd079 100644 --- a/hardware-testing/hardware_testing/gravimetric/workarounds.py +++ b/hardware-testing/hardware_testing/gravimetric/workarounds.py @@ -12,6 +12,8 @@ from hardware_testing.opentrons_api.helpers_ot3 import start_server_ot3, stop_server_ot3 from hardware_testing.opentrons_api.types import Point +from opentrons.protocol_engine.types import LabwareOffset + def is_running_in_app() -> bool: """Is running in App.""" @@ -33,7 +35,7 @@ def force_prepare_for_aspirate(pipette: InstrumentContext) -> None: pipette.dispense() -def http_get_all_labware_offsets() -> List[dict]: +def http_get_all_labware_offsets() -> List[LabwareOffset]: """Request (HTTP GET) from the local robot-server all runs information.""" req = Request("http://localhost:31950/runs") req.add_header("Opentrons-Version", "2") @@ -46,7 +48,18 @@ def http_get_all_labware_offsets() -> List[dict]: runs_json = json_loads(runs_response_data) protocols_list = runs_json["data"] - return [offset for p in protocols_list for offset in p["labwareOffsets"]] + offset_dict = [offset for p in protocols_list for offset in p["labwareOffsets"]] + offsets: List[LabwareOffset] = [] + for offset_data in offset_dict: + new_offset = LabwareOffset( + id=offset_data["id"], + createdAt=offset_data["createdAt"], + definitionUri=offset_data["definitionUri"], + location=offset_data["location"], + vector=offset_data["vector"], + ) + offsets.append(new_offset) + return offsets def _old_slot_to_ot3_slot(old_api_slot: str) -> str: diff --git a/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_1000ul_adp/1.json b/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_1000ul_adp/1.json deleted file mode 100644 index 2307f25d876..00000000000 --- a/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_1000ul_adp/1.json +++ /dev/null @@ -1,1017 +0,0 @@ -{ - "ordering": [ - ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], - ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], - ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], - ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], - ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], - ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], - ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], - ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], - ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], - ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], - ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], - ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] - ], - "brand": { - "brand": "ryantrons OT-3", - "brandId": [] - }, - "metadata": { - "displayName": "Opentrons Flex 96 Tip Rack 1000 µL with adapter", - "displayCategory": "tipRack", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 132 - }, - "wells": { - "A1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 74.1, - "z": 36.4 - }, - "B1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 65.1, - "z": 36.4 - }, - "C1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 56.1, - "z": 36.4 - }, - "D1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 47.1, - "z": 36.4 - }, - "E1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 38.1, - "z": 36.4 - }, - "F1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 29.1, - "z": 36.4 - }, - "G1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 20.1, - "z": 36.4 - }, - "H1": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 14.38, - "y": 11.1, - "z": 36.4 - }, - "A2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 74.1, - "z": 36.4 - }, - "B2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 65.1, - "z": 36.4 - }, - "C2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 56.1, - "z": 36.4 - }, - "D2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 47.1, - "z": 36.4 - }, - "E2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 38.1, - "z": 36.4 - }, - "F2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 29.1, - "z": 36.4 - }, - "G2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 20.1, - "z": 36.4 - }, - "H2": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 23.38, - "y": 11.1, - "z": 36.4 - }, - "A3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 74.1, - "z": 36.4 - }, - "B3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 65.1, - "z": 36.4 - }, - "C3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 56.1, - "z": 36.4 - }, - "D3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 47.1, - "z": 36.4 - }, - "E3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 38.1, - "z": 36.4 - }, - "F3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 29.1, - "z": 36.4 - }, - "G3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 20.1, - "z": 36.4 - }, - "H3": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 32.38, - "y": 11.1, - "z": 36.4 - }, - "A4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 74.1, - "z": 36.4 - }, - "B4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 65.1, - "z": 36.4 - }, - "C4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 56.1, - "z": 36.4 - }, - "D4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 47.1, - "z": 36.4 - }, - "E4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 38.1, - "z": 36.4 - }, - "F4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 29.1, - "z": 36.4 - }, - "G4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 20.1, - "z": 36.4 - }, - "H4": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 41.38, - "y": 11.1, - "z": 36.4 - }, - "A5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 74.1, - "z": 36.4 - }, - "B5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 65.1, - "z": 36.4 - }, - "C5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 56.1, - "z": 36.4 - }, - "D5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 47.1, - "z": 36.4 - }, - "E5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 38.1, - "z": 36.4 - }, - "F5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 29.1, - "z": 36.4 - }, - "G5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 20.1, - "z": 36.4 - }, - "H5": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 50.38, - "y": 11.1, - "z": 36.4 - }, - "A6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 74.1, - "z": 36.4 - }, - "B6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 65.1, - "z": 36.4 - }, - "C6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 56.1, - "z": 36.4 - }, - "D6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 47.1, - "z": 36.4 - }, - "E6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 38.1, - "z": 36.4 - }, - "F6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 29.1, - "z": 36.4 - }, - "G6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 20.1, - "z": 36.4 - }, - "H6": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 59.38, - "y": 11.1, - "z": 36.4 - }, - "A7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 74.1, - "z": 36.4 - }, - "B7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 65.1, - "z": 36.4 - }, - "C7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 56.1, - "z": 36.4 - }, - "D7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 47.1, - "z": 36.4 - }, - "E7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 38.1, - "z": 36.4 - }, - "F7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 29.1, - "z": 36.4 - }, - "G7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 20.1, - "z": 36.4 - }, - "H7": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 68.38, - "y": 11.1, - "z": 36.4 - }, - "A8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 74.1, - "z": 36.4 - }, - "B8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 65.1, - "z": 36.4 - }, - "C8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 56.1, - "z": 36.4 - }, - "D8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 47.1, - "z": 36.4 - }, - "E8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 38.1, - "z": 36.4 - }, - "F8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 29.1, - "z": 36.4 - }, - "G8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 20.1, - "z": 36.4 - }, - "H8": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 77.38, - "y": 11.1, - "z": 36.4 - }, - "A9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 74.1, - "z": 36.4 - }, - "B9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 65.1, - "z": 36.4 - }, - "C9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 56.1, - "z": 36.4 - }, - "D9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 47.1, - "z": 36.4 - }, - "E9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 38.1, - "z": 36.4 - }, - "F9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 29.1, - "z": 36.4 - }, - "G9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 20.1, - "z": 36.4 - }, - "H9": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 86.38, - "y": 11.1, - "z": 36.4 - }, - "A10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 74.1, - "z": 36.4 - }, - "B10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 65.1, - "z": 36.4 - }, - "C10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 56.1, - "z": 36.4 - }, - "D10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 47.1, - "z": 36.4 - }, - "E10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 38.1, - "z": 36.4 - }, - "F10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 29.1, - "z": 36.4 - }, - "G10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 20.1, - "z": 36.4 - }, - "H10": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 95.38, - "y": 11.1, - "z": 36.4 - }, - "A11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 74.1, - "z": 36.4 - }, - "B11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 65.1, - "z": 36.4 - }, - "C11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 56.1, - "z": 36.4 - }, - "D11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 47.1, - "z": 36.4 - }, - "E11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 38.1, - "z": 36.4 - }, - "F11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 29.1, - "z": 36.4 - }, - "G11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 20.1, - "z": 36.4 - }, - "H11": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 104.38, - "y": 11.1, - "z": 36.4 - }, - "A12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 74.1, - "z": 36.4 - }, - "B12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 65.1, - "z": 36.4 - }, - "C12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 56.1, - "z": 36.4 - }, - "D12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 47.1, - "z": 36.4 - }, - "E12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 38.1, - "z": 36.4 - }, - "F12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 29.1, - "z": 36.4 - }, - "G12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 20.1, - "z": 36.4 - }, - "H12": { - "depth": 95.6, - "totalLiquidVolume": 1000, - "shape": "circular", - "diameter": 5.47, - "x": 113.38, - "y": 11.1, - "z": 36.4 - } - }, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "96Standard", - "quirks": [], - "isTiprack": true, - "tipLength": 95.6, - "tipOverlap": 10.5, - "isMagneticModuleCompatible": false, - "loadName": "opentrons_flex_96_tiprack_1000ul_adp" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} diff --git a/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_200ul_adp/1.json b/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_200ul_adp/1.json deleted file mode 100644 index 439479d5c76..00000000000 --- a/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_200ul_adp/1.json +++ /dev/null @@ -1,1017 +0,0 @@ -{ - "ordering": [ - ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], - ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], - ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], - ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], - ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], - ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], - ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], - ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], - ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], - ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], - ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], - ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] - ], - "brand": { - "brand": "ryantrons OT-3", - "brandId": [] - }, - "metadata": { - "displayName": "Opentrons Flex 96 Tip Rack 200 µL with adapter", - "displayCategory": "tipRack", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 132 - }, - "wells": { - "A1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 74.1, - "z": 73.65 - }, - "B1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 65.1, - "z": 73.65 - }, - "C1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 56.1, - "z": 73.65 - }, - "D1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 47.1, - "z": 73.65 - }, - "E1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 38.1, - "z": 73.65 - }, - "F1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 29.1, - "z": 73.65 - }, - "G1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 20.1, - "z": 73.65 - }, - "H1": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 14.38, - "y": 11.1, - "z": 73.65 - }, - "A2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 74.1, - "z": 73.65 - }, - "B2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 65.1, - "z": 73.65 - }, - "C2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 56.1, - "z": 73.65 - }, - "D2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 47.1, - "z": 73.65 - }, - "E2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 38.1, - "z": 73.65 - }, - "F2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 29.1, - "z": 73.65 - }, - "G2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 20.1, - "z": 73.65 - }, - "H2": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 23.38, - "y": 11.1, - "z": 73.65 - }, - "A3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 74.1, - "z": 73.65 - }, - "B3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 65.1, - "z": 73.65 - }, - "C3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 56.1, - "z": 73.65 - }, - "D3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 47.1, - "z": 73.65 - }, - "E3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 38.1, - "z": 73.65 - }, - "F3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 29.1, - "z": 73.65 - }, - "G3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 20.1, - "z": 73.65 - }, - "H3": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 32.38, - "y": 11.1, - "z": 73.65 - }, - "A4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 74.1, - "z": 73.65 - }, - "B4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 65.1, - "z": 73.65 - }, - "C4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 56.1, - "z": 73.65 - }, - "D4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 47.1, - "z": 73.65 - }, - "E4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 38.1, - "z": 73.65 - }, - "F4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 29.1, - "z": 73.65 - }, - "G4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 20.1, - "z": 73.65 - }, - "H4": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 41.38, - "y": 11.1, - "z": 73.65 - }, - "A5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 74.1, - "z": 73.65 - }, - "B5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 65.1, - "z": 73.65 - }, - "C5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 56.1, - "z": 73.65 - }, - "D5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 47.1, - "z": 73.65 - }, - "E5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 38.1, - "z": 73.65 - }, - "F5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 29.1, - "z": 73.65 - }, - "G5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 20.1, - "z": 73.65 - }, - "H5": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 50.38, - "y": 11.1, - "z": 73.65 - }, - "A6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 74.1, - "z": 73.65 - }, - "B6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 65.1, - "z": 73.65 - }, - "C6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 56.1, - "z": 73.65 - }, - "D6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 47.1, - "z": 73.65 - }, - "E6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 38.1, - "z": 73.65 - }, - "F6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 29.1, - "z": 73.65 - }, - "G6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 20.1, - "z": 73.65 - }, - "H6": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 59.38, - "y": 11.1, - "z": 73.65 - }, - "A7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 74.1, - "z": 73.65 - }, - "B7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 65.1, - "z": 73.65 - }, - "C7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 56.1, - "z": 73.65 - }, - "D7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 47.1, - "z": 73.65 - }, - "E7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 38.1, - "z": 73.65 - }, - "F7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 29.1, - "z": 73.65 - }, - "G7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 20.1, - "z": 73.65 - }, - "H7": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 68.38, - "y": 11.1, - "z": 73.65 - }, - "A8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 74.1, - "z": 73.65 - }, - "B8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 65.1, - "z": 73.65 - }, - "C8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 56.1, - "z": 73.65 - }, - "D8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 47.1, - "z": 73.65 - }, - "E8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 38.1, - "z": 73.65 - }, - "F8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 29.1, - "z": 73.65 - }, - "G8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 20.1, - "z": 73.65 - }, - "H8": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 77.38, - "y": 11.1, - "z": 73.65 - }, - "A9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 74.1, - "z": 73.65 - }, - "B9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 65.1, - "z": 73.65 - }, - "C9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 56.1, - "z": 73.65 - }, - "D9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 47.1, - "z": 73.65 - }, - "E9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 38.1, - "z": 73.65 - }, - "F9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 29.1, - "z": 73.65 - }, - "G9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 20.1, - "z": 73.65 - }, - "H9": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 86.38, - "y": 11.1, - "z": 73.65 - }, - "A10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 74.1, - "z": 73.65 - }, - "B10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 65.1, - "z": 73.65 - }, - "C10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 56.1, - "z": 73.65 - }, - "D10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 47.1, - "z": 73.65 - }, - "E10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 38.1, - "z": 73.65 - }, - "F10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 29.1, - "z": 73.65 - }, - "G10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 20.1, - "z": 73.65 - }, - "H10": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 95.38, - "y": 11.1, - "z": 73.65 - }, - "A11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 74.1, - "z": 73.65 - }, - "B11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 65.1, - "z": 73.65 - }, - "C11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 56.1, - "z": 73.65 - }, - "D11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 47.1, - "z": 73.65 - }, - "E11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 38.1, - "z": 73.65 - }, - "F11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 29.1, - "z": 73.65 - }, - "G11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 20.1, - "z": 73.65 - }, - "H11": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 104.38, - "y": 11.1, - "z": 73.65 - }, - "A12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 74.1, - "z": 73.65 - }, - "B12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 65.1, - "z": 73.65 - }, - "C12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 56.1, - "z": 73.65 - }, - "D12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 47.1, - "z": 73.65 - }, - "E12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 38.1, - "z": 73.65 - }, - "F12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 29.1, - "z": 73.65 - }, - "G12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 20.1, - "z": 73.65 - }, - "H12": { - "depth": 58.35, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.59, - "x": 113.38, - "y": 11.1, - "z": 73.65 - } - }, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "96Standard", - "quirks": [], - "isTiprack": true, - "tipLength": 58.35, - "tipOverlap": 10.5, - "isMagneticModuleCompatible": false, - "loadName": "opentrons_flex_96_tiprack_200ul_adp" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} diff --git a/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_50ul_adp/1.json b/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_50ul_adp/1.json deleted file mode 100644 index a4d1b339097..00000000000 --- a/hardware-testing/hardware_testing/labware/opentrons_flex_96_tiprack_50ul_adp/1.json +++ /dev/null @@ -1,1017 +0,0 @@ -{ - "ordering": [ - ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], - ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], - ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], - ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], - ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], - ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], - ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], - ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], - ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], - ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], - ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], - ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] - ], - "brand": { - "brand": "ryantrons OT-3", - "brandId": [] - }, - "metadata": { - "displayName": "Opentrons Flex 96 Tip Rack 50 µL with adapter", - "displayCategory": "tipRack", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.48, - "zDimension": 132 - }, - "wells": { - "A1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 74.1, - "z": 74.1 - }, - "B1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 65.1, - "z": 74.1 - }, - "C1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 56.1, - "z": 74.1 - }, - "D1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 47.1, - "z": 74.1 - }, - "E1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 38.1, - "z": 74.1 - }, - "F1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 29.1, - "z": 74.1 - }, - "G1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 20.1, - "z": 74.1 - }, - "H1": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 14.38, - "y": 11.1, - "z": 74.1 - }, - "A2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 74.1, - "z": 74.1 - }, - "B2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 65.1, - "z": 74.1 - }, - "C2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 56.1, - "z": 74.1 - }, - "D2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 47.1, - "z": 74.1 - }, - "E2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 38.1, - "z": 74.1 - }, - "F2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 29.1, - "z": 74.1 - }, - "G2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 20.1, - "z": 74.1 - }, - "H2": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 23.38, - "y": 11.1, - "z": 74.1 - }, - "A3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 74.1, - "z": 74.1 - }, - "B3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 65.1, - "z": 74.1 - }, - "C3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 56.1, - "z": 74.1 - }, - "D3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 47.1, - "z": 74.1 - }, - "E3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 38.1, - "z": 74.1 - }, - "F3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 29.1, - "z": 74.1 - }, - "G3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 20.1, - "z": 74.1 - }, - "H3": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 32.38, - "y": 11.1, - "z": 74.1 - }, - "A4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 74.1, - "z": 74.1 - }, - "B4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 65.1, - "z": 74.1 - }, - "C4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 56.1, - "z": 74.1 - }, - "D4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 47.1, - "z": 74.1 - }, - "E4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 38.1, - "z": 74.1 - }, - "F4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 29.1, - "z": 74.1 - }, - "G4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 20.1, - "z": 74.1 - }, - "H4": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 41.38, - "y": 11.1, - "z": 74.1 - }, - "A5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 74.1, - "z": 74.1 - }, - "B5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 65.1, - "z": 74.1 - }, - "C5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 56.1, - "z": 74.1 - }, - "D5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 47.1, - "z": 74.1 - }, - "E5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 38.1, - "z": 74.1 - }, - "F5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 29.1, - "z": 74.1 - }, - "G5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 20.1, - "z": 74.1 - }, - "H5": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 50.38, - "y": 11.1, - "z": 74.1 - }, - "A6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 74.1, - "z": 74.1 - }, - "B6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 65.1, - "z": 74.1 - }, - "C6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 56.1, - "z": 74.1 - }, - "D6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 47.1, - "z": 74.1 - }, - "E6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 38.1, - "z": 74.1 - }, - "F6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 29.1, - "z": 74.1 - }, - "G6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 20.1, - "z": 74.1 - }, - "H6": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 59.38, - "y": 11.1, - "z": 74.1 - }, - "A7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 74.1, - "z": 74.1 - }, - "B7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 65.1, - "z": 74.1 - }, - "C7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 56.1, - "z": 74.1 - }, - "D7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 47.1, - "z": 74.1 - }, - "E7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 38.1, - "z": 74.1 - }, - "F7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 29.1, - "z": 74.1 - }, - "G7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 20.1, - "z": 74.1 - }, - "H7": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 68.38, - "y": 11.1, - "z": 74.1 - }, - "A8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 74.1, - "z": 74.1 - }, - "B8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 65.1, - "z": 74.1 - }, - "C8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 56.1, - "z": 74.1 - }, - "D8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 47.1, - "z": 74.1 - }, - "E8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 38.1, - "z": 74.1 - }, - "F8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 29.1, - "z": 74.1 - }, - "G8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 20.1, - "z": 74.1 - }, - "H8": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 77.38, - "y": 11.1, - "z": 74.1 - }, - "A9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 74.1, - "z": 74.1 - }, - "B9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 65.1, - "z": 74.1 - }, - "C9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 56.1, - "z": 74.1 - }, - "D9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 47.1, - "z": 74.1 - }, - "E9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 38.1, - "z": 74.1 - }, - "F9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 29.1, - "z": 74.1 - }, - "G9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 20.1, - "z": 74.1 - }, - "H9": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 86.38, - "y": 11.1, - "z": 74.1 - }, - "A10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 74.1, - "z": 74.1 - }, - "B10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 65.1, - "z": 74.1 - }, - "C10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 56.1, - "z": 74.1 - }, - "D10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 47.1, - "z": 74.1 - }, - "E10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 38.1, - "z": 74.1 - }, - "F10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 29.1, - "z": 74.1 - }, - "G10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 20.1, - "z": 74.1 - }, - "H10": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 95.38, - "y": 11.1, - "z": 74.1 - }, - "A11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 74.1, - "z": 74.1 - }, - "B11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 65.1, - "z": 74.1 - }, - "C11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 56.1, - "z": 74.1 - }, - "D11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 47.1, - "z": 74.1 - }, - "E11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 38.1, - "z": 74.1 - }, - "F11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 29.1, - "z": 74.1 - }, - "G11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 20.1, - "z": 74.1 - }, - "H11": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 104.38, - "y": 11.1, - "z": 74.1 - }, - "A12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 74.1, - "z": 74.1 - }, - "B12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 65.1, - "z": 74.1 - }, - "C12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 56.1, - "z": 74.1 - }, - "D12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 47.1, - "z": 74.1 - }, - "E12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 38.1, - "z": 74.1 - }, - "F12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 29.1, - "z": 74.1 - }, - "G12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 20.1, - "z": 74.1 - }, - "H12": { - "depth": 57.9, - "totalLiquidVolume": 50, - "shape": "circular", - "diameter": 5.58, - "x": 113.38, - "y": 11.1, - "z": 74.1 - } - }, - "groups": [ - { - "metadata": {}, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "96Standard", - "quirks": [], - "isTiprack": true, - "tipLength": 57.9, - "tipOverlap": 10.5, - "isMagneticModuleCompatible": false, - "loadName": "opentrons_flex_96_tiprack_50ul_adp" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} diff --git a/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py b/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py index 4beae74bdd9..f277ff93f76 100644 --- a/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py +++ b/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py @@ -113,7 +113,7 @@ def _create_fake_pipette_id(mount: OT3Mount, model: Optional[str]) -> Optional[s assert len(items) == 3 size = "P1K" if items[0] == "p1000" else "P50" channels = "S" if items[1] == "single" else "M" - version = items[2].upper().replace(".", "") + version = 35 # model names don't have a version so just fake a 3.5 version date = datetime.now().strftime("%y%m%d") unique_number = 1 if mount == OT3Mount.LEFT else 2 return f"{size}{channels}{version}{date}A0{unique_number}" diff --git a/hardware-testing/hardware_testing/protocols/gravimetric_lpc/gravimetric/gravimetric_ot3_p1000_96.py b/hardware-testing/hardware_testing/protocols/gravimetric_lpc/gravimetric/gravimetric_ot3_p1000_96.py index e4901928a34..6fe882f5370 100644 --- a/hardware-testing/hardware_testing/protocols/gravimetric_lpc/gravimetric/gravimetric_ot3_p1000_96.py +++ b/hardware-testing/hardware_testing/protocols/gravimetric_lpc/gravimetric/gravimetric_ot3_p1000_96.py @@ -1,5 +1,6 @@ """Photometric OT3 P1000.""" from opentrons.protocol_api import ProtocolContext +from opentrons.protocol_api._types import OffDeckType metadata = {"protocolName": "gravimetric-ot3-p1000-96"} requirements = {"robotType": "Flex", "apiLevel": "2.15"} @@ -8,24 +9,34 @@ SLOTS_TIPRACK = { # TODO: add slot 12 when tipracks are disposable 50: [2, 3, 5, 6, 7, 8, 9, 10, 11], - 200: [2, 3, 5, 6, 7, 8, 9, 10, 11], # NOTE: ignored during calibration - 1000: [2, 3, 5, 6, 7, 8, 9, 10, 11], # NOTE: ignored during calibration + 200: [2, 3, 5, 6, 7, 8, 9, 10, 11], + 1000: [2, 3, 5, 6, 7, 8, 9, 10, 11], } LABWARE_ON_SCALE = "nest_1_reservoir_195ml" def run(ctx: ProtocolContext) -> None: """Run.""" - tipracks = [ - ctx.load_labware(f"opentrons_flex_96_tiprack_{size}uL_adp", slot) - for size, slots in SLOTS_TIPRACK.items() - for slot in slots - if size == 50 # only calibrate 50ul tip-racks - ] scale_labware = ctx.load_labware(LABWARE_ON_SCALE, SLOT_SCALE) pipette = ctx.load_instrument("flex_96channel_1000", "left") - for rack in tipracks: - pipette.pick_up_tip(rack["A1"]) - pipette.aspirate(10, scale_labware["A1"].top()) - pipette.dispense(10, scale_labware["A1"].top()) - pipette.drop_tip(home_after=False) + adapters = [ + ctx.load_adapter("opentrons_flex_96_tiprack_adapter", slot) + for slot in SLOTS_TIPRACK[50] + ] + for tip_size in SLOTS_TIPRACK.keys(): + tipracks = [ + adapter.load_labware(f"opentrons_flex_96_tiprack_{tip_size}uL") + for adapter in adapters + ] + for rack in tipracks: + pipette.pick_up_tip(rack) + pipette.aspirate(10, scale_labware["A1"].top()) + pipette.dispense(10, scale_labware["A1"].top()) + pipette.drop_tip(home_after=False) + + for rack in tipracks: + ctx.move_labware( + rack, + new_location=OffDeckType.OFF_DECK, + use_gripper=False, + ) diff --git a/hardware-testing/hardware_testing/protocols/gravimetric_lpc/photometric/photometric_ot3_p1000_96.py b/hardware-testing/hardware_testing/protocols/gravimetric_lpc/photometric/photometric_ot3_p1000_96.py index 4be97d86289..2cb4dcc1daf 100644 --- a/hardware-testing/hardware_testing/protocols/gravimetric_lpc/photometric/photometric_ot3_p1000_96.py +++ b/hardware-testing/hardware_testing/protocols/gravimetric_lpc/photometric/photometric_ot3_p1000_96.py @@ -1,12 +1,13 @@ """Photometric OT3 P1000.""" from opentrons.protocol_api import ProtocolContext +from opentrons.protocol_api._types import OffDeckType metadata = {"protocolName": "photometric-ot3-p1000-96"} requirements = {"robotType": "Flex", "apiLevel": "2.15"} SLOTS_TIPRACK = { 50: [5, 6, 8, 9, 11], - 200: [5, 6, 8, 9, 11], # NOTE: ignoring this tip-rack during run() method + 200: [5, 6, 8, 9, 11], } SLOT_PLATE = 3 SLOT_RESERVOIR = 2 @@ -17,20 +18,27 @@ def run(ctx: ProtocolContext) -> None: """Run.""" - tipracks = [ - # FIXME: use official tip-racks once available - ctx.load_labware( - f"opentrons_flex_96_tiprack_{size}uL_adp", slot, namespace="custom_beta" - ) - for size, slots in SLOTS_TIPRACK.items() - for slot in slots - if size == 50 # only calibrate 50ul tips for 96ch test - ] reservoir = ctx.load_labware(RESERVOIR_LABWARE, SLOT_RESERVOIR) plate = ctx.load_labware(PHOTOPLATE_LABWARE, SLOT_PLATE) pipette = ctx.load_instrument("flex_96channel_1000", "left") - for rack in tipracks: - pipette.pick_up_tip(rack["A1"]) - pipette.aspirate(10, reservoir["A1"].top()) - pipette.dispense(10, plate["A1"].top()) - pipette.drop_tip(home_after=False) + adapters = [ + ctx.load_adapter("opentrons_flex_96_tiprack_adapter", slot) + for slot in SLOTS_TIPRACK[50] + ] + for tip_size in SLOTS_TIPRACK.keys(): + tipracks = [ + adapter.load_labware(f"opentrons_flex_96_tiprack_{tip_size}uL") + for adapter in adapters + ] + for rack in tipracks: + pipette.pick_up_tip(rack) + pipette.aspirate(10, reservoir["A1"].top()) + pipette.dispense(10, plate["A1"].top()) + pipette.drop_tip(home_after=False) + + for rack in tipracks: + ctx.move_labware( + rack, + new_location=OffDeckType.OFF_DECK, + use_gripper=False, + ) diff --git a/hardware-testing/tests/hardware_testing/liquid/test_heights.py b/hardware-testing/tests/hardware_testing/liquid/test_heights.py index ab73b54618c..39efb419e65 100644 --- a/hardware-testing/tests/hardware_testing/liquid/test_heights.py +++ b/hardware-testing/tests/hardware_testing/liquid/test_heights.py @@ -17,7 +17,7 @@ def _create_context() -> ProtocolContext: - return get_api_context(api_level="2.13", is_simulating=True) + return get_api_context(api_level="2.16", is_simulating=True) def _load_labware(ctx: ProtocolContext) -> Tuple[Labware, Labware, Labware, Labware]: